Libgdx : Gestion de la position d'un personnage
Bonjour à tous,
Alors voila mon problème, je suis actuellement en train de tester libgdx et pour m'aider je regarde certains tutos dont celui-ci : http://blogue.nbourre.profweb.ca/?p=519
Donc j'ai décidé de reprendre beaucoup son code afin de voir comment on peut arriver à un résultat rapidement sauf que finalement cela n'est pas aussi simple... A l'écran mon personnage (qui n'est d'autre qu'un cube blanc) n'avance pas, donc j'ai fait quelques testes avec des messages dans la console afin de voir la position en x et y de mon personnage dans un 1er temps dans la classe Personnage et ensuite dans ma classe de rendu et la je vois que dans ma classe Personnage le mouvement est bien pris en compte mais pas dans ma classe de rendu qui lui reste tout le temps à la même position. Pourtant le personnage est tout le temps appelé à partir d'une même instance.
Voila en gros mon problème en espèrent ne pas me tromper d'endroit pour poster.
Merci d'avance si vous voyez le problème :)
Un peu de code :
EcranJeu.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
| public class EcranJeu implements Screen, InputProcessor {
private Monde monde;
private MondeRendu rendu;
private MondeControle controleur;
@Override
public void show() {
this.monde = new Monde();
this.rendu = new MondeRendu(monde, false);
this.controleur = new MondeControle(monde);
Gdx.input.setInputProcessor(this);
}
@Override
public void render(float delta) {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
this.controleur.update(delta);
rendu.rendu();
}
@Override
public void resize(int largeur, int hauteur) {
rendu.setTaille(largeur, hauteur);
}
@Override
public void dispose() {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
//--------- METHODES INPUTPROCESSOR ---------//
@Override
public boolean keyDown(int codeCle) {
if (codeCle == Keys.LEFT) {
controleur.gauchePresse();
}
if (codeCle == Keys.RIGHT) {
controleur.droitePresse();
}
if (codeCle == Keys.UP) {
controleur.hautPresse();
}
if (codeCle == Keys.DOWN) {
controleur.basPresse();
}
return true;
}
@Override
public boolean keyTyped(char caractere) {
return false;
}
@Override
public boolean keyUp(int codeCle) {
if (codeCle == Keys.LEFT) {
controleur.gaucheLache();
}
if (codeCle == Keys.RIGHT) {
controleur.droiteLache();
}
if (codeCle == Keys.UP) {
controleur.hautLache();
}
if (codeCle == Keys.DOWN) {
controleur.basLache();
}
return false;
} |
Personnage.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| package ludo.libgdx.blablatime.perso;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
public class Personnage {
public static final float VITESSE = 1f; //vitesse de déplacement d'un personnage
public static final float TAILLE = 1f; //taille d'un personnage exprimée en unité de jeu
private int id; //identifiant du personnage
private String nom; //nom du peronnage
Vector2 position; //position du personnage
Vector2 acceleration; //accélération si le personnage doit courir
Vector2 vitesseDeplacement; //vitesse de déplacement du personnage
Rectangle limites; //les limites du personnage
//---------- CONSTRUCTEUR ---------//
public Personnage(int pId, String pNom, Vector2 pPosition) {
this.id = pId;
this.nom = pNom;
this.position = new Vector2(pPosition);
this.acceleration = new Vector2();
this.vitesseDeplacement = new Vector2();
this.limites = new Rectangle(position.x, position.y, TAILLE, TAILLE);
}
//---------- METHODES ----------//
public void update(float delta) {
position.add(vitesseDeplacement.tmp().mul(delta));
}
//---------- SET/GET ----------//
public int getId() {
return this.id;
}
public String getNom() {
return this.nom;
}
public void setVitesseDeplacement(Vector2 pVitesse) {
this.vitesseDeplacement = pVitesse;
}
public Vector2 getVitesseDeplacement() {
return this.vitesseDeplacement;
}
public void setPosition(Vector2 pPosition) {
this.position = pPosition;
}
public Vector2 getPosition() {
return this.position;
}
public void setAcceleration(Vector2 pAcceleration) {
this.acceleration = pAcceleration;
}
public Vector2 getAcceleration() {
return this.acceleration;
}
public void setLimites(Rectangle pLimites) {
this.limites = pLimites;
}
public Rectangle getLimites() {
return this.limites;
}
} |
Monde.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package ludo.libgdx.blablatime.monde;
import com.badlogic.gdx.math.Vector2;
import ludo.libgdx.blablatime.perso.PersoPrincipal;
public class Monde {
PersoPrincipal monPerso;
//---------- CONSTRUCTEUR ----------//
public Monde() {
creerMonde();
}
//---------- METHODES ----------//
private void creerMonde() {
monPerso = new PersoPrincipal(0, "Bob", new Vector2(30,16));
}
//---------- GET/SET ----------//
public PersoPrincipal getMonPerso() {
return this.monPerso;
}
} |
MondeRendu.java
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| package ludo.libgdx.blablatime.rendu;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import ludo.libgdx.blablatime.monde.Monde;
import ludo.libgdx.blablatime.perso.PersoPrincipal;
public class MondeRendu {
private static final float CAMERA_LARGEUR = 60f;
private static final float CAMERA_HAUTEUR = 33.750f;
private Monde monde;
private OrthographicCamera cam;
private ShapeRenderer debugRenderer;
private boolean debug;
private SpriteBatch spriteBatch;
private int largeur, hauteur; // Dimension de l'écran en pixel
private float pduX, pduY; // Facteurs de multiplication pour ajuster les positions et dimensions des unités du jeu en px
private Texture persoTexture;
//---------- CONSTRUCTEUR ----------//
public MondeRendu(Monde pMonde, boolean pDebug) {
this.monde = pMonde;
this.cam = new OrthographicCamera(CAMERA_LARGEUR, CAMERA_HAUTEUR);
this.cam.position.set(CAMERA_LARGEUR / 2f, CAMERA_HAUTEUR / 2f, 0);
this.cam.update();
spriteBatch = new SpriteBatch();
chargerTexture();
}
//---------- METHODES ---------//
public void setTaille(int pLargeur, int pHauteur) {
this.largeur = pLargeur;
this.hauteur = pHauteur;
pduX = (float)largeur / CAMERA_LARGEUR;
pduY = (float)hauteur / CAMERA_HAUTEUR;
}
private void chargerTexture() {
persoTexture = new Texture(Gdx.files.internal("textures/serpent.png"));
}
public void rendu() {
spriteBatch.begin();
dessinerPerso();
spriteBatch.end();
}
private void dessinerPerso() {
PersoPrincipal monPerso = monde.getMonPerso();
spriteBatch.draw(
persoTexture,
monPerso.getPosition().x * pduX,
monPerso.getPosition().y * pduY,
monPerso.TAILLE * pduX,
monPerso.TAILLE * pduY);
System.out.println("Perso rendu x : " + String.valueOf(monPerso.getPosition().x));
System.out.println("Perso rendu y : " + String.valueOf(monPerso.getPosition().y));
}
} |
MondeContole
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| package ludo.libgdx.blablatime.controle;
import java.util.HashMap;
import java.util.Map;
import ludo.libgdx.blablatime.monde.Monde;
import ludo.libgdx.blablatime.perso.PersoPrincipal;
public class MondeControle {
enum Keys {
GAUCHE, DROITE, HAUT, BAS
}
private Monde monde;
private PersoPrincipal monPerso;
static Map<Keys, Boolean> keys = new HashMap<MondeControle.Keys, Boolean>();
static {
keys.put(Keys.GAUCHE, false);
keys.put(Keys.DROITE, false);
keys.put(Keys.HAUT, false);
keys.put(Keys.BAS, false);
}
//--------- CONSTRUCTEUR ---------//
public MondeControle(Monde pMonde) {
monde = new Monde();
monPerso = monde.getMonPerso();
}
//--------- METHODES ----------//
public void gauchePresse() {
keys.get(keys.put(Keys.GAUCHE, true));
}
public void droitePresse() {
keys.get(keys.put(Keys.DROITE, true));
}
public void hautPresse() {
keys.get(keys.put(Keys.HAUT, true));
}
public void basPresse() {
keys.get(keys.put(Keys.BAS, true));
}
public void gaucheLache() {
keys.get(keys.put(Keys.GAUCHE, false));
}
public void droiteLache() {
keys.get(keys.put(Keys.DROITE, false));
}
public void hautLache() {
keys.get(keys.put(Keys.HAUT, false));
}
public void basLache() {
keys.get(keys.put(Keys.BAS, false));
}
// Méthode de mise à jour principale
public void update(float delta) {
processusEntree();
monPerso.update(delta);
}
// Modification des paramètres et de l"état du personnage
private void processusEntree() {
// Aller en haut
if (!keys.get(Keys.GAUCHE) && keys.get(Keys.HAUT) && !keys.get(Keys.BAS) && !keys.get(Keys.DROITE)) {
monPerso.getVitesseDeplacement().y = -monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = 0;
}
// Aller en bas
else if (!keys.get(Keys.GAUCHE) && !keys.get(Keys.HAUT) && keys.get(Keys.BAS) && !keys.get(Keys.DROITE)) {
monPerso.getVitesseDeplacement().y = monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = 0;
}
// Aller à gauche
else if (keys.get(Keys.GAUCHE) && !keys.get(Keys.HAUT) && !keys.get(Keys.BAS) && !keys.get(Keys.DROITE)) {
monPerso.getVitesseDeplacement().x = -monPerso.VITESSE;
monPerso.getVitesseDeplacement().y = 0;
}
// Aller à droite
else if (keys.get(Keys.DROITE) && !keys.get(Keys.HAUT) && !keys.get(Keys.BAS) && !keys.get(Keys.GAUCHE)) {
monPerso.getVitesseDeplacement().x = monPerso.VITESSE;
monPerso.getVitesseDeplacement().y = 0;
}
// Aller en diago haut/gauche
else if (keys.get(Keys.GAUCHE) && keys.get(Keys.HAUT) && !keys.get(Keys.BAS) && !keys.get(Keys.DROITE)) {
monPerso.getVitesseDeplacement().y = -monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = -monPerso.VITESSE;
}
// Aller en diago bas/gauche
else if (keys.get(Keys.GAUCHE) && !keys.get(Keys.HAUT) && keys.get(Keys.BAS) && !keys.get(Keys.DROITE)) {
monPerso.getVitesseDeplacement().y = monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = -monPerso.VITESSE;
}
// Aller en diago haut/droite
else if (keys.get(Keys.DROITE) && keys.get(Keys.HAUT) && !keys.get(Keys.BAS) && !keys.get(Keys.GAUCHE)) {
monPerso.getVitesseDeplacement().y = monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = -monPerso.VITESSE;
}
// Aller en diago bas/droite
else if (keys.get(Keys.DROITE) && !keys.get(Keys.HAUT) && keys.get(Keys.BAS) && !keys.get(Keys.GAUCHE)) {
monPerso.getVitesseDeplacement().y = monPerso.VITESSE;
monPerso.getVitesseDeplacement().x = monPerso.VITESSE;
}
else {
monPerso.getVitesseDeplacement().y = 0;
monPerso.getVitesseDeplacement().x = 0;
}
}
} |