Bonjour j'ai un soucis lorsque j'essaie de faire bouger un objet dessiner sur mon un JPanel à l'aide d'un Keylistener. Tout fonctionne parfaitement mais le soucis c'est qu'il faut que j'appuis plusieurs fois pour que l'objet se déplace hors j'aimerai qu'il bouge en continue dès que j'ai appuyé sur une touche. Voici l'ensemble de mon code :
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
private Scene scene;
Main(){
scene = new Scene();
setTitle("Game_simulation");
setSize(600,300);
setVisible(true);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(scene);
}
public static void main(String[] args) {
new Main();
}
}
class Scene extends JPanel implements KeyListener {
private Rect rect;
private Bullet bullet;
private Field field;
public Scene(){
addKeyListener(this);
setFocusable(true);
rect = new Rect(100,172,20,50);
field = new Field(0,223,600,40);
System.out.println(bullet.getPx());
}
//Objects in this Class don't move on their own
//I'll implement all methods responsible to animate the Objects
public void paintComponent(Graphics g){
g.setColor(Color.BLACK);//Background
g.fillRect(0,0,600,300);//Background
g.setColor(Color.BLUE);//Le rect soit le joueur
g.fillRect(rect.getPx(), rect.getPy(), rect.getL1(), rect.getL2());//Le rect soit le joueur
}
public void move_right (){
int c = 5;
int x = rect.getPx();//
x = x + c;
rect.setPx(x);//Updating ball position
if(x>600- rect.getL1()*2)
rect.setPx(40);
try {
Thread.sleep(10);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void move_left (){
int c = 5;
int x = rect.getPx();//
x = x - c;
rect.setPx(x);//Updating ball position
if(x<40)
rect.setPx(560);
try {
Thread.sleep(10);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println(e.getKeyCode());
if(e.getKeyCode()==68)
move_right();
if(e.getKeyCode()==81)
move_left();
}
@Override
public void keyReleased(KeyEvent e) {
}
}
class Rect {
int l1,l2;
int px;
int py;
public Rect(int x, int y, int l1, int l2){
this.px = x;
this.py = y;
this.l1 = l1;
this.l2 = l2;
}
int getL1(){
return this.l1;
}
int getL2(){
return this.l2;
}
void setPx(int x){
this.px = x;
}
int getPx(){
return this.px;
}
int getPy(){
return this.py;
}
}
Pour ce genre de choses, il faut retenir quelle touche est appuyée (gauche, droite ou aucune), et toutes les x millisecondes, faire bouger l'élément en fonction des touches appuyées, puis repeindre.
Bref il faut un timer. Swing en propose.
Il ne faut pas espérer faire marcher une fréquence trop forte par contre. Ça ne rend pas aussi bien qu'un moteur de rendu pour jeux vidéos, le concept de repaint() n'étant pas synchrone au moment où il est appelé.
déplacer un objet
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.