From 353f8cd248ed661e8ca07dfdadf7232e45a2de5e Mon Sep 17 00:00:00 2001 From: marc barbier Date: Sun, 13 Dec 2020 13:23:17 +0100 Subject: [PATCH] patch connection + jouer carte + patch timeout + patch registry --- app/src/main/AndroidManifest.xml | 1 + .../Game/Cards/CardRegistery.java | 11 +- .../myapplication/Game/GameLogicThread.java | 124 +++++++++++++----- .../myapplication/Game/TouchHandler.java | 3 +- .../myapplication/Video/Renderer.java | 1 + 5 files changed, 105 insertions(+), 35 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 78aeaeb..a3ee35e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + class1) { + public static int indexOf(Class class1) { int a = registry.indexOf(class1); + + if(a == -1){ + throw new RuntimeException("Class not found :"+class1.getName()); + } + //if the class is not found default to 0 return a != -1 ? a : 0; } @@ -216,7 +221,7 @@ public class CardRegistery { } - public static int get(Card card) { - return get(card.getClass()); + public static int indexOf(Card card) { + return indexOf(card.getClass()); } } diff --git a/app/src/main/java/com/iutlaval/myapplication/Game/GameLogicThread.java b/app/src/main/java/com/iutlaval/myapplication/Game/GameLogicThread.java index 6a5f5d8..e69ed0f 100644 --- a/app/src/main/java/com/iutlaval/myapplication/Game/GameLogicThread.java +++ b/app/src/main/java/com/iutlaval/myapplication/Game/GameLogicThread.java @@ -11,7 +11,6 @@ import com.iutlaval.myapplication.Game.Cards.Card; import com.iutlaval.myapplication.Game.Cards.CardRegistery; 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; @@ -23,8 +22,10 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.OptionalDataException; import java.lang.reflect.Constructor; import java.net.Socket; +import java.net.SocketException; public class GameLogicThread extends Thread{ @@ -49,6 +50,14 @@ public class GameLogicThread extends Thread{ private String deckName; private int mana=0; + + //ces variable permette la comunication avec le thread android du tactile et le reseau en passant par ce thread + boolean requestDone=true; + DrawableCard requestCard=null; + int requestZone=-1; + boolean requestResult; + + public GameLogicThread(GameActivity gameActivity, String deckName, Renderer renderer) { new CardRegistery(); @@ -83,8 +92,8 @@ public class GameLogicThread extends Thread{ ready=true; - final String host = "4.tcp.ngrok.io";//192.168.43.251tcp://2.tcp.ngrok.io: - final int port = 14307; + final String host = "0.tcp.ngrok.io";//192.168.43.251tcp://2.tcp.ngrok.io: + final int port = 11601; try { client = new Socket(host, port); @@ -99,13 +108,26 @@ 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 - - - while(ready && !cancelled) { + if(!requestDone && requestZone != -1 && requestCard != null) + { + try {//on allonge le delais car sinon on skip l'autorisation serveur + client.setSoTimeout(Integer.MAX_VALUE); + } catch (SocketException e) {} + requestResult = onCardPlayed(requestCard,requestZone); + requestZone=-1; + requestCard=null; + requestDone=true; + } + + try { + //on limite le temps du readobject pour eviter les blockaeg + client.setSoTimeout(1000); String serveurCmd = (String)clientIn.readObject(); + client.setSoTimeout(Integer.MAX_VALUE); + Log.e("command",serveurCmd); switch (serveurCmd) { case Command.GET_DECK: @@ -113,11 +135,17 @@ public class GameLogicThread extends Thread{ String deckstr = (String)clientIn.readObject(); deck = new NetworkDeck(deckstr,gameActivity.getBaseContext()); Log.e("got deck",deckstr); - - Log.e("recived","getdeck"); break; case Command.DRAW: - int nbcard = (Integer)clientIn.readObject(); + Object o = clientIn.readObject(); + int nbcard; + if(o instanceof String) + { + nbcard = Integer.parseInt((String) o); + }else{ + nbcard = (Integer)o; + } + hand.pickCardFromDeck(deck,nbcard); Log.e("picked",nbcard+"card"); drawHandPreview(); @@ -136,7 +164,6 @@ public class GameLogicThread extends Thread{ break; case Command.ENEMYTURN: - isYourTurn=false; renderer.addToDraw(new DrawableSelfRemoving(new DrawableBitmap(bitmapEnemyTurn,0,0,"enemyTurn",100F,50F),1)); break; @@ -146,6 +173,7 @@ public class GameLogicThread extends Thread{ popupToast.setText(recivedMessage); popupToast.setDuration(Toast.LENGTH_LONG); popupToast.show(); + Log.e("popup",recivedMessage); break; case Command.WIN: @@ -155,6 +183,7 @@ public class GameLogicThread extends Thread{ winToast.setText("bravo ! vous avez gagné"); winToast.setDuration(Toast.LENGTH_LONG); winToast.show(); + renderer.updateFrame(); break; case Command.LOSE: //on termine la partie @@ -184,16 +213,24 @@ public class GameLogicThread extends Thread{ //ajout la card au terain board.setEnemyCard(zone,cardPlayed); break; + default: Log.e("UNKOWN COMMAND",serveurCmd); } }catch (InterruptedIOException e) { + e.printStackTrace(); Log.e("Stopping","dead thread"); + }catch(IOException e) + { } catch (Exception e) { Log.e("ERROR DURING COMS","SERVER DIED"); e.printStackTrace(); + if(e instanceof OptionalDataException) + { + System.out.println(((OptionalDataException)e).eof); + } break; } } @@ -215,34 +252,52 @@ 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 + * CE CODE CONTIEN DE l'ACCES RESEAU QUI N'APPARTIEN QU'A CE THREAD IS DOIT RESTER PRIVE * @param card la carte jouer * @param zone ou elle a été joué sur le terrain * @return retourne si la carte a put être jouer */ - protected boolean onCardPlayed(DrawableCard card,int zone) + private boolean onCardPlayed(DrawableCard card,int zone) { - try { - //on veut jouer une carte - clientOut.writeObject(Command.PUT_CARD); - //on lui dit quelle caret on veut - int cardId = CardRegistery.get(card.getCard()); - if(cardId == -1){ - clientOut.writeObject("CLIENT REGISTRY ERROR"); - throw new UnrecognizedCard(); - } - clientOut.writeObject(cardId); - clientOut.writeObject(zone); + if(isYourTurn) + { + try { + //on veut jouer une carte + clientOut.writeObject(Command.PUT_CARD); - if(clientIn.readObject().equals(Command.OK)) + + //on lui dit quelle caret on veut + int cardId = CardRegistery.indexOf(card.getCard()); + if (cardId == -1) { + clientOut.writeObject("CLIENT REGISTRY ERROR"); + throw new UnrecognizedCard(); + } + clientOut.writeObject(cardId); + clientOut.writeObject(zone); + + if (clientIn.readObject().equals(Command.OK)) { + board.setCard(zone, card.getCard()); + return true; + } + }catch (Exception e) { - board.setCard(zone,card.getCard()); - return true; - }else{ - return false; + e.printStackTrace(); } - } catch (IOException | ClassNotFoundException e) { - return false; } + return true; + } + + protected boolean setOnCardPlayedRequest(DrawableCard card,int zone) + { + //on ne peut pas avoir 2 requette simultané + while(!requestDone); + this.requestCard=card; + this.requestZone=zone; + requestDone=false; + + //on attends la fin de la requette + while(!requestDone); + return requestResult; } /** @@ -299,7 +354,6 @@ public class GameLogicThread extends Thread{ cancelled=true; interrupt(); - } public void onEndTurnButtonPushed() { @@ -317,4 +371,12 @@ public class GameLogicThread extends Thread{ t.show(); } } -} \ No newline at end of file + + public ObjectOutputStream getClientOut() { + return clientOut; + } + + public ObjectInputStream getClientIn() { + return clientIn; + } +} diff --git a/app/src/main/java/com/iutlaval/myapplication/Game/TouchHandler.java b/app/src/main/java/com/iutlaval/myapplication/Game/TouchHandler.java index 462e390..fbda507 100644 --- a/app/src/main/java/com/iutlaval/myapplication/Game/TouchHandler.java +++ b/app/src/main/java/com/iutlaval/myapplication/Game/TouchHandler.java @@ -48,6 +48,7 @@ public class TouchHandler { //on ignore le multi touch if(event.getPointerCount() <= 1) { + endTurnButtonHandle(event); handSelectionHandler(event); //afficher grosse carte bigCardHandler(event); @@ -146,7 +147,7 @@ public class TouchHandler { }else if(event.getAction() == MotionEvent.ACTION_UP) { int zone = playableZonesHandler.getHoveredZone(dragAndDropCard); - if(zone != -1 && gameLogic.onCardPlayed(dragAndDropCard,zone)) + if(zone != -1 && gameLogic.setOnCardPlayedRequest(dragAndDropCard,zone)) { dragAndDropCard.setOnBoard(true); dragAndDropCard.setCoordinates((DrawableCard.getCardWith()+1)*zone,55F); diff --git a/app/src/main/java/com/iutlaval/myapplication/Video/Renderer.java b/app/src/main/java/com/iutlaval/myapplication/Video/Renderer.java index 25ee991..fda900d 100644 --- a/app/src/main/java/com/iutlaval/myapplication/Video/Renderer.java +++ b/app/src/main/java/com/iutlaval/myapplication/Video/Renderer.java @@ -154,6 +154,7 @@ public class Renderer extends SurfaceView implements SurfaceHolder.Callback { Log.i("RENDERER","STARTING ENGINE"); engine = new GameLogicThread(gameActivity,deckName,renderer); + engine.setName("gameEngine"); engine.start(); while (!engine.isReady()); Log.i("RENDERER","ENGINE STARTED");