refactor touchHandler + repensé dekc + renpensé carte + suprimé code inutile + ajouter d'event carte

This commit is contained in:
marc barbier
2020-11-21 21:21:57 +01:00
parent 815fa64666
commit 538d9b9bba
17 changed files with 192 additions and 266 deletions
@@ -1,12 +1,10 @@
package com.iutlaval.myapplication.Game;
import com.iutlaval.myapplication.Game.Cards.Card;
import com.iutlaval.myapplication.Game.Players.Player;
import com.iutlaval.myapplication.Game.Players.PlayerLocal;
import java.util.ArrayList;
import java.util.List;
/**
* cette classe contrain toutes les cartes sur le terrain cela permet de garder une copie qui sera utilisé pour l'affichage
*/
public class Board {
public static final int MAX_CARD_ON_BOARD=5;
private Card[] advCardsOnBoard;
@@ -18,43 +16,11 @@ public class Board {
playerCardsOnBoard = new Card[MAX_CARD_ON_BOARD];
}
/**
* joue une carte et l'ajoute au terrain du joueur correspondant
* si retourne faux alors la carte n'a pas éte joué
* @param card
* @param player
* @return success/failure
*/
public boolean playCard(Card card,Player player)
{
boolean returnvalue = false;
if(player instanceof PlayerLocal)
{
for(Card c : playerCardsOnBoard)
{
if(c == null)
{
c=card;
returnvalue=true;
break;
}
}
}else{
for(Card c : advCardsOnBoard)
{
if(c == null)
{
c=card;
returnvalue=true;
break;
}
}
}
card.onCardPlayed(this,player);
return returnvalue;
}
public Card[] getPlayerCardsOnBoard() {
return playerCardsOnBoard;
}
public Card[] getAdvCardsOnBoard() {
return advCardsOnBoard;
}
}
@@ -5,7 +5,6 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import com.iutlaval.myapplication.Game.Board;
import com.iutlaval.myapplication.Game.Players.Player;
import com.iutlaval.myapplication.R;
import com.iutlaval.myapplication.Video.Drawables.DrawableCard;
@@ -23,31 +22,6 @@ public abstract class Card {
drawableCard = new DrawableCard(this,0,0,UID,c);
}
/**
* *cette methode est appeler a chaque fois que la carte attaque
* @param board
*/
public void onCardAttack(Board board,Card enemy){}
/**
* cette methode est appeler quand la carte est jouer
* elle se fait appler par board.java
* @param board
*/
public void onCardPlayed(Board board, Player p){}
/**
* cette methode est appeler quand la carte est detruite
* @param board
*/
public void onCardDeath(Board board){}
/**
* cette methode est appeler quand le tour commance
* @param board
*/
public void onTurnBegin(Board board){}
/**
* SURTOUT NE PAS @OVERRIDE
* si vous voulez modifier le cadre changer getFrameTexture()
@@ -1,25 +0,0 @@
package com.iutlaval.myapplication.Game.Decks;
import com.iutlaval.myapplication.Game.Cards.Card;
import java.util.Collections;
import java.util.Stack;
/**
* TOUT DECK CREE DOIT ETRE AJOUTER A DECKREGISTER
*/
public abstract class Deck {
public abstract Stack<Card> getCards();
public void shuffle()
{
Collections.shuffle(getCards());
}
/**
* retourne le nom du deck ex: ww2 , science
* ce nom doit être unique
* @return
*/
public abstract String getDeckName();
}
@@ -8,16 +8,16 @@ import android.view.MotionEvent;
import com.iutlaval.myapplication.Game.Cards.Card;
import com.iutlaval.myapplication.Game.Cards.CardRegistery;
import com.iutlaval.myapplication.Game.Decks.Deck;
import com.iutlaval.myapplication.Game.Decks.NetWorkDeck;
import com.iutlaval.myapplication.GameActivity;
import com.iutlaval.myapplication.R;
import com.iutlaval.myapplication.Video.Drawables.Drawable;
import com.iutlaval.myapplication.Video.Drawables.DrawableBitmap;
import com.iutlaval.myapplication.Video.Drawables.DrawableCard;
import com.iutlaval.myapplication.Video.Drawables.DrawableSelfRemoving;
import com.iutlaval.myapplication.Video.Renderer;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
@@ -29,14 +29,15 @@ public class GameLogicThread extends Thread{
private boolean ready;
private TouchHandler touch;
private GameActivity gameActivity;
private ObjectInputStream clientIn=null;
private ObjectOutputStream clientOut=null;
private Deck localPlayerDeck;
private Hand localPlayerHand;
private NetworkDeck deck;
private Hand hand;
private Board board;
private boolean isYourTurn;
private boolean cancelled;
private Socket client;
public GameLogicThread(GameActivity gameActivity, Renderer renderer)
{
@@ -45,12 +46,13 @@ public class GameLogicThread extends Thread{
ready=false;
this.cont = gameActivity;
this.renderer = renderer;
touch = new TouchHandler(renderer,this,gameActivity);
localPlayerHand = new Hand();
this.gameActivity=gameActivity;
board=new Board();
touch = new TouchHandler(renderer,this,gameActivity);
hand = new Hand();
this.gameActivity=gameActivity;
GameActivity.setGameEngine(this);
isYourTurn=false;
cancelled=false;
}
@Override
@@ -64,14 +66,15 @@ public class GameLogicThread extends Thread{
//drawHandPreview();
//Rectangle pos = new Rectangle(0F,0F,100F,100F);
ready=true;
//TODO : choix du deck avant de se co au serv
final String host = "4.tcp.ngrok.io";//192.168.43.251tcp://2.tcp.ngrok.io:
final int port = 17531;
ObjectInputStream clientIn=null;
ObjectOutputStream clientOut=null;
try {
Socket client = new Socket(host, port);
client = new Socket(host, port);
clientIn = new ObjectInputStream(client.getInputStream());
clientOut = new ObjectOutputStream(client.getOutputStream());
} catch (IOException e) {
@@ -83,8 +86,8 @@ public class GameLogicThread extends Thread{
//principe de fonctionnement : on attends une comande du server et on l'execute
//si quelquechose se passe alors c'est le server qu'il l'a dit
ready=true;
while(true)
while(ready && !cancelled)
{
try {
String serveurCmd = (String)clientIn.readObject();
@@ -95,14 +98,14 @@ public class GameLogicThread extends Thread{
clientOut.writeObject("deckDemo");
//TODO assing this deck
String deckstr = (String)clientIn.readObject();
localPlayerDeck = new NetWorkDeck(deckstr,gameActivity.getBaseContext());
deck = new NetworkDeck(deckstr,gameActivity.getBaseContext());
Log.e("got deck",deckstr);
Log.e("recived","getdeck");
break;
case COMMAND.DRAW:
int nbcard = (Integer)clientIn.readObject();
localPlayerHand.pickCardFromDeck(localPlayerDeck,nbcard);
hand.pickCardFromDeck(deck,nbcard);
Log.e("picked",nbcard+"card");
drawHandPreview();
break;
@@ -111,12 +114,18 @@ public class GameLogicThread extends Thread{
isYourTurn=true;
renderer.addToDraw(new DrawableSelfRemoving(new DrawableBitmap(bitmapYourTurn,0,0,"yourTurn",100F,50F),1));
break;
default:
Log.e("UNKOWN COMMAND",serveurCmd);
}
} catch (Exception e) {
}catch (InterruptedIOException e)
{
Log.e("Stopping","dead thread");
}
catch (Exception e) {
Log.e("ERROR DURING COMS","SERVER DIED");
e.printStackTrace();
break;
}
}
}
@@ -126,7 +135,7 @@ public class GameLogicThread extends Thread{
*/
private void drawHandPreview() {
int i = 0;
for(Card c : localPlayerHand.getHand())
for(Card c : hand.getHand())
{
renderer.addToDraw(c.getDrawableCard());
renderer.moveToDraw(i* DrawableCard.getCardWith(),90F,c.getDrawableCard().getName());
@@ -135,6 +144,16 @@ public class GameLogicThread extends Thread{
}
/**
* cette evenement est appelé par le touchHandler et permet d'envoyer au serveur le fait qu'un carte a été jouer
* @param card la carte jouer
* @param zone ou elle a été joué sur le terrain
*/
protected void onCardPlayed(Drawable card,int zone)
{
}
/**
* cette fonction est appeller a chaque fin de frame
* CETTE FONCTION A UN IMPACT DIRECT SUR LES FPS ELLE SE DOIT D'être OPTIMAL
@@ -163,7 +182,7 @@ public class GameLogicThread extends Thread{
* @param event
*/
public void onTouchEvent(MotionEvent event) {
//if(isReady())touch.onTouchEvent(event);
if(isReady())touch.onTouchEvent(event);
}
public boolean isYourTurn() {
@@ -174,4 +193,17 @@ public class GameLogicThread extends Thread{
public Board getBoard() {
return board;
}
public void terminate() {
ready=false;
try {
if(clientOut != null)clientOut.close();
if(clientIn != null)clientIn.close();
if(client != null)client.close();
} catch (IOException e) {}
cancelled=true;
interrupt();
}
}
@@ -1,7 +1,6 @@
package com.iutlaval.myapplication.Game;
import com.iutlaval.myapplication.Game.Cards.Card;
import com.iutlaval.myapplication.Game.Decks.Deck;
import java.util.ArrayList;
import java.util.List;
@@ -17,7 +16,12 @@ public class Hand {
hand = new ArrayList<>();
}
public void pickCardFromDeck(Deck deck,int amount)
/**
* recupére la quantité indiqué de carte depuis le deck
* @param deck
* @param amount
*/
public void pickCardFromDeck(NetworkDeck deck,int amount)
{
for(int i = 0 ; i < amount;i++)
{
@@ -25,12 +29,6 @@ public class Hand {
}
}
//TODO check number of card in hand
public void fillHand(Deck deck)
{
pickCardFromDeck(deck,NUMBER_OF_CARDS_IN_STARTING_HAND);
}
public List<Card> getHand() {
return hand;
}
@@ -1,4 +1,4 @@
package com.iutlaval.myapplication.Game.Decks;
package com.iutlaval.myapplication.Game;
import android.content.Context;
@@ -12,9 +12,9 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class NetWorkDeck extends Deck{
public class NetworkDeck{
Stack<Card> cards;
public NetWorkDeck(String deckstring, Context context)
public NetworkDeck(String deckstring, Context context)
{
cards = new Stack<>();
int nbcarte=0;
@@ -33,13 +33,7 @@ public class NetWorkDeck extends Deck{
}
}
@Override
public Stack<Card> getCards() {
return cards;
}
@Override
public String getDeckName() {
return null;
}
}
@@ -71,7 +71,7 @@ public class PlayableZonesHandler {
{
int cardX =(DrawableCard.getCardWith()+1)*i+1;
//es que on survole sur l'axe x
if(cardX > card.getX() && card.getY() < 90F && card.getY() > 50F)
if(cardX > card.getX() && card.getY() < 75F/*90F orrigine */ && card.getY() > 50F)
{
//on a trouvé l'emplacement de la carte
if(board.getPlayerCardsOnBoard()[i] == null)return i;
@@ -1,48 +0,0 @@
package com.iutlaval.myapplication.Game.Players;
import com.iutlaval.myapplication.Game.Cards.Card;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class Player {
private static final int MAX_HAND_SIZE = 10;
private List<Card> deck;
private List<Card> hand;
private int hp = 100;
public Player(){
deck=new ArrayList<>();
hand=new ArrayList<>();
}
public void shuffle()
{
Collections.shuffle(deck);
}
/**
* cette fonction ajoute un carte dans la main de l'utilisateur
*/
public void pickCard()
{
if(!deck.isEmpty()) {
if (hand.size() >= MAX_HAND_SIZE) {
deck.remove(0);
} else {
hand.add(deck.remove(0));
}
}else{
getHurt(2);
}
}
public void getHurt(int dmg)
{
hp -= dmg;
//TODO death trigger
}
}
@@ -1,4 +0,0 @@
package com.iutlaval.myapplication.Game.Players;
public class PlayerBot extends Player{
}
@@ -1,4 +0,0 @@
package com.iutlaval.myapplication.Game.Players;
public class PlayerLocal extends Player{
}
@@ -1,4 +0,0 @@
package com.iutlaval.myapplication.Game.Players;
public class PlayerOnlineAdversary extends Player{
}
@@ -14,8 +14,9 @@ public class TouchHandler {
private float originalPositionX = 0;
private float originalPositionY = 0;
private DrawableCard dragAndDropCard = null;
private DrawableCard smallCardUserForBig = null;
private static final float SELECTING_OFFSET = 20F;
private DrawableCard smallCardUsedForBig = null;
private DrawableCard cardSeletedInHand = null;
private static final float SELECTING_OFFSET = 10F;
private PlayableZonesHandler playableZonesHandler;
private Renderer renderer;
@@ -30,36 +31,33 @@ public class TouchHandler {
this.context=context;
}
/**
* cette evenement doit recevoir le onTouchEvent d'une activité
* @param event
*/
public void onTouchEvent(MotionEvent event)
{
//on ignore le multi touch
if(event.getPointerCount() <= 1)
{
if(gameLogic.isYourTurn())
{
//l'ordre importe on a besoin d'avoir une carte sélectionner pour la jouer
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
//selectionne la carte
dragAndDropHandler(event);
//affiche les zones de jeu
playCard(event);
}else{
//joue la carte si on a ACTION_UP
playCard(event);
//déplace la carte(non ACTION_UP) et la désélection (ACTION_UP)
dragAndDropHandler(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
@@ -70,7 +68,7 @@ public class TouchHandler {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
dragAndDropCard = renderer.getCardOn(unscaled_X, unscaled_Y);
if(!dragAndDropCard.isDraggable()) dragAndDropCard = null;
if(dragAndDropCard != null && !dragAndDropCard.isDraggable()) dragAndDropCard = null;
if (dragAndDropCard != null) {
//on calcul la position par raport au doigt de l'utilisateur
@@ -83,15 +81,18 @@ public class TouchHandler {
} else if (event.getAction() == MotionEvent.ACTION_UP) {
TouchDeltaY = 0;
TouchDeltaX = 0;
//TODO detect zones
if(dragAndDropCard != null)renderer.moveToDraw(originalPositionX,originalPositionY, dragAndDropCard.getName());
dragAndDropCard = null;
//dragAndDropCard = null;
} else if (dragAndDropCard != null) {
dragAndDropCard.setCoordinates(unscaled_X - TouchDeltaX, unscaled_Y - TouchDeltaY);
renderer.updateFrame();
}
}
/**
* affiche une grosse carte carte quand une carte est sélectionner
* @param event
*/
private void bigCardHandler(MotionEvent event)
{
//calcul y,x sur une echelle de 0 a 100
@@ -103,50 +104,78 @@ public class TouchHandler {
DrawableCard smallCArd = renderer.getCardOn(unScalled_X,unScalled_Y);
if(smallCArd !=null)
{
if(smallCardUserForBig !=null)
if(smallCardUsedForBig !=null)
{
smallCardUserForBig.setCoordinates(smallCardUserForBig.getX(), smallCardUserForBig.getY() + SELECTING_OFFSET);
//on update pas affin d'avoir un rendu plus fluide au moment de mettre l'aure carte
renderer.removeToDrawWithoutUpdate(smallCardUserForBig.getName()+"BIG");
renderer.removeToDrawWithoutUpdate(smallCardUsedForBig.getName()+"BIG");
}
smallCardUserForBig = smallCArd;
smallCardUsedForBig = smallCArd;
DrawableCard bigCard = new DrawableCard(smallCArd,context,2);
renderer.addToDraw(bigCard);
bigCard.setCoordinates(72F,10F);
//on ne décale pas la carte sélectionner si ce n'est pas notre tours
if(gameLogic.isYourTurn())smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET);
//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 (smallCardUserForBig != null) {
renderer.removeToDraw(smallCardUserForBig.getName() + "BIG");
smallCardUserForBig = null;
}
}
}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)
{
//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);
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(smallCardUserForBig);
if(zone != -1)
}else if(event.getAction() == MotionEvent.ACTION_UP) {
int zone = playableZonesHandler.getHoveredZone(dragAndDropCard);
if(zone != -1)
{
dragAndDropCard.setOnBoard(true);
dragAndDropCard.setCoordinates((DrawableCard.getCardWith()+1)*zone,55F);
dragAndDropCard.setDraggable(false);
gameLogic.onCardPlayed(dragAndDropCard,zone);
}else{
if(dragAndDropCard != null)renderer.moveToDraw(originalPositionX,originalPositionY, dragAndDropCard.getName());
}
playableZonesHandler.hidePlayableZones(renderer);
}
}
}
private void handSelectionHandler(MotionEvent event)
{
float unScalled_Y = event.getY() / GameActivity.screenHeight * 100;
float unScalled_X = event.getX() / GameActivity.screenWidth * 100;
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)))
{
dragAndDropCard.setOnBoard(true);
dragAndDropCard.setCoordinates((DrawableCard.getCardWith()+1)*zone,55F);
dragAndDropCard.setDraggable(false);
}else{
dragAndDropCard.setCoordinates(dragAndDropCard.getX(),dragAndDropCard.getY() + SELECTING_OFFSET);
smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET);
cardSeletedInHand=smallCArd;
renderer.updateFrame();
}
}
}
}