refactor des drawable + debut du code des zones placable

This commit is contained in:
marc barbier
2020-10-28 13:09:07 +01:00
parent f46e43a62e
commit 020d5ecda2
8 changed files with 187 additions and 122 deletions
@@ -8,29 +8,53 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Board { public class Board {
private static final int MAX_CARD_ON_BOARD=10; public static final int MAX_CARD_ON_BOARD=5;
private List<Card> advCardsOnBoard; private Card[] advCardsOnBoard;
private List<Card> playerCardsOnBoard; private Card[] playerCardsOnBoard;
public Board() public Board()
{ {
advCardsOnBoard = new ArrayList<>(); advCardsOnBoard = new Card[MAX_CARD_ON_BOARD];
playerCardsOnBoard = new ArrayList<>(); playerCardsOnBoard = new Card[MAX_CARD_ON_BOARD];
} }
/** /**
* joue une carte et l'ajoute au terrain du joueur correspondant * 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 card
* @param player * @param player
* @return success/failure
*/ */
public void playCard(Card card,Player player) public boolean playCard(Card card,Player player)
{ {
boolean returnvalue = false;
if(player instanceof PlayerLocal) if(player instanceof PlayerLocal)
{ {
playerCardsOnBoard.add(card); for(Card c : playerCardsOnBoard)
{
if(c == null)
{
c=card;
returnvalue=true;
break;
}
}
}else{ }else{
advCardsOnBoard.add(card); for(Card c : advCardsOnBoard)
{
if(c == null)
{
c=card;
returnvalue=true;
break;
}
}
} }
card.onCardPlayed(this,player); card.onCardPlayed(this,player);
return returnvalue;
}
public Card[] getPlayerCardsOnBoard() {
return playerCardsOnBoard;
} }
} }
@@ -12,6 +12,7 @@ import com.iutlaval.myapplication.Game.Decks.DeckDemo;
import com.iutlaval.myapplication.GameActivity; import com.iutlaval.myapplication.GameActivity;
import com.iutlaval.myapplication.R; import com.iutlaval.myapplication.R;
import com.iutlaval.myapplication.Video.Drawables.Drawable; 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.DrawableCard;
import com.iutlaval.myapplication.Video.Renderer; import com.iutlaval.myapplication.Video.Renderer;
@@ -25,6 +26,7 @@ public class GameLogicThread extends Thread{
private Deck localPlayerDeck; private Deck localPlayerDeck;
private Hand localPlayerHand; private Hand localPlayerHand;
private Board board;
public GameLogicThread(GameActivity gameActivity, Renderer renderer) public GameLogicThread(GameActivity gameActivity, Renderer renderer)
{ {
@@ -37,6 +39,7 @@ public class GameLogicThread extends Thread{
localPlayerHand = new Hand(); localPlayerHand = new Hand();
localPlayerHand.fillHand(localPlayerDeck); localPlayerHand.fillHand(localPlayerDeck);
this.gameActivity=gameActivity; this.gameActivity=gameActivity;
board=new Board();
GameActivity.setGameEngine(this); GameActivity.setGameEngine(this);
} }
@@ -49,7 +52,7 @@ public class GameLogicThread extends Thread{
Log.e("RESOLUTION:",""+GameActivity.screenWidth+"x"+GameActivity.screenHeight); Log.e("RESOLUTION:",""+GameActivity.screenWidth+"x"+GameActivity.screenHeight);
//affichage de l'arriere plan //affichage de l'arriere plan
Bitmap bitmap= BitmapFactory.decodeResource(cont.getResources(), R.drawable.t_b_board_background); Bitmap bitmap= BitmapFactory.decodeResource(cont.getResources(), R.drawable.t_b_board_background);
renderer.addToDraw(new Drawable(bitmap, 0,0, "background", 100, 100 )); renderer.addToDraw(new DrawableBitmap(bitmap, 0,0, "background", 100, 100 ));
drawHandPreview(); drawHandPreview();
ready=true; ready=true;
@@ -61,6 +64,9 @@ public class GameLogicThread extends Thread{
renderer.updateFrame(); renderer.updateFrame();
} }
/**
* cette methode est UNIQUEMENT a bute de test elle ne sert a rien d'autre ne pas s'en servir
*/
private void drawHandPreview() { private void drawHandPreview() {
int i = 0; int i = 0;
for(Card c : localPlayerHand.getHand()) for(Card c : localPlayerHand.getHand())
@@ -74,7 +80,7 @@ public class GameLogicThread extends Thread{
/** /**
* cette fonction est appeller a chaque fin de frame * cette fonction est appeller a chaque fin de frame
* CETTE FONCTION A UN IMPACT DIRRECT SUR LES FPS ELLE SE DOIT D'être OPTIMAL * CETTE FONCTION A UN IMPACT DIRECT SUR LES FPS ELLE SE DOIT D'être OPTIMAL
* TOUT CALCUL REDONDANT CE DOIT D'AVOIR ETE PRE FAIT * TOUT CALCUL REDONDANT CE DOIT D'AVOIR ETE PRE FAIT
* *
* TOUT APELLE DE CETTE FONCTION SE DOIT D'ÊTRE PROTEGER PAR isReady() * TOUT APELLE DE CETTE FONCTION SE DOIT D'ÊTRE PROTEGER PAR isReady()
@@ -105,10 +111,12 @@ public class GameLogicThread extends Thread{
*/ */
public void onTouchEvent(MotionEvent event) { public void onTouchEvent(MotionEvent event) {
if(isReady()){ if(isReady()){
float unscalled_Y = event.getY() / GameActivity.screenHeight * 100; //calcul y sur une echelle de 0 a 100
if(unscalled_Y >= 90F && event.getAction() == MotionEvent.ACTION_DOWN) { float scalled_Y = event.getY() / GameActivity.screenHeight * 100;
//si on clique sur une carte dans la main
if(event.getAction() == MotionEvent.ACTION_DOWN) {
float unscalled_X = event.getX() / GameActivity.screenWidth * 100; float unscalled_X = event.getX() / GameActivity.screenWidth * 100;
DrawableCard smallCArd = renderer.getCardOn(unscalled_X,unscalled_Y); DrawableCard smallCArd = renderer.getCardOn(unscalled_X,scalled_Y);
if(smallCArd !=null) if(smallCArd !=null)
{ {
if(currentlySelected !=null) if(currentlySelected !=null)
@@ -122,8 +130,8 @@ public class GameLogicThread extends Thread{
renderer.addToDraw(bigCard); renderer.addToDraw(bigCard);
bigCard.setCoordinates(72F,10F); bigCard.setCoordinates(72F,10F);
smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET); smallCArd.setCoordinates(smallCArd.getX(),smallCArd.getY() - SELECTING_OFFSET);
touch.onTouchEvent(event);
} }
touch.onTouchEvent(event);
}else if(event.getAction() == MotionEvent.ACTION_UP){ }else if(event.getAction() == MotionEvent.ACTION_UP){
//currentlySelected.setCoordinates(currentlySelected.getX(),currentlySelected.getY() + SELECTING_OFFSET); //currentlySelected.setCoordinates(currentlySelected.getX(),currentlySelected.getY() + SELECTING_OFFSET);
touch.onTouchEvent(event); touch.onTouchEvent(event);
@@ -139,4 +147,19 @@ public class GameLogicThread extends Thread{
} }
} }
public void displayPlayableZones()
{
Card[] cardsOnBoard = board.getPlayerCardsOnBoard();
for(int i=0 ; i < cardsOnBoard.length ;i++)
{
if(cardsOnBoard[i] == null)
{
displayPlayableZoneOn(i);
}
}
}
private void displayPlayableZoneOn(int i) {
}
} }
@@ -37,8 +37,6 @@ public class GameActivity extends Activity {
renderer = new Renderer(getBaseContext(),this); renderer = new Renderer(getBaseContext(),this);
setContentView(renderer); setContentView(renderer);
} }
@@ -17,7 +17,7 @@ import com.iutlaval.myapplication.Video.Rectangle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class Drawable { public abstract class Drawable {
private float x,y; private float x,y;
private String name; private String name;
@@ -37,73 +37,6 @@ public class Drawable {
this.name=name; this.name=name;
} }
/**
* @param bitmap a dessiner
* @param x_pos position en x du texte
* @param y_pos position en y du texte
* @param name nom du Drawable
* @param x_size taille du drawable entre 0 et 100
* @param y_size taille du drawable entre 0 et 100
* @throws InvalidDataException
*/
public Drawable(@NonNull Bitmap bitmap, float x_pos, float y_pos, String name, float x_size, float y_size){
this(x_pos,y_pos,name);
float x_scaled_size = x_size* GameActivity.screenWidth/100;
float y_scaled_size = y_size* GameActivity.screenHeight/100;
if(x_scaled_size <=0 || y_scaled_size <=0)
{
Log.e("DRAWABLE_TEXTURE :","ERREUR DE MISE A L'ECHELLE");
System.exit(ERROR_CODE.ERROR_TEXTURE_DIMENSIONS_INVALID.ordinal());
}
this.bitmap = Bitmap.createScaledBitmap(bitmap, (int)x_scaled_size, (int)y_scaled_size, GameActivity.bilinearFiltering);
}
/**
* ce constructeur n'est pas rapide essayer de l'utiliser le moin possible
* TODO : optimize it
*
* ce constructeur dessine un rectangle avec la texture donner en argument
* @param rectangle recange cooresspondant a la surface a dessiner
* @param name nom du drawable agit comme un identifiant mais doit être unique
* @param color couleur du rectangle
*/
public Drawable(Rectangle rectangle, String name, int color) throws InvalidDataException {
this(rectangle.getPositionX(),rectangle.getPositionY(),name);
if(rectangle.getHeight() <= 0 || rectangle.getWidth() <=0)throw new InvalidDataException(name,rectangle);
rectangle.scaleRectangleToScreen();
Bitmap bitmap = Bitmap.createBitmap((int)rectangle.getWidth(),(int)rectangle.getHeight(), Bitmap.Config.ARGB_8888);
rectangle.bitmapRectangleBuilder(bitmap,color);
this.bitmap=bitmap;
}
/**
* ce constructeur n'est pas tres rapide donc a eviter il utilse pas mal de ram mais sava encore le gc de java s'en ocupe vite
* ce constructeur dessine un rectangle avec la texture donner en argument
* @param bitmap
* @param rectangle recange cooresspondant a la surface a dessiner
* @param name nom du drawable agit comme un identifiant mais doit être unique
* @param color couleur du rectangle
* @throws InvalidDataException
*/
//TODO verifier l'utiliter de ce constructeur
@Deprecated
public Drawable(Bitmap bitmap,Rectangle rectangle, String name, int color) throws InvalidDataException {
this(rectangle.getPositionX(),rectangle.getPositionY(),name);
if(rectangle.getHeight() <= 0 || rectangle.getWidth() <=0 || bitmap == null)throw new InvalidDataException(name,rectangle);
rectangle.scaleRectangleToScreen();
rectangle.bitmapRectangleBuilder(bitmap,color);
this.bitmap = bitmap;
}
/** /**
* NE PAS UTLISER CETTE FONCTION EST RESERVER AU FONCTIONNEMENT DU MOTEUR GRAPHIQUE * NE PAS UTLISER CETTE FONCTION EST RESERVER AU FONCTIONNEMENT DU MOTEUR GRAPHIQUE
* SI VOUS EN AVEZ BESOIN ENTRE EN CONTACT AVEC MARC POUR AJOUTER AU MOTEUR LA FONCTIONNALITER QUE VOUS AVEZ BESOIN * SI VOUS EN AVEZ BESOIN ENTRE EN CONTACT AVEC MARC POUR AJOUTER AU MOTEUR LA FONCTIONNALITER QUE VOUS AVEZ BESOIN
@@ -168,40 +101,6 @@ public class Drawable {
p = new Paint(); p = new Paint();
} }
/**
* coupe le texte a une certaine longeur
* @param charPerLines nombre de caractére par lignes
* @param text texte a afficher
* @return liste de lignes de texte
*/
protected List<String> cutText(int charPerLines,String text)
{
List<String> output = new ArrayList<>();
//TODO cut text in lines
StringBuilder nextLine = new StringBuilder(charPerLines);
for (String word : text.split(" ")) {
if(word.length() < charPerLines)
{
if(word.length() + nextLine.toString().length() +1 < charPerLines)
{
nextLine.append(" " + word);
}else{
//fillWithSpace(nextLine,charPerLines);
output.add(nextLine.toString());
nextLine.delete(0,charPerLines-1);
}
}else{
Log.e("TextRender","ERROR WORD TOO LONG :" + word);
}
}
if(!nextLine.toString().equals(""))
{
//fillWithSpace(nextLine,charPerLines);
output.add(nextLine.toString());
}
return output;
}
protected void scale(float i) { protected void scale(float i) {
bitmap = Bitmap.createScaledBitmap(this.bitmap,(int)(bitmap.getWidth()*i),(int)(bitmap.getHeight()*i),GameActivity.bilinearFiltering); bitmap = Bitmap.createScaledBitmap(this.bitmap,(int)(bitmap.getWidth()*i),(int)(bitmap.getHeight()*i),GameActivity.bilinearFiltering);
} }
@@ -0,0 +1,36 @@
package com.iutlaval.myapplication.Video.Drawables;
import android.graphics.Bitmap;
import android.util.Log;
import androidx.annotation.NonNull;
import com.iutlaval.myapplication.ERROR_CODE;
import com.iutlaval.myapplication.GameActivity;
import com.iutlaval.myapplication.InvalidDataException;
public class DrawableBitmap extends Drawable{
/**
* @param bitmap a dessiner
* @param x_pos position en x du texte
* @param y_pos position en y du texte
* @param name nom du Drawable
* @param x_size taille du drawable entre 0 et 100
* @param y_size taille du drawable entre 0 et 100
* @throws InvalidDataException
*/
public DrawableBitmap(@NonNull Bitmap bitmap, float x_pos, float y_pos, String name, float x_size, float y_size){
super(x_pos,y_pos,name);
float x_scaled_size = x_size* GameActivity.screenWidth/100;
float y_scaled_size = y_size* GameActivity.screenHeight/100;
if(x_scaled_size <=0 || y_scaled_size <=0)
{
Log.e("DRAWABLE_TEXTURE :","ERREUR DE MISE A L'ECHELLE");
System.exit(ERROR_CODE.ERROR_TEXTURE_DIMENSIONS_INVALID.ordinal());
}
setBitmap(Bitmap.createScaledBitmap(bitmap, (int)x_scaled_size, (int)y_scaled_size, GameActivity.bilinearFiltering));
}
}
@@ -151,7 +151,7 @@ public class DrawableCard extends Drawable{
this.ratio=ratio; this.ratio=ratio;
this.card=c; this.card=c;
frameDrawable = new Drawable(c.getFrameBitmap(context),0,0,name+"frame",CARD_WITH*ratio,CARD_HEIGHT*ratio); frameDrawable = new DrawableBitmap(c.getFrameBitmap(context),0,0,name+"frame",CARD_WITH*ratio,CARD_HEIGHT*ratio);
//to string retourne le hash code de l'objet qui est donc unique ce qui fait de lui un id parfait //to string retourne le hash code de l'objet qui est donc unique ce qui fait de lui un id parfait
cardDescription = new DrawableText(c.getDescription(),0,0,toString()+"description",DESCRIPTION_WIDTH*ratio,DESCRIPTION_HEIGHT*ratio,DESCRIPTION_FONT_SIZE,DESCRIPTION_TEXT_X_RES,DESCRIPTION_TEXT_Y_RES); cardDescription = new DrawableText(c.getDescription(),0,0,toString()+"description",DESCRIPTION_WIDTH*ratio,DESCRIPTION_HEIGHT*ratio,DESCRIPTION_FONT_SIZE,DESCRIPTION_TEXT_X_RES,DESCRIPTION_TEXT_Y_RES);
cardTitle = new DrawableText(c.getName(),0,0,toString()+"name",TITLE_WIDTH*ratio,TITLE_HEIGHT*ratio,TITLE_FONT_SIZE,TEXT_TITLE_X_RES,TEXT_TITLE_Y_RES); cardTitle = new DrawableText(c.getName(),0,0,toString()+"name",TITLE_WIDTH*ratio,TITLE_HEIGHT*ratio,TITLE_FONT_SIZE,TEXT_TITLE_X_RES,TEXT_TITLE_Y_RES);
@@ -160,8 +160,8 @@ public class DrawableCard extends Drawable{
Bitmap pictureBitmap = BitmapFactory.decodeResource(context.getResources(),c.getCardPicture()); Bitmap pictureBitmap = BitmapFactory.decodeResource(context.getResources(),c.getCardPicture());
try { try {
opacityRectangleDrawable = new Drawable(opacityRect,toString()+"Opacity", Color.parseColor(c.getColor())); opacityRectangleDrawable = new DrawableRectangle(opacityRect,toString()+"Opacity", Color.parseColor(c.getColor()));
pictureDrawable = new Drawable(pictureBitmap,0,0,toString()+"Picture",PICTURE_WIDTH*ratio,PICTURE_HEIGHT*ratio); pictureDrawable = new DrawableBitmap(pictureBitmap,0,0,toString()+"Picture",PICTURE_WIDTH*ratio,PICTURE_HEIGHT*ratio);
} catch (InvalidDataException e) { } catch (InvalidDataException e) {
e.printStackTrace(); e.printStackTrace();
Log.e("CARTE :","forme de la carte invalide !"); Log.e("CARTE :","forme de la carte invalide !");
@@ -187,7 +187,7 @@ public class DrawableCard extends Drawable{
cardOnBoardAtk.bitmapRectangleBuilder(cardOnBoardBitmap,Color.parseColor("#FFFF0000")); cardOnBoardAtk.bitmapRectangleBuilder(cardOnBoardBitmap,Color.parseColor("#FFFF0000"));
cardOnBoardHp.bitmapRectangleBuilder(cardOnBoardBitmap,Color.parseColor("#FF00FF00")); cardOnBoardHp.bitmapRectangleBuilder(cardOnBoardBitmap,Color.parseColor("#FF00FF00"));
cardOnBoardDrawable = new Drawable(cardOnBoardBitmap,x,y,toString()+"BOARD",CARD_ON_BOARD_DRAWABLE_WIDTH*ratio,CARD_ON_BOARD_DRAWABLE_HEIGHT*ratio); cardOnBoardDrawable = new DrawableBitmap(cardOnBoardBitmap,x,y,toString()+"BOARD",CARD_ON_BOARD_DRAWABLE_WIDTH*ratio,CARD_ON_BOARD_DRAWABLE_HEIGHT*ratio);
c.setDrawableCard(this); c.setDrawableCard(this);
@@ -0,0 +1,49 @@
package com.iutlaval.myapplication.Video.Drawables;
import android.graphics.Bitmap;
import com.iutlaval.myapplication.InvalidDataException;
import com.iutlaval.myapplication.Video.Rectangle;
public class DrawableRectangle extends Drawable{
/**
* ce constructeur n'est pas rapide essayer de l'utiliser le moin possible
* TODO : optimize it
*
* ce constructeur dessine un rectangle avec la couleur donné en argument
* @param rectangle recange cooresspondant a la surface a dessiner
* @param name nom du drawable agit comme un identifiant mais doit être unique
* @param color couleur du rectangle
*/
public DrawableRectangle(Rectangle rectangle, String name, int color) throws InvalidDataException {
super(rectangle.getPositionX(),rectangle.getPositionY(),name);
if(rectangle.getHeight() <= 0 || rectangle.getWidth() <=0)throw new InvalidDataException(name,rectangle);
rectangle.scaleRectangleToScreen();
Bitmap bitmap = Bitmap.createBitmap((int)rectangle.getWidth(),(int)rectangle.getHeight(), Bitmap.Config.ARGB_8888);
rectangle.bitmapRectangleBuilder(bitmap,color);
setBitmap(bitmap);
}
/**
* ce constructeur n'est pas tres rapide donc a eviter il utilse pas mal de ram mais sava encore le gc de java s'en ocupe vite
* ce constructeur dessine un rectangle avec la couleur donné" en argument
* @param bitmap
* @param rectangle recange cooresspondant a la surface a dessiner
* @param name nom du drawable agit comme un identifiant mais doit être unique
* @param color couleur du rectangle
* @throws InvalidDataException
*/
//TODO verifier l'utiliter de ce constructeur
@Deprecated
public DrawableRectangle(Bitmap bitmap,Rectangle rectangle, String name, int color) throws InvalidDataException {
super(rectangle.getPositionX(),rectangle.getPositionY(),name);
if(rectangle.getHeight() <= 0 || rectangle.getWidth() <=0 || bitmap == null)throw new InvalidDataException(name,rectangle);
rectangle.scaleRectangleToScreen();
rectangle.bitmapRectangleBuilder(bitmap,color);
setBitmap(bitmap);
}
}
@@ -3,9 +3,11 @@ package com.iutlaval.myapplication.Video.Drawables;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.util.Log;
import com.iutlaval.myapplication.GameActivity; import com.iutlaval.myapplication.GameActivity;
import java.util.ArrayList;
import java.util.List; import java.util.List;
public class DrawableText extends Drawable{ public class DrawableText extends Drawable{
@@ -47,4 +49,38 @@ public class DrawableText extends Drawable{
setBitmap(Bitmap.createScaledBitmap(bitmap,scalled_x_size,scalled_y_size,GameActivity.bilinearFiltering)); setBitmap(Bitmap.createScaledBitmap(bitmap,scalled_x_size,scalled_y_size,GameActivity.bilinearFiltering));
} }
/**
* coupe le texte a une certaine longeur
* @param charPerLines nombre de caractére par lignes
* @param text texte a afficher
* @return liste de lignes de texte
*/
private List<String> cutText(int charPerLines,String text)
{
List<String> output = new ArrayList<>();
//TODO cut text in lines
StringBuilder nextLine = new StringBuilder(charPerLines);
for (String word : text.split(" ")) {
if(word.length() < charPerLines)
{
if(word.length() + nextLine.toString().length() +1 < charPerLines)
{
nextLine.append(" " + word);
}else{
//fillWithSpace(nextLine,charPerLines);
output.add(nextLine.toString());
nextLine.delete(0,charPerLines-1);
}
}else{
Log.e("TextRender","ERROR WORD TOO LONG :" + word);
}
}
if(!nextLine.toString().equals(""))
{
//fillWithSpace(nextLine,charPerLines);
output.add(nextLine.toString());
}
return output;
}
} }