Ejemplo n.º 1
0
 def __init__(self, parent):
     self._parent = parent
     self._joystickState = None
     self._lastJoystickMove = None
     self._moveCalculator = parent.moveCalculator
     self._moveState = PlayerMoveState.Standing
     currentMap = ServiceLocator.getGlobalServiceInstance(ServiceNames.Map)
     self._mapScanner = MapScanner(currentMap, parent)
     self._targetPosition = None
     
     pass
Ejemplo n.º 2
0
class MoveStateMachine(object):
    """Player Move State Machine."""
    def __init__(self, parent):
        self._parent = parent
        self._joystickState = None
        self._lastJoystickMove = None
        self._moveCalculator = parent.moveCalculator
        self._moveState = PlayerMoveState.Standing
        currentMap = ServiceLocator.getGlobalServiceInstance(ServiceNames.Map)
        self._mapScanner = MapScanner(currentMap, parent)
        self._targetPosition = None
        
        pass

    def joystickChanged(self, joystick):
        """Joystick state has been changed."""
        time = pygame.time.get_ticks()
        self._lastJoystickMove = time
        self._lastJoystickMove = joystick
        
        self.updateState(time, joystick)
        pass

    def updateState(self, ticks, joystick = None):
        """Check if the move state has changed."""
        if self._moveState in [PlayerMoveState.Standing, PlayerMoveState.StandingLeft, PlayerMoveState.StandingRight]:
            self._checkStanding(ticks, joystick)
        elif self._moveState in [PlayerMoveState.Falling, PlayerMoveState.FallingLeft, PlayerMoveState.FallingRight]:
            self._checkFalling(ticks)
        elif self._moveState in [PlayerMoveState.MoveLeft, PlayerMoveState.MoveRight]:
            self._checkMoving(ticks, joystick)
        elif self._moveState in [PlayerMoveState.JumpLeft, PlayerMoveState.JumpRight, PlayerMoveState.JumpUp]:
            self._checkJumping(ticks)
        elif self._moveState in [PlayerMoveState.ClimbDown, PlayerMoveState.ClimbUp]:
            self._checkClimbing(ticks)
        pass

    def _checkStanding(self, time, joystick):
        if self._mapScanner.getWayToGround() > 1:
            print(self._mapScanner.getWayToGround())
            self._changeToFalling(time)

        if joystick != None:
            if joystick in [JoystickEvents.MoveLeft, JoystickEvents.MoveRight]:
                self._changeToMoving(time, joystick)

            if joystick == JoystickEvents.JumpButton:
                self._changeToJumping(time, joystick)
        pass

    def _checkFalling(self, time):
        
        print("CheckFalling")
        if time >= self._targetPosition[0]:
            # Sprite reached point

            self._changeToStanding(time)
        pass

    def _checkMoving(self, time, joystick):
        print("Check moving")
        if joystick != None:
            if joystick == JoystickEvents.KeyReleased:
                # Update the position
                self._parent.updatePosition(time, self._moveState)
                if self._moveState == PlayerMoveState.MoveLeft:
                    self._moveState = PlayerMoveState.StandingLeft
                elif self._moveState == PlayerMoveState.MoveRight:
                    self._moveState = PlayerMoveState.StandingRight
                else:
                    self._moveState = PlayerMoveState.Standing

            if joystick == JoystickEvents.JumpButton:
                
                self._changeToJumping(time, joystick)
        #check if player can fall down
        if self._mapScanner.getWayToGround() > 1:
            self._changeToFalling(time)
        #check if player crashes into wall
        else:
            if self._moveState == PlayerMoveState.MoveLeft:
                if self._mapScanner.getWayToNextWallOnLeft() > -2:
                    self._parent.updatePosition(time, self._moveState)
                    self._moveState = PlayerMoveState.StandingLeft
            elif self._moveState == PlayerMoveState.MoveRight:
                if self._mapScanner.getWayToNextWallOnRight() < 2:
                    self._parent.updatePosition(time, self._moveState)
                    self._moveState = PlayerMoveState.StandingRight

        pass

    def _checkJumping(self, time):
        # check if timeout
        # if timeout update position and  set state to standing
        print("Check jumping")
        if time >= self._targetPosition[0]:
            # Sprite reached point

            self._changeToStanding(time)
        pass

    def _checkClimbing(self, time):
        pass

    def savePosition(self, time):
        self._parent.savePosition(time)
        pass

    def _changeToFalling(self, time):
        #Calculate falling time
        def calculateBounce(time, sprite):
            fallspeed = sprite.moveCalculator.fallSpeed / 1000
            down = int(self._mapScanner.getWayToGround())
            falltime = int(down // fallspeed)
            result = (time + falltime, (sprite.x, sprite.y + down))
            return result
        
        self.savePosition(time)
        self._targetPosition = calculateBounce(time, self._parent)

        self._moveState = PlayerMoveState.Falling
        pass

    def _changeToStanding(self, time):
        self._parent.x = self._targetPosition[1][0]
        self._parent.y = self._targetPosition[1][1]
        self._targetPosition = None
        if self._moveState in [PlayerMoveState.FallingLeft, PlayerMoveState.JumpLeft, PlayerMoveState.MoveLeft, PlayerMoveState.StandingLeft]:
            self._moveState = PlayerMoveState.StandingLeft
        elif self._moveState in [PlayerMoveState.FallingRight, PlayerMoveState.JumpRight, PlayerMoveState.MoveRight, PlayerMoveState.StandingRight]:
            self._moveState = PlayerMoveState.StandingRight
        else:
            self._moveState = PlayerMoveState.Standing
        pass

    def _changeToMoving(self, time, joystick):
        self._parent.updatePosition(time, self._moveState)
        self._parent.savePosition(time)
        if joystick == JoystickEvents.MoveLeft:
            self._moveState = PlayerMoveState.MoveLeft
        elif joystick == JoystickEvents.MoveRight:
            self._moveState = PlayerMoveState.MoveRight
        pass

    def _changeToJumping(self, time, joystick):
        def calculateBounce(time, sprite, vector):
            jumptime = sprite.moveCalculator.calcJumpTouchdownTime()
            x = sprite.moveCalculator.calcX(jumptime) * vector
            result = (time + jumptime, (sprite.x + x, sprite.y))
            return result

        # update latest position
        self._parent.updatePosition(time, self._moveState)
        self.savePosition(time)
        vector = None
        if self._moveState in [PlayerMoveState.MoveLeft, PlayerMoveState.StandingLeft]:
            vector = -1
            jumpState = PlayerMoveState.JumpLeft
        elif self._moveState in [PlayerMoveState.MoveRight, PlayerMoveState.StandingRight]:
            vector = 1
            jumpState = PlayerMoveState.JumpRight
        #Calculate the jump
        if vector:
            self._targetPosition = calculateBounce(time, self._parent, vector)
            self._moveState = jumpState

        #Change the move state
        pass


    @property
    def moveState(self):
        return self._moveState
    @moveState.setter
    def moveState(self, value):
        self._moveState = value