2014-02-17 2 views
1

Итак, мой проект - создать игру типа shoot'em, и мне бы хотелось, чтобы при нажатии стрелок мой квадрат (который будет после космического корабля) изменит положение x; y. Нам удалось проверить, работает ли keylistener, поэтому мы уверены, что проблема связана с функцией repaint.Как перерисовать графику после использования Keylistener?

Pls помощь, вот наш код:

Класс п ° 1

import java.awt.Color; 


import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class Fenetre extends JFrame implements KeyListener { 
Panneau pan = new Panneau(); 
    public Fenetre(){    
    //nom de la fenetre 
    this.setTitle("Projet"); 
    //taille 
    this.setSize(450, 600); 
    //centrer la fenetre 
    this.setLocationRelativeTo(null); 
    //Fenetre toujours en premier plan 
    this.setAlwaysOnTop(true); 
    //arrêt du processus à la fermeture de la fenêtre 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    //Fenetre non redimensionnable 
    this.setResizable(false); 
    //Couleur du fond 
    this.setBackground(Color.DARK_GRAY); 

    //Instanciation d'un objet JPanel 
    JPanel pan = new JPanel(); 
    JPanel tir = new JPanel(); 
    //On prévient notre JFrame que notre JPanel sera son content pane 
    this.setContentPane(new Panneau()); 

    this.setVisible(true); 
    this.addKeyListener(this); 
    } 
@Override 
public void keyTyped(KeyEvent e) { 
    // TODO Auto-generated method stub 

} 


@Override 
public void keyPressed(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int c = e.getKeyCode(); 
     if(c==KeyEvent.VK_RIGHT){ 
      int x = pan.getPosX(); 
      x=x+10; 
      pan.setPosX(x); 
      pan.repaint(); 
      System.out.print("Droite ");} 
     if(c==KeyEvent.VK_LEFT){ 
      int x = pan.getPosX(); 
      x=x-10; 
      pan.setPosX(x); 
      pan.repaint(); 
      System.out.print("Gauche ");} 
     if(c==KeyEvent.VK_UP){ 
      int y = pan.getPosY(); 
      y=y+10; 
      pan.setPosY(y); 
      pan.repaint(); 
      System.out.print("Haut ");} 
     if(c==KeyEvent.VK_DOWN){ 
      int y = pan.getPosY(); 
      y=y-10; 
      pan.setPosY(y); 
      pan.repaint(); 
      System.out.print("Bas ");} 
     if(c==KeyEvent.VK_SPACE){ 
      this.setBackground(Color.CYAN); 



     } 


} 
@Override 
public void keyReleased(KeyEvent e) { 
    // TODO Auto-generated method stub 
    int c = e.getKeyCode(); 
    if(c==KeyEvent.VK_SPACE){ 
     this.setBackground(Color.DARK_GRAY);} 
} 





} 

Класс п ° 2

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

import javax.swing.JPanel; 

import java.awt.Graphics; 

import javax.swing.JPanel; 

import java.awt.Graphics; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 

public class Panneau extends JPanel { 

    public int posX = 450/2-15; 
    public int posY = 500; 

public void paintComponent(Graphics g){ 
    g.setColor(Color.red); 
    g.fillRect(posX, posY, 30, 30); 
    System.out.print("Carré "); 
} 
    public int getPosX() { 
    return posX; 
    } 
    public void setPosX(int posX) { 
    this.posX = posX; 
    } 
    public int getPosY() { 
    return posY; 
    } 
    public void setPosY(int posY) { 
    this.posY = posY; 
    }   

} 

И наша главная:

import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 


public class Main extends JFrame { 
public static void main (String [] Args){ 
    Fenetre fen = new Fenetre(); 


}} 

PS: Мы новички, поэтому мы вполне могли бы это сделать Определим ужасно много вещей неправильно

ответ

1

С

Panneau pan = new Panneau(); 

вы создаете экземпляр Panneau, который модифицирован в методе keyPressed. Но с

this.setContentPane(new Panneau()); 

вы добавляете новый экземпляр Panneau в кадре - это экземпляр не изменен в методе keyPressed.

Есть некоторые другие проблемы с кодом, но минимальное изменение, которое необходимо для достижения желаемого эффекта, чтобы изменить эту строку

this.setContentPane(this.pan); 

Для того, чтобы очистить фон панели (т.е. удалите ранее окрашенную прямоугольник), вы также должны вызвать super.paintComponent(g) в первой строке paintComponent метода:

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.setColor(Color.red); 
    g.fillRect(posX, posY, 30, 30); 
    System.out.print("Carré "); 
} 
+0

только вопрос, будет ли super.paint вступит в конфликт с ракетами, которые мы хотим добавить после что? Потому что я увидел, что эта команда очищает все окно, а затем добавляет квадрат? Tahnks в любом случае это работает :) – user3266582

+0

Когда вы рисуете ракеты ** после ** вызова 'super.paintComponent', тогда проблем не будет. Обратите внимание, что * все *, которое вы хотите рисовать, должно быть окрашено в метод 'paintComponent' (или в методах, которые вызывается из' paintComponent' и получает тот же объект «Graphics»). (Итак, если вы намеревались называть 'getGraphics' где угодно: ** не делайте этого **). Также см. Http://docs.oracle.com/javase/tutorial/uiswing/painting/ – Marco13

Смежные вопросы