ajout du combat

This commit is contained in:
marc barbier
2021-01-03 23:08:04 +01:00
parent 7c344e11f8
commit db523a9d13
8 changed files with 219 additions and 32 deletions
@@ -1,6 +1,7 @@
package com.iutlaval.myapplication.Game;
import com.iutlaval.myapplication.Game.Cards.Card;
import com.iutlaval.myapplication.Video.Drawables.DrawableCard;
/**
* cette classe contrain toutes les cartes sur le terrain cela permet de garder une copie qui sera utilisé pour l'affichage
@@ -20,6 +21,40 @@ public class Board {
return playerCardsOnBoard;
}
public int getCardZone(DrawableCard drawableCard)
{
return getCardZone(drawableCard.getCard());
}
public int getCardZone(Card card)
{
int index=0;
for(Card c : playerCardsOnBoard)
{
//si c'est la meme instance de la carte
// /!\ ne pas mettre un equals ce n'est pas une erreur je test l'instance et non la similarité
if(c == card)
{
return index;
}
index++;
}
return -1;
}
public Card removeCardOnPlayerBoard(int zone)
{
Card c = playerCardsOnBoard[zone];
playerCardsOnBoard[zone] = null;
return c;
}
public Card removeCardOnEnemyPlayerBoard(int zone) {
Card c = advCardsOnBoard[zone];
advCardsOnBoard[zone] = null;
return c;
}
public void setCard(int index, Card c)
{
playerCardsOnBoard[index]=c;
@@ -30,4 +65,7 @@ public class Board {
advCardsOnBoard[index]=c;
}
public Card[] getAdvCardsOnBoard() {
return advCardsOnBoard;
}
}
@@ -10,7 +10,7 @@ public final class Command {
public static final String PUT_CARD = "putCard"; // place une carte
public static final String PUT_ENEMY_CARD = "enemycard"; // place une carte sur le terrain adverse
public static final String PASS_TURN = "passTurn"; // passe son tours
public static final String POPUP = "pupup"; // affiche un messsage
public static final String POPUP = "popup"; // affiche un messsage
public static final String ENEMYTURN = "enemyTurn"; // tours enemy
public static final String SETMANA = "setmana"; // defini la mana
public static final String WIN = "win"; // gagne
@@ -21,12 +21,14 @@ public final class Command {
public static final String OK = "ok"; // accepte une actoin
public static final String MEULE = "meule"; // fait pioché mais n'ajoute pas a la main la carte sera donc perdu
public static final String UPDATE = "update";//fonction client uniquement a utilisé avec le serveur de débugage permet de mettre a jour l'écrans
public static final String ATTACK = "attack"; // dit au server qu'une attaque est lancé
public static final String DESTROY_CARD = "destroyself"; //demande au clien de retirer une carte du terrain
public static final String DESTROY_ADV_CARD = "destroyadv"; //demande au client de retirer une carte adverse du terrain
public static final String BATTLE = "battlephase";
//inutilisé
public static final String SHUFFLE_DECK = "shuffleDeck";
public static final String SELECT_CARD = "selectCard";
public static final String ATTACK = "attack";
public static final String DEFEND = "defend";
public static final String CAST_SPELL = "castSpell";
@@ -43,7 +43,8 @@ public class GameLogicThread extends Thread{
private NetworkDeck deck;
private Hand hand;
private Board board;
private boolean isYourTurn;
private boolean isYourMainPhase;
private boolean isYourBattlePhase;
private boolean cancelled;
private String deckName;
private int mana=0;
@@ -51,9 +52,12 @@ public class GameLogicThread extends Thread{
//ces variable permette la comunication avec le thread android du tactile et le reseau en passant par ce thread
//cette variable controle la demande de gestion de placement de carte
private boolean requestPlaceCardDone =true;
private DrawableCard requestPlaceCardCard =null;
private int requestPlaceCardZone =-1;
//cette variable controle la demande de gestion de l'attaque
boolean requestAttackDone = true;
private DrawableCard requestDrawableCard =null;
private int requestCardZone =-1;
private boolean requestPlaceCardResult;
//si mise a true alors le thread va envoyer un message au serveur lui disant de passer a la phase suivante
@@ -71,8 +75,9 @@ public class GameLogicThread extends Thread{
hand = new Hand();
this.gameActivity=gameActivity;
GameActivity.setGameEngine(this);
isYourTurn=false;
isYourMainPhase =false;
cancelled=false;
isYourBattlePhase=false;
}
@Override
@@ -91,8 +96,8 @@ public class GameLogicThread extends Thread{
//Rectangle pos = new Rectangle(0F,0F,100F,100F);
ready=true;
final String host = "0.tcp.ngrok.io";//192.168.43.251tcp://2.tcp.ngrok.io:
final int port = 13562;
final String host = "2.tcp.ngrok.io";//192.168.43.251tcp://2.tcp.ngrok.io:
final int port = 13450;
try {
Socket client = new Socket(host, port);
@@ -108,18 +113,32 @@ public class GameLogicThread extends Thread{
//si quelquechose se passe alors c'est le server qu'il l'a dit
while(ready && !cancelled)
{
if(!requestPlaceCardDone && requestPlaceCardZone != -1 && requestPlaceCardCard != null)
if(!requestPlaceCardDone && requestCardZone != -1 && requestDrawableCard != null)
{
try {//on allonge le delais car sinon on skip l'autorisation serveur
coms.setUnlimitedTimeOut();
} catch (SocketException e) {}
requestPlaceCardResult = onCardPlayed(requestPlaceCardCard, requestPlaceCardZone);
requestPlaceCardZone =-1;
requestPlaceCardCard =null;
requestPlaceCardResult = onCardPlayed(requestDrawableCard, requestCardZone);
requestCardZone =-1;
requestDrawableCard =null;
Log.e("request","done");
requestPlaceCardDone =true;
}
if(!requestAttackDone && requestCardZone != -1 && requestDrawableCard != null)
{
int zoneAttaquant = board.getCardZone(requestDrawableCard);
try {
coms.send(Command.ATTACK);
coms.send(zoneAttaquant);
coms.send(requestCardZone);
} catch (IOException e) {
e.printStackTrace();
}
requestAttackDone=true;
}
if(requestEnd)
{
try {
@@ -129,9 +148,12 @@ public class GameLogicThread extends Thread{
e.printStackTrace();
}
requestEnd=false;
isYourBattlePhase=false;
}
try {
//on limite le temps du readobject pour eviter les blockaeg
coms.setLimitedTimeOut();
@@ -154,7 +176,8 @@ public class GameLogicThread extends Thread{
break;
case Command.YOURTURN:
isYourTurn=true;
isYourMainPhase =true;
isYourBattlePhase=false;
renderer.addToDraw(new DrawableSelfRemoving(new DrawableBitmap(bitmapYourTurn,0,0,"yourTurn",100F,50F),1));
renderer.addToDraw(new DrawableBitmap(bitmapButtonEnd, BUTTON_X_POS, BUTTON_Y_POS, BUTTONTURN_DRAWABLE_NAME, BUTTON_X_SIZE, BUTTON_Y_SIZE));
break;
@@ -166,7 +189,7 @@ public class GameLogicThread extends Thread{
break;
case Command.ENEMYTURN:
isYourTurn=false;
isYourMainPhase =false;
//on update pas vu que l'instruction suivante va le faire
renderer.removeToDrawWithoutUpdate(BUTTONTURN_DRAWABLE_NAME);
@@ -217,10 +240,11 @@ public class GameLogicThread extends Thread{
cardPlayed.getDrawableCard().setOnBoard(true);
//ajout de la carte au rendu
cardPlayed.getDrawableCard().setCoordinates(((DrawableCard.getCardWith()+1)*zone+DrawableCard.getCardWith()),10F);
cardPlayed.getDrawableCard().setCoordinates(((DrawableCard.getCardWith()+1)*zone+20),10F);
renderer.addToDraw(cardPlayed.getDrawableCard());
//ajout la card au terain
cardPlayed.getDrawableCard().setDraggable(false);
board.setEnemyCard(zone,cardPlayed);
break;
@@ -230,6 +254,25 @@ public class GameLogicThread extends Thread{
int nbmeule = coms.recieveInt();
deck.draw(nbmeule);
case Command.BATTLE:
isYourBattlePhase=true;
isYourMainPhase=false;
break;
case Command.DESTROY_CARD:
//detruit la carte sur le terrain du joueur
int zoneOfTheDestroyedCard = coms.recieveInt();
Card cardToDestroy = board.removeCardOnPlayerBoard(zoneOfTheDestroyedCard);
renderer.removeToDraw(cardToDestroy);
break;
case Command.DESTROY_ADV_CARD:
//detruit la carte sur le terrain du joueur adverse
int zoneOfTheDestroyedEnemyCard = coms.recieveInt();
Card enemyCardToDestroy = board.removeCardOnEnemyPlayerBoard(zoneOfTheDestroyedEnemyCard);
renderer.removeToDraw(enemyCardToDestroy);
break;
case "timeout":
//ceci est une erreur et non une commande elle se doit donc de ne rien faire
break;
@@ -284,7 +327,7 @@ public class GameLogicThread extends Thread{
*/
private boolean onCardPlayed(DrawableCard card,int zone)
{
if(isYourTurn)
if(isYourMainPhase)
{
try {
//on veut jouer une carte
@@ -318,8 +361,8 @@ public class GameLogicThread extends Thread{
//on ne peut pas avoir 2 requette simultané
if(!requestPlaceCardDone)return false;
this.requestPlaceCardCard =card;
this.requestPlaceCardZone =zone;
this.requestDrawableCard =card;
this.requestCardZone =zone;
requestPlaceCardDone =false;
//on attends la fin de la requette
@@ -333,6 +376,38 @@ public class GameLogicThread extends Thread{
return requestPlaceCardResult;
}
public synchronized boolean setOnCardAttackRequest(DrawableCard card, int zoneCible) {
if(board.getAdvCardsOnBoard()[zoneCible] == null
|| card.getCard().getAttack() == 0)
{
return false;
}
//on ne peut pas avoir 2 requette simultané
while(!requestAttackDone) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.requestCardZone =zoneCible;
this.requestDrawableCard=card;
requestAttackDone =false;
//on attends la fin de la requette
while(!requestAttackDone) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return true;
}
/**
* cette fonction est appeller a chaque fin de frame
* CETTE FONCTION A UN IMPACT DIRECT SUR LES FPS ELLE SE DOIT D'être OPTIMAL
@@ -364,8 +439,8 @@ public class GameLogicThread extends Thread{
if(isReady())touch.onTouchEvent(event);
}
public boolean isYourTurn() {
return isYourTurn;
public boolean isYourMainPhase() {
return isYourMainPhase;
}
@@ -388,7 +463,7 @@ public class GameLogicThread extends Thread{
}
public void requestEndTurn() {
if(isYourTurn)
if(isYourMainPhase || isYourBattlePhase)
{
requestEnd=true;
}else{
@@ -398,4 +473,10 @@ public class GameLogicThread extends Thread{
t.show();
}
}
public boolean isYourBattlePhase() {
return isYourBattlePhase;
}
}
@@ -95,11 +95,35 @@ public class PlayableZonesHandler {
if(cardX > card.getX() && card.getY() < 75F/*90F orrigine */ && card.getY() > 50F)
{
//on a trouvé l'emplacement de la carte
//si il y a une carte a l'emplacement on retourne le numero
if(board.getPlayerCardsOnBoard()[i] == null)return i;
else break;
}
}
return -1;
}
/**
* retourne le numero de la zone survolé par le drawable si la zone est vite
* sinon retourne -1
* @param card
* @return
*/
public int getEnemyHoveredZone(Drawable card) {
for(int i=0 ; i< board.MAX_CARD_ON_BOARD;i++)
{
int cardX =(DrawableCard.getCardWith()+1)*i + 20;
//es que on survole sur l'axe x
if(cardX > card.getX() && card.getY() < 50F)
{
//on a trouvé l'emplacement de la carte
//si il y a une carte a l'emplacement on retourne le numero
if(board.getPlayerCardsOnBoard()[i] == null)return i;
else break;
}
}
return -1;
}
//cardPlayed.getDrawableCard().setCoordinates(((DrawableCard.getCardWith()+1)*zone+DrawableCard.getCardWith()),10F);
}
@@ -54,14 +54,21 @@ public class TouchHandler {
handSelectionHandler(event);
//afficher grosse carte
bigCardHandler(event);
if(gameLogic.isYourTurn())
if(gameLogic.isYourMainPhase() && ! gameLogic.isYourBattlePhase())
{
//selectionne la carte
dragAndDropHandler(event);
//selectionne la carte dans la main
dragAndDropHandler(event,false);
//affiche les zones de jeu
playCard(event);
}
if(gameLogic.isYourBattlePhase() && ! gameLogic.isYourMainPhase())
{
//selectionne la carte sur le terrain
dragAndDropHandler(event,true);
attackHandler(event);
}
}
}
@@ -69,7 +76,7 @@ public class TouchHandler {
* gére le drag and drop de carte
* @param event
*/
private void dragAndDropHandler(MotionEvent event)
private void dragAndDropHandler(MotionEvent event,boolean isBattleTurn)
{
//on calcul les coordonées en % de l'écran
@@ -80,6 +87,11 @@ public class TouchHandler {
if(dragAndDropCard != null && !dragAndDropCard.isDraggable()) dragAndDropCard = null;
//si la carte est dans la main durant la phase de combat on ne la prend pas
//if(dragAndDropCard != null && isBattleTurn && !dragAndDropCard.isOnBoard())dragAndDropCard = null;
//si la carte est sur le terrain durant la phase principale on ne la prends pas
if(dragAndDropCard != null && !isBattleTurn && dragAndDropCard.isOnBoard())dragAndDropCard = null;
if (dragAndDropCard != null) {
//on calcul la position par raport au doigt de l'utilisateur
TouchDeltaY = unScalled_Y - dragAndDropCard.getY();
@@ -119,6 +131,7 @@ public class TouchHandler {
DrawableCard bigCard = new DrawableCard(smallCArd,context,2);
renderer.addToDraw(bigCard);
bigCard.setCoordinates(72F,10F);
bigCard.setDraggable(false);
//on sélectionne si elle est dans notre main(déplacer la care vers le haut de quelque pixel)
//si on lache la carte
@@ -153,7 +166,6 @@ public class TouchHandler {
{
dragAndDropCard.setOnBoard(true);
dragAndDropCard.setCoordinates((DrawableCard.getCardWith()+1)*zone,55F);
dragAndDropCard.setDraggable(false);
}else{
if(dragAndDropCard != null)renderer.moveToDraw(originalPositionX,originalPositionY, dragAndDropCard.getName());
}
@@ -177,7 +189,7 @@ public class TouchHandler {
renderer.updateFrame();
}
if(unScalled_Y > 90F && smallCArd !=null && smallCArd.isDraggable() && !smallCArd.isOnBoard() && (cardSeletedInHand == null || !cardSeletedInHand.equals(smallCArd)))
if(unScalled_Y > 90F && smallCArd !=null && !smallCArd.isOnBoard() && (cardSeletedInHand == null || !cardSeletedInHand.equals(smallCArd)))
{
smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET);
cardSeletedInHand=smallCArd;
@@ -202,4 +214,19 @@ public class TouchHandler {
gameLogic.requestEndTurn();
}
}
private void attackHandler(MotionEvent event)
{
if(dragAndDropCard != null){
if(event.getAction() == MotionEvent.ACTION_UP) {
int zone = playableZonesHandler.getEnemyHoveredZone(dragAndDropCard);
if(zone != -1)
{
gameLogic.setOnCardAttackRequest(dragAndDropCard,zone);
}
renderer.moveToDraw(originalPositionX,originalPositionY, dragAndDropCard.getName());
playableZonesHandler.hidePlayableZones(renderer);
}
}
}
}