class Scene: def __init__(self, positions, main): self._players = [ Player("Ninja", "ninja", positions[1], self, 0), Player("Pirate", "pirate", positions[0], self, 1) ] self._collision = Collision(self._players[0], self._players[1]) self._eventOccured = [ False, False ] self._soundManager = SoundManager() self._elapsedTime = 0; self.main = main def _decelerate(self, playerIndex, elapsedTime, ratio=1.0): player = self._players[playerIndex] for i in range(0,2): speed = player.speed()[i] if speed < epsilon and speed > -epsilon: speed = 0 else: if speed > 0: speed -= (acceleration + deceleration) * elapsedTime * ratio else: speed += (acceleration + deceleration) * elapsedTime * ratio player.setSpeed(speed, i) def newFrame(self, elapsedTime): for playerIndex in range(0, 2): player = self._players[playerIndex] if not self._eventOccured[playerIndex]: if player.isJumping: ratio = 0.5 else: ratio = 1.0 self._decelerate(playerIndex, elapsedTime, ratio) self._eventOccured = [ False, False ] self._elapsedTime = elapsedTime for player in self._players: player.update(elapsedTime) for playerIndex in range(0, 2): self._collision.moveForward(playerIndex, self._players[playerIndex].speed()[0] * self._elapsedTime) self._collision.moveSide(playerIndex, self._players[playerIndex].speed()[1] * self._elapsedTime) def _move(self, playerIndex, elapsedTime, axe, delta): self._eventOccured[playerIndex] = True accel = delta * elapsedTime * acceleration decel = delta * elapsedTime * deceleration self._decelerate(playerIndex, elapsedTime, 0.08) consMaxSpeed = maxSpeed if axe == 1: dist = 0.5 + (self._collision.getDistance() / maxDist) / 2 consMaxSpeed *= dist if delta * self._players[playerIndex].speed()[axe] < 0: if axe == 0: self._players[playerIndex].incrementSpeed(accel + decel, 0) else: self._players[playerIndex].incrementSpeed(0, decel + accel) if delta * self._players[playerIndex].speed()[axe] < consMaxSpeed: if axe == 0: self._players[playerIndex].incrementSpeed(accel, 0) else: self._players[playerIndex].incrementSpeed(0, accel) if delta * self._players[playerIndex].speed()[axe] > consMaxSpeed: self._players[playerIndex].setSpeed(delta * consMaxSpeed, axe) def moveForward(self, playerIndex, elapsedTime): isJumping = self._players[playerIndex].isJumping() if isJumping: self._decelerate(playerIndex, elapsedTime, 0.15) elapsedTime /= 1.8 self._move(playerIndex, elapsedTime, 0, 1) def moveBackward(self, playerIndex, elapsedTime): isJumping = self._players[playerIndex].isJumping() if isJumping: self._decelerate(playerIndex, elapsedTime, 0.15) elapsedTime /= 1.8 self._move(playerIndex, elapsedTime, 0, -1) def moveRight(self, playerIndex, elapsedTime): isJumping = self._players[playerIndex].isJumping() if isJumping: self._decelerate(playerIndex, elapsedTime, 0.25) elapsedTime /= 2.5 self._move(playerIndex, elapsedTime, 1, 1) def moveLeft(self, playerIndex, elapsedTime): isJumping = self._players[playerIndex].isJumping() if isJumping: self._decelerate(playerIndex, elapsedTime, 0.25) elapsedTime /= 2.5 self._move(playerIndex, elapsedTime, 1, -1) def jump(self, playerIndex, elapsedTime): self._players[playerIndex].jump(elapsedTime) def attack(self, playerIndex, elapsedTime): self._players[playerIndex].attack(elapsedTime, self._collision.getDistance()) def getOtherPlayer(self, player): if player == self._players[0]: return self._players[1] else: return self._players[0] def getPlayer(self, playerId): """ retourne le joueur playerId. playerId vaut 0 ou 1 """ return self._players[playerId] def getCollision(self): return self._collision def introEnd(self): self._soundManager.introEnd() def getSoundManager(self): return self._soundManager;