206 lines
7.7 KiB
Java
206 lines
7.7 KiB
Java
package com.iutlaval.myapplication.Game;
|
|
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
import android.view.MotionEvent;
|
|
|
|
import com.iutlaval.myapplication.GameActivity;
|
|
import com.iutlaval.myapplication.Video.Drawables.DrawableCard;
|
|
import com.iutlaval.myapplication.Video.Renderer;
|
|
|
|
/**
|
|
* NOT A MES COLEGUES : n'optimiser pas cette classe elle est sub optimal c'est évident je le sais MAIS
|
|
* la compréhention du code deviendera trés difficile si on optimise
|
|
*/
|
|
public class TouchHandler {
|
|
|
|
private float TouchDeltaX = 0;
|
|
private float TouchDeltaY = 0;
|
|
private float originalPositionX = 0;
|
|
private float originalPositionY = 0;
|
|
private DrawableCard dragAndDropCard = null;
|
|
private DrawableCard smallCardUsedForBig = null;
|
|
private DrawableCard cardSeletedInHand = null;
|
|
private static final float SELECTING_OFFSET = 10F;
|
|
private PlayableZonesHandler playableZonesHandler;
|
|
|
|
private Renderer renderer;
|
|
private GameLogicThread gameLogic;
|
|
private Context context;
|
|
private float unScalled_X;
|
|
private float unScalled_Y;
|
|
|
|
public TouchHandler(Renderer renderer, GameLogicThread gameLogic, Context context)
|
|
{
|
|
playableZonesHandler = new PlayableZonesHandler(gameLogic.getBoard());
|
|
this.renderer = renderer;
|
|
this.gameLogic = gameLogic;
|
|
this.context=context;
|
|
}
|
|
|
|
/**
|
|
* cette evenement doit recevoir le onTouchEvent d'une activité
|
|
* cette fonction gére l'integralité du tactile de l'application elle est divisé en de nombreuses sous fonction
|
|
* @param event
|
|
*/
|
|
public void onTouchEvent(MotionEvent event)
|
|
{
|
|
unScalled_X = event.getX() / GameActivity.screenWidth * 100;
|
|
unScalled_Y = event.getY() / GameActivity.screenHeight * 100;
|
|
//on ignore le multi touch
|
|
if(event.getPointerCount() <= 1)
|
|
{
|
|
endTurnButtonHandle(event);
|
|
handSelectionHandler(event);
|
|
//afficher grosse carte
|
|
bigCardHandler(event);
|
|
if(gameLogic.isYourTurn())
|
|
{
|
|
//selectionne la carte
|
|
dragAndDropHandler(event);
|
|
//affiche les zones de jeu
|
|
playCard(event);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* gére le drag and drop de carte
|
|
* @param event
|
|
*/
|
|
private void dragAndDropHandler(MotionEvent event)
|
|
{
|
|
//on calcul les coordonées en % de l'écran
|
|
|
|
|
|
//quand on appui on capture une carte et on note sa positon initial
|
|
if (event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
dragAndDropCard = renderer.getCardOn(unScalled_X, unScalled_Y);
|
|
|
|
if(dragAndDropCard != null && !dragAndDropCard.isDraggable()) dragAndDropCard = null;
|
|
|
|
if (dragAndDropCard != null) {
|
|
//on calcul la position par raport au doigt de l'utilisateur
|
|
TouchDeltaY = unScalled_Y - dragAndDropCard.getY();
|
|
TouchDeltaX = unScalled_X - dragAndDropCard.getX();
|
|
originalPositionX = dragAndDropCard.getX();
|
|
originalPositionY = dragAndDropCard.getY();
|
|
}
|
|
|
|
} else if (event.getAction() == MotionEvent.ACTION_UP) {
|
|
TouchDeltaY = 0;
|
|
TouchDeltaX = 0;
|
|
|
|
//dragAndDropCard = null;
|
|
} else if (dragAndDropCard != null) {
|
|
dragAndDropCard.setCoordinates(unScalled_X - TouchDeltaX, unScalled_Y - TouchDeltaY);
|
|
renderer.updateFrame();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* affiche une grosse carte carte quand une carte est sélectionner
|
|
* @param event
|
|
*/
|
|
private void bigCardHandler(MotionEvent event)
|
|
{
|
|
if(event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
//on recupére la carte a afficher en grand
|
|
DrawableCard smallCArd = renderer.getCardOn(unScalled_X,unScalled_Y);
|
|
if(smallCArd !=null)
|
|
{
|
|
if(smallCardUsedForBig !=null)
|
|
{
|
|
//on update pas affin d'avoir un rendu plus fluide au moment de mettre l'aure carte
|
|
renderer.removeToDrawWithoutUpdate(smallCardUsedForBig.getName()+"BIG");
|
|
}
|
|
smallCardUsedForBig = smallCArd;
|
|
DrawableCard bigCard = new DrawableCard(smallCArd,context,2);
|
|
renderer.addToDraw(bigCard);
|
|
bigCard.setCoordinates(72F,10F);
|
|
//on sélectionne si elle est dans notre main(déplacer la care vers le haut de quelque pixel)
|
|
|
|
//si on lache la carte
|
|
}
|
|
}else if(event.getAction() == MotionEvent.ACTION_UP) {
|
|
if (smallCardUsedForBig != null) {
|
|
renderer.removeToDraw(smallCardUsedForBig.getName() + "BIG");
|
|
smallCardUsedForBig = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* gére le placement des cartes sur le terrain
|
|
* @param event
|
|
*/
|
|
private void playCard(MotionEvent event)
|
|
{
|
|
if(dragAndDropCard != null){
|
|
//l'affichage se fait par une liste fifo donc on veut que notre carte soit afficher aprés les zones
|
|
if(event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
//on enleve l carte
|
|
renderer.removeToDrawWithoutUpdate(dragAndDropCard);
|
|
//on ajoute les zones
|
|
playableZonesHandler.displayPlayableZones(renderer);
|
|
// et enfin on remet la carte
|
|
renderer.addToDraw(dragAndDropCard);
|
|
|
|
}else if(event.getAction() == MotionEvent.ACTION_UP) {
|
|
int zone = playableZonesHandler.getHoveredZone(dragAndDropCard);
|
|
if(zone != -1 && gameLogic.setOnCardPlayedRequest(dragAndDropCard,zone))
|
|
{
|
|
dragAndDropCard.setOnBoard(true);
|
|
dragAndDropCard.setCoordinates((DrawableCard.getCardWith()+1)*zone,55F);
|
|
dragAndDropCard.setDraggable(false);
|
|
}else{
|
|
if(dragAndDropCard != null)renderer.moveToDraw(originalPositionX,originalPositionY, dragAndDropCard.getName());
|
|
}
|
|
playableZonesHandler.hidePlayableZones(renderer);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* gére la selection de carte dans la main
|
|
* @param event
|
|
*/
|
|
private void handSelectionHandler(MotionEvent event)
|
|
{
|
|
DrawableCard smallCArd = renderer.getCardOn(unScalled_X,unScalled_Y);
|
|
if(event.getAction() == MotionEvent.ACTION_DOWN) {
|
|
if(cardSeletedInHand != null && !cardSeletedInHand.isOnBoard()){
|
|
cardSeletedInHand.setCoordinates(cardSeletedInHand.getX(), cardSeletedInHand.getY() + SELECTING_OFFSET);
|
|
cardSeletedInHand=null;
|
|
renderer.updateFrame();
|
|
}
|
|
|
|
if(unScalled_Y > 90F && smallCArd !=null && smallCArd.isDraggable() && !smallCArd.isOnBoard() && (cardSeletedInHand == null || !cardSeletedInHand.equals(smallCArd)))
|
|
{
|
|
smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET);
|
|
cardSeletedInHand=smallCArd;
|
|
renderer.updateFrame();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* gére le button de fin de tours
|
|
* @param event
|
|
*/
|
|
private void endTurnButtonHandle(MotionEvent event)
|
|
{
|
|
//si on appuie
|
|
if(event.getAction() == MotionEvent.ACTION_DOWN &&
|
|
//si on est sur le boutton
|
|
unScalled_X > GameLogicThread.BUTTON_X_POS && unScalled_X < GameLogicThread.BUTTON_X_POS + GameLogicThread.BUTTON_X_SIZE &&
|
|
unScalled_Y > GameLogicThread.BUTTON_Y_POS && unScalled_Y < GameLogicThread.BUTTON_Y_POS + GameLogicThread.BUTTON_Y_SIZE)
|
|
{
|
|
Log.e("push","detected");
|
|
gameLogic.requestEndTurn();
|
|
}
|
|
}
|
|
}
|