Hello everyone, I am trying to figure out what algorithm can work when moving left or right when I have a moveable object that can move in 360 degrees in any directions, even turning. My code is influenced by azizalbastaki’s code:
from direct.showbase.ShowBase import ShowBase
from direct.task import Task
from panda3d.core import Vec3
import math
class Game(ShowBase):
def __init__(self):
super().__init__()
base.disableMouse()
self.heading = 0
environment = loader.loadModel("models/environment")
environment.reparentTo(render)
self.object = loader.loadModel("models/box")
self.object.setScale(10, 10, 10)
self.object.setPos(30, -160, 1)
self.object.reparentTo(render)
self.camera.setPos(35, -250, 50)
self.camera.setHpr(0, -20, 0)
self.playerKeyControl = {
"up" : False,
"down" : False,
"left" : False,
"right" : False,
"left-turn" : False,
"right-turn" : False}
taskMgr.add(self.CheckControl, "CheckControl")
taskMgr.add(self.Update, 'Update')
def CheckControl(self, task):
base.accept('w', self.UpdateControl, ["up", True])
base.accept('w-up', self.UpdateControl, ["up", False])
base.accept('s', self.UpdateControl, ["down", True])
base.accept('s-up', self.UpdateControl, ["down", False])
base.accept('a', self.UpdateControl, ["left", True])
base.accept('a-up', self.UpdateControl, ["left", False])
base.accept('d', self.UpdateControl, ["right", True])
base.accept('d-up', self.UpdateControl, ["right", False])
base.accept('q', self.UpdateControl, ["left-turn", True])
base.accept('q-up', self.UpdateControl, ["left-turn", False])
base.accept('e', self.UpdateControl, ["right-turn", True])
base.accept('e-up', self.UpdateControl, ["right-turn", False])
return Task.cont
def UpdateControl(self, controlName, controlState):
self.playerKeyControl[controlName] = controlState
def Update(self, task):
dt = globalClock.getDt()
if self.playerKeyControl["up"]:
self.object.setPos(self.object.getPos() + Vec3(30 * dt *
(-math.sin(math.radians(self.heading))),
30 * dt * (math.cos(math.radians(self.heading))), 0))
if self.playerKeyControl["down"]:
self.object.setPos(self.object.getPos() + Vec3(30 * dt *
(math.sin(math.radians(self.heading))),
-30 * dt * (math.cos(math.radians(self.heading))), 0))
if self.playerKeyControl["left"]:
self.object.setPos(30 * dt , 0, 0) # <--- What algorithm for left?
if self.playerKeyControl["right"]:
self.object.setPos(-30 * dt, 0, 0) # <--- What algorithm for right?
if self.playerKeyControl["left-turn"]:
self.heading += 1
self.object.setH(self.heading)
if self.playerKeyControl["right-turn"]:
self.heading -= 1
self.object.setH(self.heading)
if self.heading > 360:
self.heading -= 360
elif self.heading < 0:
self.heading += 360
return Task.cont
game = Game()
game.run()