| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- from direct.showbase.InputStateGlobal import inputState
- from direct.task.Task import Task
- from pandac.PandaModules import *
- from . import GravityWalker
- BattleStrafe = 0
- def ToggleStrafe():
- global BattleStrafe
- BattleStrafe = not BattleStrafe
- def SetStrafe(status):
- global BattleStrafe
- BattleStrafe = status
- class BattleWalker(GravityWalker.GravityWalker):
- def __init__(self):
- GravityWalker.GravityWalker.__init__(self)
- self.slideSpeed = 0
- self.advanceSpeed = 0
- def getSpeeds(self):
- return (self.speed, self.rotationSpeed, self.slideSpeed, self.advanceSpeed)
- def handleAvatarControls(self, task):
- """
- Check on the arrow keys and update the avatar.
- """
- # get the button states:
- run = inputState.isSet("run")
- forward = inputState.isSet("forward")
- reverse = inputState.isSet("reverse")
- turnLeft = inputState.isSet("turnLeft")
- turnRight = inputState.isSet("turnRight")
- slideLeft = inputState.isSet("slideLeft")
- slideRight = inputState.isSet("slideRight")
- jump = inputState.isSet("jump")
- # Check for Auto-Run
- if base.localAvatar.getAutoRun():
- forward = 1
- reverse = 0
- # Determine what the speeds are based on the buttons:
- self.speed=(forward and self.avatarControlForwardSpeed or
- reverse and -self.avatarControlReverseSpeed)
- # Slide speed is a scaled down version of forward speed
- self.slideSpeed=(slideLeft and -self.avatarControlForwardSpeed or
- slideRight and self.avatarControlForwardSpeed) * 0.5
- self.rotationSpeed=not (slideLeft or slideRight) and (
- (turnLeft and self.avatarControlRotateSpeed) or
- (turnRight and -self.avatarControlRotateSpeed))
- debugRunning = inputState.isSet("debugRunning")
- if(debugRunning):
- self.speed*=base.debugRunningMultiplier
- self.slideSpeed*=base.debugRunningMultiplier
- self.rotationSpeed*=1.25
- if self.needToDeltaPos:
- self.setPriorParentVector()
- self.needToDeltaPos = 0
- if self.wantDebugIndicator:
- self.displayDebugInfo()
- if self.lifter.isOnGround():
- if self.isAirborne:
- self.isAirborne = 0
- assert self.debugPrint("isAirborne 0 due to isOnGround() true")
- impact = self.lifter.getImpactVelocity()
- if impact < -30.0:
- messenger.send("jumpHardLand")
- self.startJumpDelay(0.3)
- else:
- messenger.send("jumpLand")
- if impact < -5.0:
- self.startJumpDelay(0.2)
- # else, ignore the little potholes.
- assert self.isAirborne == 0
- self.priorParent = Vec3.zero()
- if jump and self.mayJump:
- # The jump button is down and we're close
- # enough to the ground to jump.
- self.lifter.addVelocity(self.avatarControlJumpForce)
- messenger.send("jumpStart")
- self.isAirborne = 1
- assert self.debugPrint("isAirborne 1 due to jump")
- else:
- if self.isAirborne == 0:
- assert self.debugPrint("isAirborne 1 due to isOnGround() false")
- self.isAirborne = 1
- self.__oldPosDelta = self.avatarNodePath.getPosDelta(render)
- # How far did we move based on the amount of time elapsed?
- self.__oldDt = ClockObject.getGlobalClock().getDt()
- dt=self.__oldDt
- # Check to see if we're moving at all:
- self.moving = self.speed or self.slideSpeed or self.rotationSpeed or (self.priorParent!=Vec3.zero())
- if self.moving:
- distance = dt * self.speed
- slideDistance = dt * self.slideSpeed
- rotation = dt * self.rotationSpeed
- # Take a step in the direction of our previous heading.
- if distance or slideDistance or self.priorParent != Vec3.zero():
- # rotMat is the rotation matrix corresponding to
- # our previous heading.
- rotMat=Mat3.rotateMatNormaxis(self.avatarNodePath.getH(), Vec3.up())
- if self.isAirborne:
- forward = Vec3.forward()
- else:
- contact = self.lifter.getContactNormal()
- forward = contact.cross(Vec3.right())
- # Consider commenting out this normalize. If you do so
- # then going up and down slops is a touch slower and
- # steeper terrain can cut the movement in half. Without
- # the normalize the movement is slowed by the cosine of
- # the slope (i.e. it is multiplied by the sign as a
- # side effect of the cross product above).
- forward.normalize()
- self.vel=Vec3(forward * distance)
- if slideDistance:
- if self.isAirborne:
- right = Vec3.right()
- else:
- right = forward.cross(contact)
- # See note above for forward.normalize()
- right.normalize()
- self.vel=Vec3(self.vel + (right * slideDistance))
- self.vel=Vec3(rotMat.xform(self.vel))
- step=self.vel + (self.priorParent * dt)
- self.avatarNodePath.setFluidPos(Point3(
- self.avatarNodePath.getPos()+step))
- self.avatarNodePath.setH(self.avatarNodePath.getH()+rotation)
- else:
- self.vel.set(0.0, 0.0, 0.0)
- if self.moving or jump:
- messenger.send("avatarMoving")
- return Task.cont
- if 0:
- def handleAvatarControls(self, task):
- # If targetNp is not available, revert back to GravityWalker.handleAvatarControls.
- # This situation occurs when the target dies, but we aren't switched out of
- # battle walker control mode.
- targetNp = self.avatarNodePath.currentTarget
- if not BattleStrafe or targetNp == None or targetNp.isEmpty():
- return GravityWalker.GravityWalker.handleAvatarControls(self, task)
- # get the button states:
- run = inputState.isSet("run")
- forward = inputState.isSet("forward")
- reverse = inputState.isSet("reverse")
- turnLeft = inputState.isSet("turnLeft")
- turnRight = inputState.isSet("turnRight")
- slide = inputState.isSet("slide")
- jump = inputState.isSet("jump")
- # Determine what the speeds are based on the buttons:
- self.advanceSpeed=(forward and self.avatarControlForwardSpeed or
- reverse and -self.avatarControlReverseSpeed)
- if run and self.advanceSpeed>0.0:
- self.advanceSpeed*=2.0 #*#
- # Should fSlide be renamed slideButton?
- self.slideSpeed=.15*(turnLeft and -self.avatarControlForwardSpeed or
- turnRight and self.avatarControlForwardSpeed)
- print('slideSpeed: %s' % self.slideSpeed)
- self.rotationSpeed=0
- self.speed=0
- debugRunning = inputState.isSet("debugRunning")
- if debugRunning:
- self.advanceSpeed*=4.0
- self.slideSpeed*=4.0
- self.rotationSpeed*=1.25
- if self.needToDeltaPos:
- self.setPriorParentVector()
- self.needToDeltaPos = 0
- if self.wantDebugIndicator:
- self.displayDebugInfo()
- if self.lifter.isOnGround():
- if self.isAirborne:
- self.isAirborne = 0
- assert self.debugPrint("isAirborne 0 due to isOnGround() true")
- impact = self.lifter.getImpactVelocity()
- if impact < -30.0:
- messenger.send("jumpHardLand")
- self.startJumpDelay(0.3)
- else:
- messenger.send("jumpLand")
- if impact < -5.0:
- self.startJumpDelay(0.2)
- # else, ignore the little potholes.
- assert self.isAirborne == 0
- self.priorParent = Vec3.zero()
- if jump and self.mayJump:
- # The jump button is down and we're close
- # enough to the ground to jump.
- self.lifter.addVelocity(self.avatarControlJumpForce)
- messenger.send("jumpStart")
- self.isAirborne = 1
- assert self.debugPrint("isAirborne 1 due to jump")
- else:
- if self.isAirborne == 0:
- assert self.debugPrint("isAirborne 1 due to isOnGround() false")
- self.isAirborne = 1
- self.__oldPosDelta = self.avatarNodePath.getPosDelta(render)
- # How far did we move based on the amount of time elapsed?
- self.__oldDt = ClockObject.getGlobalClock().getDt()
- dt=self.__oldDt
- # Before we do anything with position or orientation, make the avatar
- # face it's target. Only allow rMax degrees rotation per frame, so
- # we don't get an unnatural spinning effect
- curH = self.avatarNodePath.getH()
- self.avatarNodePath.headsUp(targetNp)
- newH = self.avatarNodePath.getH()
- delH = reduceAngle(newH-curH)
- rMax = 10
- if delH < -rMax:
- self.avatarNodePath.setH(curH-rMax)
- self.rotationSpeed=-self.avatarControlRotateSpeed
- elif delH > rMax:
- self.avatarNodePath.setH(curH+rMax)
- self.rotationSpeed=self.avatarControlRotateSpeed
- # Check to see if we're moving at all:
- self.moving = self.speed or self.slideSpeed or self.rotationSpeed or (self.priorParent!=Vec3.zero())
- if self.moving:
- distance = dt * self.speed
- slideDistance = dt * self.slideSpeed
- print('slideDistance: %s' % slideDistance)
- rotation = dt * self.rotationSpeed
- # Take a step in the direction of our previous heading.
- self.vel=Vec3(Vec3.forward() * distance +
- Vec3.right() * slideDistance)
- if self.vel != Vec3.zero() or self.priorParent != Vec3.zero():
- if 1:
- # rotMat is the rotation matrix corresponding to
- # our previous heading.
- rotMat=Mat3.rotateMatNormaxis(self.avatarNodePath.getH(), Vec3.up())
- step=(self.priorParent * dt) + rotMat.xform(self.vel)
- self.avatarNodePath.setFluidPos(Point3(
- self.avatarNodePath.getPos()+step))
- self.avatarNodePath.setH(self.avatarNodePath.getH()+rotation)
- else:
- self.vel.set(0.0, 0.0, 0.0)
- """
- # Check to see if we're moving at all:
- self.moving = self.advanceSpeed or self.slideSpeed or self.rotationSpeed or (self.priorParent!=Vec3.zero())
- if self.moving:
- distance = dt * self.advanceSpeed
- slideDistance = dt * self.slideSpeed
- rotation = dt * self.rotationSpeed
- # Prevent avatar from getting too close to target
- d = self.avatarNodePath.getPos(targetNp)
- # TODO: make min distance adjust for current weapon
- if (d[0]*d[0]+d[1]*d[1] < 6.0 and distance > 0):
- # move the avatar sideways instead of forward
- slideDistance += .2
- distance = 0
- # Take a step in the direction of our previous heading.
- self.vel=Vec3(Vec3.forward() * distance +
- Vec3.right() * slideDistance)
- if self.vel != Vec3.zero() or self.priorParent != Vec3.zero():
- # rotMat is the rotation matrix corresponding to
- # our previous heading.
- rotMat=Mat3.rotateMatNormaxis(self.avatarNodePath.getH(), Vec3.up())
- step=rotMat.xform(self.vel) + (self.priorParent * dt)
- self.avatarNodePath.setFluidPos(Point3(
- self.avatarNodePath.getPos()+step))
- self.avatarNodePath.setH(self.avatarNodePath.getH()+rotation)
- else:
- self.vel.set(0.0, 0.0, 0.0)
- """
- if self.moving or jump:
- messenger.send("avatarMoving")
- return Task.cont
|