Итак, мой проект - создать игру типа 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: Мы новички, поэтому мы вполне могли бы это сделать Определим ужасно много вещей неправильно
только вопрос, будет ли super.paint вступит в конфликт с ракетами, которые мы хотим добавить после что? Потому что я увидел, что эта команда очищает все окно, а затем добавляет квадрат? Tahnks в любом случае это работает :) – user3266582
Когда вы рисуете ракеты ** после ** вызова 'super.paintComponent', тогда проблем не будет. Обратите внимание, что * все *, которое вы хотите рисовать, должно быть окрашено в метод 'paintComponent' (или в методах, которые вызывается из' paintComponent' и получает тот же объект «Graphics»). (Итак, если вы намеревались называть 'getGraphics' где угодно: ** не делайте этого **). Также см. Http://docs.oracle.com/javase/tutorial/uiswing/painting/ – Marco13