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
Image vaisseau : [url]http://zepload.com/images/1245316524_craft.png[/url]
Image missile : [url]http://zepload.com/images/1245316548_missile.png[/url]
Classe RType :
import java.awt.Color;
import javax.swing.JFrame;
public class RType extends JFrame {
// Constructeur
// -------------------------------------------
public RType() {
add(new Board());
setSize(400,300);
setTitle("R-Type");
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true); }
// Méthode main()
// -------------------------------------------
public static void main(String[] arg) {
new RType(); }
}
Classe Crat :
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon;
public class Craft {
private String craft = "craft.png";
private Image image;
private int dx, dy, x, y, craftHeight, craftWidth, speed;
private ArrayList missiles;
private Boolean
depLeft = false,
depRight = false,
depUp = false,
depDown = false;
// 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; }
}
Classe Board :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Board extends JPanel implements ActionListener {
private Timer timer;
private Craft craft;
// Constructeur
// -------------------------------------------
public Board() {
addKeyListener(new TAdapter());
setSize(400, 300);
setBackground(Color.BLACK);
setDoubleBuffered(true);
setFocusable(true);
craft = new Craft();
timer = new Timer(5, this);
timer.start(); }
// Méthode paintComponent
// -------------------------------------------
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
// Vaisseau
g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(), this);
// Missiles
ArrayList ms = craft.getMissiles();
for (int i=0; i<ms.size(); i++) {
Missile m = (Missile) ms.get(i);
g2d.drawImage(m.getImage(), m.getX(), m.getY(), this); }
// Synchro Linux et libération objet g
Toolkit.getDefaultToolkit().sync();
g.dispose(); }
// Méthode actionPerformed
// -------------------------------------------
public void actionPerformed(ActionEvent e) {
// Missiles
ArrayList ms = craft.getMissiles();
for (int i=0; i <ms.size(); i++) {
Missile m = (Missile) ms.get(i);
if (m.isVisible()) m.move();
else ms.remove(i); }
// Mouvement vaisseau
craft.move();
// Rafraîchissement
repaint(); }
// Classe interne TAdapter
// -------------------------------------------
class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {
craft.keyReleased(e); }
public void keyPressed(KeyEvent e) {
craft.keyPressed(e); }}
}
Classe Missile :
import java.awt.Image;
import java.awt.Rectangle;
import javax.swing.ImageIcon;
public class Missile {
private int x, y;
private Image image;
private Boolean visible;
private int height, width;
private final int BOARD_WIDTH = 390;
private final int MISSILE_SPEED = 2;
// Constructeur
// -------------------------------------------
public Missile(int x, int y) {
image = new ImageIcon(getClass().getResource("missile.png")).getImage();
this.x = x;
this.y = y;
width = image.getWidth(null);
height = image.getHeight(null);
visible = true; }
// Méthode isVisible()
// -------------------------------------------
public Boolean isVisible() {
return visible; }
// 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); }
}
Merci d'avance pour votre aide