I’ve noticed I’m now the last three posts in scripting issues… not sure if that’s a bad thing or not. Anyway.
I’m scripting a character controller and I want, when the player moves forward pressing ‘W’, to be able to toggle the speed by pressing ‘Q’. So if the player is walking, and they press q, they will start running, then sprinting, then back to running, then walking.
In diagram: Walking <–> Running <–> Sprinting
I’m struggling with getting the event handlers and the methods to line up correctly, trying to place event handlers in the methods leads to the following error:
method not callable in accept (ignoring)
class DragonPlayer(gameobject.GameObject):
def __init__(self):
super().__init__(1000)
self.actor = Actor('low_poly_dragon.egg',{
'Idle':'low_poly_dragon-Idle.egg',
'Walk':'low_poly_dragon-Walk.egg',
'Run':'low_poly_dragon-Run.egg',
'Sprint':'low_poly_dragon-Sprint.egg',
'Flap':'low_poly_dragon-Flap.egg',
'Glide':'low_poly_dragon-Glide.egg'})
camera = base.camera
base.disableMouse()
camera.reparentTo(self.actor)
camera.setPos(self.actor, 0, 40, 30)
camera.setH(180)
camera.setP(-30)
texture = loader.loadTexture('home_background.JPG')
self.actor.setTexture(texture)
self.actor.setPos(100,100,200)
self.actor.reparentTo(render)
self.actor.loop("Idle")
PlayerControls(self.actor)
def movePlayer(self, task):
actor = self.actor
startpos = actor.getPos()
class PlayerControls():
def __init__(self, player):
self.player = player
self.walkForce = 10
self.runForce = 20
self.sprintForce = 40
self.jumpForce = 50
self.flapForce = 100
running = False
sprinting = False
bnode = BulletRigidBodyNode("player")
self.player.attachNewNode(bnode)
player.accept("w", self.move)
#player.accept("a", self.move)
#player.accept("s", self. move)
#player.accept("d", self.move)
#player.accept("space-repeat", self.move)
#player.accept("space-up", self.move)
player.accept("q", self.togglespeed)
def move(self):
player = self.player
if player.accept('w', self):
#run
if running:
player.loop("Run")
#sprint
elif sprinting:
player.loop('Sprint')
#walk
else:
player.loop('Walk')
def togglespeed(self):
player = self.player
if player.accept('q', self):
running = not running
if q and running:
sprinting = not sprinting