package com.angrykings; import android.util.Log; import com.angrykings.cannons.Cannon; import com.angrykings.cannons.Cannonball; import com.angrykings.castles.Castle; import com.angrykings.kings.King; import com.angrykings.maps.BasicMap; import org.andengine.engine.handler.IUpdateHandler; import org.andengine.engine.handler.timer.ITimerCallback; import org.andengine.engine.handler.timer.TimerHandler; import org.andengine.opengl.texture.region.TiledTextureRegion; import org.andengine.ui.activity.BaseGameActivity; import java.util.ArrayList; public class Player implements IUpdateHandler { // Attributes private static final int KEYFRAMES_PER_SECOND = 5; private boolean inTurn; private float timeElapsed; private float keyTime; // Game Objects Positions private static final int LEFT_CANNON_X = -375; private static final int RIGHT_CANNON_X = 300; private static final int LEFT_CASTLE_X = -1015; private static final int RIGHT_CASTLE_X = 375; private static final int LEFT_KING_X = -415; private static final int RIGHT_KING_X = 350; // Game Objects private final String name; private final King king; private int turn; private final Castle castle; private final Cannon cannon; private final boolean isLeft; private Cannonball cannonball; // Callbacks private IPlayerTurnListener playerTurnListener; public Player(String name, boolean isLeft) { ResourceManager rm = ResourceManager.getInstance(); GameContext gc = GameContext.getInstance(); this.name = name; this.isLeft = isLeft; float cannonX = LEFT_CANNON_X; float cannonY = (int) BasicMap.GROUND_Y - (int) rm.getWheelTexture().getHeight(); float kingX = LEFT_KING_X; float kingY = BasicMap.GROUND_Y - rm.getKingTexture2().getHeight() / 2; float castleX = LEFT_CASTLE_X; float castleY = BasicMap.GROUND_Y; TiledTextureRegion kingTexture = rm.getKingTexture2(); if (!this.isLeft) { cannonX = RIGHT_CANNON_X; kingX = RIGHT_KING_X; castleX = RIGHT_CASTLE_X; kingTexture = rm.getKingTexture1(); } this.cannon = new Cannon(this.isLeft); this.cannon.setPosition(cannonX, cannonY); this.king = new King(kingTexture, kingX, kingY); this.castle = new Castle(castleX, castleY); gc.getScene().attachChild(this.king); gc.getScene().attachChild(this.cannon); } public void handleTurn(final int aimX, final int aimY, final ArrayList<Keyframe> keyframes) { Log.i(getClass().getName(), "[" + this.name + "] handleTurn(" + aimX + ", " + aimY + ")"); final BaseGameActivity gameActivity = GameContext.getInstance().getGameActivity(); gameActivity.runOnUpdateThread(new Runnable() { @Override public void run() { cannonball = cannon.fire(GameConfig.CANNON_FORCE); cannon.activateFollowCamera(); gameActivity.getEngine().registerUpdateHandler( new TimerHandler( GameConfig.CANNONBALL_TIME_SEC, new ITimerCallback() { @Override public void onTimePassed(TimerHandler pTimerHandler) { cannonball.remove(); } })); cannonball.setOnRemove(new Runnable() { @Override public void run() { endTurn(); castle.freeze(); } }); if (playerTurnListener != null) { playerTurnListener.onHandleTurn(aimX, aimY, keyframes); playerTurnListener.onKeyframe(0f); } } }); this.timeElapsed = 0; this.keyTime = 0; this.inTurn = true; } public void endTurn() { if (this.playerTurnListener != null) { this.playerTurnListener.onKeyframe(GameConfig.CANNONBALL_TIME_SEC); } Log.i(getClass().getName(), "[" + this.name + "] onEndTurn()"); this.inTurn = false; if (this.playerTurnListener != null) { this.playerTurnListener.onEndTurn(); } } public String getName() { return name; } public King getKing() { return king; } public Castle getCastle() { return castle; } public Cannon getCannon() { return cannon; } public Cannonball getCannonball() { return cannonball; } public int getTurn() { return turn; } public void setTurn(int turn) { this.turn = turn; } public void setPlayerTurnListener(IPlayerTurnListener playerTurnListener) { this.playerTurnListener = playerTurnListener; } @Override public void onUpdate(float pSecondsElapsed) { if (this.playerTurnListener != null) this.playerTurnListener.onUpdate(pSecondsElapsed); if (inTurn) { this.timeElapsed += pSecondsElapsed; this.keyTime += pSecondsElapsed; if (this.keyTime > 1.0f / Player.KEYFRAMES_PER_SECOND) { if (this.playerTurnListener != null) this.playerTurnListener.onKeyframe(this.timeElapsed); this.keyTime = 0; } } } public boolean isInTurn() { return inTurn; } @Override public void reset() { } }