package org.pokenet.client.backend; import org.lwjgl.util.Timer; import org.pokenet.client.backend.entity.Player; import org.pokenet.client.backend.entity.Player.Direction; public class Animator { private ClientMapMatrix m_mapMatrix; private Timer m_timer; private static final int ANIMATION_INCREMENT = 4; // Sets up calls public Animator(ClientMapMatrix maps) { m_mapMatrix = maps; m_timer = new Timer(); } // Prepares for animation public void animate() { try { while (m_timer.getTime() <= 0.025) Timer.tick(); ClientMap map = m_mapMatrix.getCurrentMap(); if (map != null) { for(int i = 0; i < m_mapMatrix.getPlayers().size(); i++) { animatePlayer(m_mapMatrix.getPlayers().get(i)); } } m_timer.reset(); } catch (Exception e) { m_timer.reset(); } } /** * Animates players moving * @param p */ private void animatePlayer(Player p) { /* * Check if we need to move the player */ if(p.requiresMovement()) { switch(p.getNextMovement()) { case Down: if(p.getDirection() == Direction.Down) p.setServerY(p.getY() + 32); else { p.setDirection(Direction.Down); p.loadSpriteImage(); } break; case Left: if(p.getDirection() == Direction.Left) p.setServerX(p.getX() - 32); else { p.setDirection(Direction.Left); p.loadSpriteImage(); } break; case Right: if(p.getDirection() == Direction.Right) p.setServerX(p.getX() + 32); else { p.setDirection(Direction.Right); p.loadSpriteImage(); } break; case Up: if(p.getDirection() == Direction.Up) p.setServerY(p.getY() - 32); else { p.setDirection(Direction.Up); p.loadSpriteImage(); } break; } } /* * Keep the screen following the player, i.e. move the map also */ if (p.isOurPlayer()) { if (p.getX() > p.getServerX()) { m_mapMatrix.getCurrentMap().setXOffset( (m_mapMatrix.getCurrentMap().getXOffset() + ANIMATION_INCREMENT), true); } else if (p.getX() < p.getServerX()) { m_mapMatrix.getCurrentMap().setXOffset( (m_mapMatrix.getCurrentMap().getXOffset() - ANIMATION_INCREMENT), true); } else if (p.getY() > p.getServerY()) { m_mapMatrix.getCurrentMap().setYOffset( (m_mapMatrix.getCurrentMap().getYOffset() + ANIMATION_INCREMENT), true); } else if (p.getY() < p.getServerY()) { m_mapMatrix.getCurrentMap().setYOffset( (m_mapMatrix.getCurrentMap().getYOffset() - ANIMATION_INCREMENT), true); } } /* * Move the player on screen */ if (p.getX() > p.getServerX()) { // Choose the sprite according to the player's position if(p.getX() % 32 == 0) { p.setDirection(Direction.Left); p.m_leftOrRight = !p.m_leftOrRight; p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), true, p.m_leftOrRight, p.getSprite())); } p.setX(p.getX() - ANIMATION_INCREMENT); if(p.getX() > p.getServerX() && p.getX() % 32 == 0) { /* If the player is still behind the server, make sure the stopped animation is shown */ p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), false, p.m_leftOrRight, p.getSprite())); } } else if (p.getX() < p.getServerX()) { if(p.getX() % 32 == 0) { p.setDirection(Direction.Right); p.m_leftOrRight = !p.m_leftOrRight; p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), true, p.m_leftOrRight, p.getSprite())); } p.setX(p.getX() + ANIMATION_INCREMENT); if(p.getX() < p.getServerX() && p.getX() % 32 == 0) { /* If the player is still behind the server, make sure the stopped animation is shown */ p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), false, p.m_leftOrRight, p.getSprite())); } } else if (p.getY() > p.getServerY()) { if((p.getY() + 8) % 32 == 0) { p.setDirection(Direction.Up); p.m_leftOrRight = !p.m_leftOrRight; p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), true, p.m_leftOrRight, p.getSprite())); } p.setY(p.getY() - ANIMATION_INCREMENT); if(p.getY() > p.getServerY() && (p.getY() + 8) % 32 == 0) { /* If the player is still behind the server, make sure the stopped animation is shown */ p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), false, p.m_leftOrRight, p.getSprite())); } } else if (p.getY() < p.getServerY()) { if((p.getY() + 8) % 32 == 0) { p.setDirection(Direction.Down); p.m_leftOrRight = !p.m_leftOrRight; p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), true, p.m_leftOrRight, p.getSprite())); } p.setY(p.getY() + ANIMATION_INCREMENT); if(p.getY() < p.getServerY() && (p.getY() + 8) % 32 == 0) { /* If the player is still behind the server, make sure the stopped animation is shown */ p.setCurrentImage(Player.getSpriteFactory().getSprite(p.getDirection(), false, p.m_leftOrRight, p.getSprite())); } } /* * The player is now in sync with the server, stop moving/animating them */ if (p.getX() == p.getServerX() && p.getY() == p.getServerY()) { p.setDirection(p.getDirection()); p.setAnimating(false); p.loadSpriteImage(); } } }