package com.arretadogames.pilot.screens;
import android.annotation.SuppressLint;
import android.graphics.RectF;
import android.view.MotionEvent;
import aurelienribon.tweenengine.TweenAccessor;
import com.arretadogames.pilot.R;
import com.arretadogames.pilot.config.GameSettings;
import com.arretadogames.pilot.entities.PlayableCharacter;
import com.arretadogames.pilot.entities.PlayableItem;
import com.arretadogames.pilot.entities.PlayerNumber;
import com.arretadogames.pilot.game.Game;
import com.arretadogames.pilot.game.GameMode;
import com.arretadogames.pilot.game.GameState;
import com.arretadogames.pilot.render.Renderable;
import com.arretadogames.pilot.render.opengl.GLCanvas;
import com.arretadogames.pilot.ui.GameButtonListener;
import com.arretadogames.pilot.ui.ImageButton;
import com.arretadogames.pilot.world.GameWorld;
import java.util.HashMap;
import java.util.List;
public class CharacterSelectionScreen extends GameScreen implements GameButtonListener {
private final RectF BASE_RECT = new RectF(0, 0, 400, 240);
private static final int GO_BUTTON = 1;
private static final int BACK_BUTTON = 2;
private PlayerSelector[] selectors;
private CharacterSpot[] spots;
private ImageButton btCharsSelected;
private boolean playerOne;
private boolean playerTwo;
private ImageButton backBt;
public CharacterSelectionScreen() {
playerOne = false;
playerTwo = false;
initializeSelectors();
initializeSpots();
btCharsSelected = new ImageButton(GO_BUTTON,
getDimension(R.dimen.screen_width) / 2 - getDimension(R.dimen.player_selector_size) / 2,
getDimension(R.dimen.screen_height) / 2 - getDimension(R.dimen.player_selector_size) / 2,
getDimension(R.dimen.player_selector_size), getDimension(R.dimen.player_selector_size), this,
R.drawable.bt_chars_selected, R.drawable.bt_chars_selected);
backBt = new ImageButton(BACK_BUTTON, 740, 10, 50, 50,
this, R.drawable.back_bt, R.drawable.back_bt);
}
@Override
public void onUnloading() {
resetSelections();
}
private void initializeSelectors() {
selectors = new PlayerSelector[2];
selectors[0] = new PlayerSelector();
selectors[0].player = PlayerNumber.ONE;
selectors[1] = new PlayerSelector();
selectors[1].player = PlayerNumber.TWO;
}
@SuppressLint("NewApi")
private void initializeSpots() {
final float CENTER_X = GameSettings.TARGET_WIDTH / 2;
final float CENTER_Y = GameSettings.TARGET_HEIGHT / 2;
spots = new CharacterSpot[4];
spots[0] = new CharacterSpot();
spots[0].character = PlayableCharacter.LOBO_GUARA;
spots[0].rect = new RectF(BASE_RECT);
spots[0].rect.left = CENTER_X - BASE_RECT.width();
spots[0].rect.right = spots[0].rect.left + BASE_RECT.width();
spots[0].rect.top = CENTER_Y - BASE_RECT.height();
spots[0].rect.bottom = spots[0].rect.top + BASE_RECT.height();
selectors[0].selectorRect = new RectF();
spots[1] = new CharacterSpot();
spots[1].character = PlayableCharacter.ARARA_AZUL;
spots[1].rect = new RectF(BASE_RECT);
spots[1].rect.left = CENTER_X;
spots[1].rect.right = spots[1].rect.left + BASE_RECT.width();
spots[1].rect.top = CENTER_Y - BASE_RECT.height();
spots[1].rect.bottom = spots[1].rect.top + BASE_RECT.height();
selectors[1].selectorRect = new RectF();
spots[2] = new CharacterSpot();
spots[2].character = PlayableCharacter.TATU_BOLA;
spots[2].rect = new RectF(BASE_RECT);
spots[2].rect.left = CENTER_X - BASE_RECT.width();
spots[2].rect.right = spots[2].rect.left + BASE_RECT.width();
spots[2].rect.top = CENTER_Y;
spots[2].rect.bottom = spots[2].rect.top + BASE_RECT.height();
spots[3] = new CharacterSpot();
spots[3].character = PlayableCharacter.MACACO_PREGO;
spots[3].rect = new RectF(BASE_RECT);
spots[3].rect.left = CENTER_X;
spots[3].rect.right = spots[3].rect.left + BASE_RECT.width();
spots[3].rect.top = CENTER_Y;
spots[3].rect.bottom = spots[3].rect.top + BASE_RECT.height();
}
@Override
public void render(GLCanvas canvas, float timeElapsed) {
canvas.drawBitmap(R.drawable.bg_select_chars, 0, 0, getDimension(R.dimen.screen_width), getDimension(R.dimen.screen_height),
0, getDimension(R.dimen.selection_screen_bg_extra_height));
canvas.drawBitmap(R.drawable.bg_platforms_chars, 0, 0, getDimension(R.dimen.screen_width), getDimension(R.dimen.screen_height),
0, getDimension(R.dimen.selection_screen_item_platform_extra_height));
for (int i = 0 ; i < spots.length ; i++)
spots[i].render(canvas, timeElapsed);
selectors[0].render(canvas, timeElapsed);
selectors[1].render(canvas, timeElapsed);
if (playerOne && playerTwo)
btCharsSelected.render(canvas, timeElapsed);
else {
canvas.drawBitmap(R.drawable.bt_chars_not_selected,
getDimension(R.dimen.screen_width) / 2 - getDimension(R.dimen.player_selector_size) / 2,
getDimension(R.dimen.screen_height) / 2 - getDimension(R.dimen.player_selector_size) / 2,
getDimension(R.dimen.player_selector_size), getDimension(R.dimen.player_selector_size));
}
backBt.render(canvas, timeElapsed);
}
@Override
public void step(float timeElapsed) {
}
@Override
public void input(InputEventHandler event) {
if (!backBt.input(event)) {
if (!btCharsSelected.input(event)){
if (event.getAction()== MotionEvent.ACTION_UP){
if (!playerOne){
if (selectors[0].touch(event.getX(), event.getY()))
playerOne = true;
}else{
if (selectors[1].touch(event.getX(), event.getY())) {
playerTwo = true;
}
}
}
}
}
}
@Override
public void onPause() {
}
private class PlayerSelector implements Renderable, TweenAccessor<PlayerSelector> {
PlayerNumber player;
CharacterSpot spot;
RectF selectorRect;
@Override
public void render(GLCanvas canvas, float timeElapsed) {
int imageId = -1;
switch (player) {
case ONE:
imageId = R.drawable.blue_selector;
break;
case TWO:
imageId = R.drawable.red_selector;
break;
}
canvas.saveState();
if (selectorRect != null)
canvas.drawBitmap(imageId, selectorRect);
canvas.restoreState();
}
public boolean touch(float x, float y) {
CharacterSpot newSpot = getSpotAt(x, y);
if (newSpot != null){
if (playerOne && selectors[0].spot == newSpot) { //Deselection of player1
playerOne = false;
selectors[0] = new PlayerSelector();
selectors[0].player = PlayerNumber.ONE;
selectors[0].selectorRect = new RectF();
return false;
}
if (playerTwo && selectors[1].spot == newSpot) { //Deselection of player2
playerTwo = false;
selectors[1] = new PlayerSelector();
selectors[1].player = PlayerNumber.TWO;
selectors[1].selectorRect = new RectF();
return false;
}
if (! (playerOne && playerTwo)) {
selectorRect.set(newSpot.rect);
spot = newSpot;
spot.selector = this;
return true;
}
}
return false;
}
private CharacterSpot getSpotAt(float x, float y){
for (int i = 0; i < spots.length ; i++) {
if (spots[i].rect.contains(x, y)){
return spots[i];
}
}
return null;
}
@Override
public int getValues(PlayerSelector pSelector, int arg1, float[] returnValues) {
returnValues[0] = pSelector.selectorRect.centerX();
returnValues[1] = pSelector.selectorRect.centerY();
return 0;
}
@Override
public void setValues(PlayerSelector pSelector, int arg1, float[] newValues) {
RectF oldR = new RectF(pSelector.selectorRect);
pSelector.selectorRect.set(
newValues[0] - oldR.width() / 2,
newValues[1] - oldR.height() / 2,
newValues[0] + oldR.width() / 2,
newValues[1] + oldR.height() / 2);
}
}
private class CharacterSpot implements Renderable {
RectF rect;
PlayerSelector selector = null;
PlayableCharacter character;
@Override
public void render(GLCanvas canvas, float timeElapsed) {
int imageId = -1;
switch (character) {
case LOBO_GUARA:
imageId = R.drawable.selection_lobo_guara;
break;
case ARARA_AZUL:
imageId = R.drawable.selection_arara_azul;
break;
case TATU_BOLA:
imageId = R.drawable.selection_tatu_bola;
break;
case MACACO_PREGO:
imageId = R.drawable.selection_macaco_prego;
break;
default:
System.out.println("No ImageId ERROR!");
}
canvas.drawBitmap(imageId, rect);
}
}
public void resetSelections(){
playerOne = false;
playerTwo = false;
initializeSelectors();
initializeSpots();
}
private void initGame(){
HashMap<PlayerNumber, PlayableCharacter> selectedCharacters = new HashMap<PlayerNumber, PlayableCharacter>();
HashMap<PlayerNumber, List<PlayableItem>> selectedItems = new HashMap<PlayerNumber, List<PlayableItem>>();
for (PlayerSelector selector : selectors) {
selectedCharacters.put(selector.player, selector.spot.character);
}
((GameWorld)Game.getInstance().getScreen(GameState.RUNNING_GAME)).setSelectedCharacters(selectedCharacters);
((GameWorld)Game.getInstance().getScreen(GameState.RUNNING_GAME)).setSelectedItems(selectedItems);
((GameWorld)Game.getInstance().getScreen(GameState.RUNNING_GAME)).initialize();
Game.getInstance().goTo(GameState.RUNNING_GAME);
}
@Override
public void onBackPressed() {
if (Game.getInstance().getGameMode() == GameMode.TOURNAMENT)
Game.getInstance().goTo(GameState.TOURNAMENT_SELECTION);
else
Game.getInstance().goTo(GameState.LEVEL_SELECTION);
}
@Override
public void onClick(int buttonId) {
switch (buttonId) {
case GO_BUTTON:
if (playerOne && playerTwo)
initGame();
break;
case BACK_BUTTON:
onBackPressed();
break;
default:
break;
}
}
}