Jeu Vidéo 2D java : lien entre keyListener et objet Swing Timer

Fermé
Thom1992 - Modifié par KX le 24/07/2016 à 17:42
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 24 juil. 2016 à 18:22
Bonjour,

Je suis en train de programmer un jeu vidéo 2D en java et pour créer mes personnages, j'ai trouvé ce code sur internet. Pourtant, j'ai eu beau faire je ne comprends pas l'intérêt de l'objet Timer, ni pourquoi on utilise la méthode actionPerformed, plutôt que d'utiliser simplement la méthode keyPressed de la class keyListener. Je sais qu'il y-a des manières plus simples de faire et j'en ai trouvé certaines n'utilisant pas l'objet Timer et la méthode actionPerformed, mais le problème continu de me trotter dans la tête.
Si vous pouviez m'éclairer. Merci d'avance.

Le code est le suivant :

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;

import javax.swing.JPanel;

public class Character extends JPanel implements KeyListener, ActionListener {

    Timer t = new Timer(100, this);
    int x = 0, y = 0;
    int velX = 0, velY = 0;

    public Character() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLUE);
        g.fillRect(x, y, 100, 100);
    }

    public void actionPerformed(ActionEvent e) {
        x += velX;
        y += velY;
    }

    public void keyPressed(KeyEvent e) {
        int c = e.getKeyCode();
        if (c == KeyEvent.VK_UP) {
            velX = 0;
            velY = -2;
        }
        if (c == KeyEvent.VK_DOWN) {
            velX = 0;
            velY = 2;
        }
        if (c == KeyEvent.VK_LEFT) {
            velX = -2;
            velY = 0;
        }
        if (c == KeyEvent.VK_RIGHT) {
            velX = 2;
            velY = 0;
        }
    }

    public void keyTyped(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }
}
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
24 juil. 2016 à 18:22
Bonjour,

"j'ai trouvé ce code sur internet"
Visiblement tu es mal tombé, tu aurais pu trouver mieux...

"je ne comprends pas l'intérêt de l'objet Timer"
Il ne sert à rien car il n'est jamais utilisé. En plus il est mal construit.

"pourquoi on utilise la méthode actionPerformed, plutôt que d'utiliser simplement la méthode keyPressed de la class keyListener."
actionPerformed ne sert à rien non plus, car on ne peut pas associer un ActionListener à un JPanel (il n'y a pas de méthode addActionListener).

De plus je t'invites à :
  • utiliser plutôt un switch qu'une succession de if
  • utiliser un Component plutôt qu'un JPanel (inutile)
  • implémenter le KeyListener dans une classe à part
  • ne pas nommer ta classe Character ni avec aucun autre nom de classe déjà existant dans java.lang

Exemple :

import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;

public class CharacterComponent extends Component {

    private static final long serialVersionUID = 1L;

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
}

import java.awt.Component;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class TranslateKeyListener extends KeyAdapter {

    private final Component component;

    public TranslateKeyListener(Component component) {
        this.component = component;
    }

    @Override
    public void keyPressed(KeyEvent e) {
        Rectangle bounds = component.getBounds();
        switch (e.getKeyCode()) {
        case KeyEvent.VK_UP:
            bounds.y -= 2;
            break;
        case KeyEvent.VK_DOWN:
            bounds.y += 2;
            break;
        case KeyEvent.VK_LEFT:
            bounds.x -= 2;
            break;
        case KeyEvent.VK_RIGHT:
            bounds.x += 2;
            break;
        default:
            return;
        }
        component.setBounds(bounds);
    }
}

import javax.swing.JFrame;

public class Test {
    public static void main(String[] args) {
        CharacterComponent character = new CharacterComponent();
        character.setBounds(200, 200, 100, 100);

        JFrame frame = new JFrame();
        frame.setLayout(null);
        frame.setSize(500, 500);
        frame.add(character);
        frame.addKeyListener(new TranslateKeyListener(character));
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
0