Jyhem2000
Messages postés9Date d'inscriptiondimanche 21 mai 2006StatutMembreDernière intervention 1 juillet 2009
-
19 juin 2009 à 13:49
Jyhem2000
Messages postés9Date d'inscriptiondimanche 21 mai 2006StatutMembreDernière intervention 1 juillet 2009
-
1 juil. 2009 à 16:48
Bonjour,
J'ai un probleme de déplacement de sprite dans un jeu, problème que je retrouve cependant dans bcp de jeu java que je trouve sur le net en open source...
Voici le code du jeu que j'ai essayé d'alléger au maximum.
J'ai gardé les missiles car le problème est flagrant : quand on tire un missile en mouvement (avec la barre espace), le vaisseau s'arrête de bouger. On voit dans les logs que la touche de déplacement a été relâchée alors que ce n'est pas le cas. Niveau gameplay c'est pas terrible
// Constructeur
// -------------------------------------------
public Craft() {
// Récupération de l'image du vaisseau
image = new ImageIcon(getClass().getResource(craft)).getImage();
// Récupération de tailles
craftWidth = image.getWidth(null);
craftHeight = image.getHeight(null);
// Tableau des missiles
missiles = new ArrayList();
// Position de départ et vitesse
speed = 1;
x = 40;
y = 60; }
// Méthode move()
// -------------------------------------------
public void move() {
// Déplacement
x += dx;
y += dy;
// Ne pas dépasser les bords
if (x < 1) x = 1;
if (y <1 ) y = 1;
if (x > 370) x = 370;
if (y > 250) y = 250; }
// Touches appuyées
// -------------------------------------------
public void keyPressed(KeyEvent e) {
// Récupération de la touche enfoncée
int key = e.getKeyCode();
// Actions
switch (key) {
case KeyEvent.VK_LEFT :
depLeft = true;
break;
case KeyEvent.VK_RIGHT :
depRight = true;
break;
case KeyEvent.VK_UP :
depUp = true;
break;
case KeyEvent.VK_DOWN :
depDown = true;
break; }
// MAJ
update(); }
// Touches relâchées
// -------------------------------------------
public void keyReleased(KeyEvent e) {
// Récupération de la touche relâchée
int key = e.getKeyCode();
// Actions & MAJ
switch (key) {
case KeyEvent.VK_SPACE :
fire();
break;
case KeyEvent.VK_LEFT :
depLeft = false;
System.out.println("Left released");
break;
case KeyEvent.VK_RIGHT :
depRight = false;
System.out.println("Right released");
break;
case KeyEvent.VK_UP :
depUp = false;
System.out.println("Up released");
break;
case KeyEvent.VK_DOWN :
depDown = false;
System.out.println("Down released");
break; }
// MAJ
update(); }
// Méthode update()
// -------------------------------------------
public void update() {
// Initialisation du déplacement à 0
dx = 0;
dy = 0;
// Déplacement
if (depLeft) dx = -speed;
if (depRight) dx = speed;
if (depDown) dy = speed;
if (depUp) dy = -speed; }
// Méthode fire()
// -------------------------------------------
public void fire() {
missiles.add(new Missile(x + craftWidth, y + craftHeight/2)); }
// Accesseurs
// -------------------------------------------
public int getX() { return x; }
public int getY() { return y; }
public Image getImage() { return image; }
public ArrayList getMissiles() { return missiles; }
// Méthode de déplacement du missile
// -------------------------------------------
public void move() {
x += MISSILE_SPEED;
if (x > BOARD_WIDTH) visible = false; }
// Accesseurs
// -------------------------------------------
public int getX() { return x; }
public int getY() { return y; }
public Image getImage() { return image; }
public void setVisible(boolean visible) { this.visible = visible; }
public Rectangle getBounds() { return new Rectangle(x, y, width, height); }
Comme tu ne connais pas ce langage, avant de dire que c'est lui qui a un bogue, demande-toi d'abord si c'est pas plutôt toi qui as fait une connerie. Je ne connais aucun jeu open source en Java qui souffre du symptome dont tu parles donc je maintiens que tu parles sans savoir. D'ailleurs, je n'ai pas ce problème dans mon jeu en 3D, j'avance avec les flèches du haut et je peux tirer en même temps avec espace ou avec le clic gauche.
Essaie avec une version de la JVM moins récente, par exemple le JDK 1.6 update 10.
Jyhem2000
Messages postés9Date d'inscriptiondimanche 21 mai 2006StatutMembreDernière intervention 1 juillet 2009 1 juil. 2009 à 16:48
Problème résolu...
3 petits points car maintenant que je sais d'où ça vient j'ai les nerfs mm si je suis satisfait de voir que ca fonctionne :)
Mon portable est relié à un switch qui me permet d'avoir un PC fixe et
PC portable relié au même écran, au même clavier, et à la même souris.
Quand je passe par le clavier du portable, ça fonctionne, quand je
passe par le clavier USB relié au switch, ca bug, de même que l'appui
sur 3 touches ne fonctionne pas du tout via la switch, mais très bien
directement sur le portable.
ENFIN !
C'est souvent quand c'est bête que l'on reste bloqué des heures j'ai l'impression...
Je ne suis pas d'accord avec toi, pas mal de jeux vidéo open source écrits en Java ne souffrent pas de ce symptome, merci de ne pas dire n'importe quoi.
De plus, c'est sûr que si tu crées une instance d'ImageIcon pour chaque missile, ça ne va pas le faire. Le constructeur agit de façon synchrone, il va bloquer le processus léger sur lequel il s'exécute tant que l'image n'est pas complètement chargée (du coup, l'Event Dispatch Thread ne peut rien faire d'autre). Crée une seule instance d'ImageIcon pour tous les missiles, stocke-là comme attribut de classe et non d'instance. Bon courage et surtout, évite de cracher sur les jeux vidéo Java open source car ce n'est vraiment pas le meilleur moyen d'obtenir de l'aide.
De la part d'un programmeur de jeux vidéo open source depuis maintenant presque 10 ans.
Jyhem2000
Messages postés9Date d'inscriptiondimanche 21 mai 2006StatutMembreDernière intervention 1 juillet 2009 19 juin 2009 à 17:35
Oula excuse-moi je crache pas du tout sur les projets / jeux open-source, loin de là, c'est grâce a eux que j'apprends.
Le problème tel que je le rencontre n'est pas que sur les jeux open-source d'ailleurs. Ne le prends donc pas mal, il s'agit d'un malentendu.
Je disais cela parce ce que je commençais a penser que c'était une limitation de JAVA, et comme je viens de commencer ce langage, ca me faisait un peu peur pour la suite.
Merci du conseil pour mon code :)
Cependant, j'ai le mm probleme avec la classe suivante (donc sans image) :
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public ToucheFleche()
{
frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.addKeyListener(this);
frame.setVisible(true);up down left = right = false;
}
@Override
publicvoid keyPressed( KeyEvent e )
{
switch( e.getKeyCode())
{
case KeyEvent.VK_UP:
if( ! up )
{
System.out.println("up");
}
up = true;
break;
case KeyEvent.VK_DOWN:
if( ! down )
{
System.out.println("down");
}
down = true;
break;
case KeyEvent.VK_LEFT:
if( ! left )
{
System.out.println("left");
}
left = true;
break;
case KeyEvent.VK_RIGHT:
if( ! right )
{
System.out.println("right");
}
right = true;
break;
default:
}
}
@Override
publicvoid keyReleased( KeyEvent e )
{
switch( e.getKeyCode())
{
case KeyEvent.VK_UP:
System.out.println("lache up");
up = false;
break;
case KeyEvent.VK_DOWN:
System.out.println("lache down");
down = false;
break;
case KeyEvent.VK_LEFT:
System.out.println("lache left");
left = false;
break;
case KeyEvent.VK_RIGHT:
System.out.println("lache right");
right = false;
break;
default:
}
}
@Override
publicvoid keyTyped( KeyEvent e ){}
}
Donc j'appuie sur UP par exemple (jai bien le message "up" dans la console).
Tout en maintenant UP, j'appuie sur ESPACE Pour simuler un shoot, et
quand je relâche ESPACE, le "lache up" apparait dans la console alors
que la touche est toujours maintenue enfoncée...
En gros quand je "relache" une touche, le prog les "relache" toutes.
Cependant, a priori d'autres ne rencontrent pas ce probleme, alors peut etre que le souci vient de ma bécane...
J'utilise Eclipse Version: 3.4.1 et ma JVM est la 1.6.0_14-b08.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Jyhem2000
Messages postés9Date d'inscriptiondimanche 21 mai 2006StatutMembreDernière intervention 1 juillet 2009 19 juin 2009 à 20:01
Oui je parle sans savoir, je débute.
J'ai cherché avant de venir poster ici, j'ai changé mes méthodes de déplacement, cherché sur le net, mis à jour ma JRE, mais rien n'y faisait.
Comme je rencontrais aussi le problème sur d'autre jeu, je ne remettais pas mon code en cause.
Je finissais donc par penser que le langage était fait comme ca, qu'il fallait s'y adapter avec des méthodes plus complexes.
Mais j'ai suivi ton conseil, et effectivement, le problème venait de ma bécane...
J'ai désinstallé le jre1.6.14 et ne trouvant pas de version plus ancienne, j'ai réinstallé la jre1.6.14, et là, tout marche nickel... Donc pour info, ne pas faire les mise a jour JAVA de manière automatique, d'abord désinstallé l'ancienne version, puis installer la nouvelle
1 semaine que je cherche d'autres méthodes de déplacement, des jeux open source java pour voir s'ils ont le mm prob, que je parcourt les forums, etc...
Bref, voila qui m'enlève une belle épine du pied :)
Encore merci !
Désolé si j'ai été un peu dur mais je pense vraiment qu'il faut d'abord se remettre en question. Ton problème est quand même curieux, je te conseille de configurer Java de façon à ce qu'il affiche la console pour que, quand un programme se lance, on puisse voir quelle JVM il utilise, entre "javaws -viewer" dans ton invite de commande sous Windows ou dans ton terminal sous Linux et va dans l'onglet "Avancé", il y a une rubrique qui traite du débogage, active les logs et la console. Bon courage.
Je te conseille de venir en parler à des spécialistes de la création de jeux Java sur www.javagaming.org (n'aies pas peur d'utiliser la langue de Shakespeare). Je ne reproduis pas ton bogue sinon j'aurais essayé de le corriger. Bon courage.