Je travaille sur un jeu en Java, basé sur l'aventure du jeu Atari. J'ai fait fonctionner correctement la partie KeyListener de base, mais j'ai ajouté une autre instruction if, en utilisant une autre classe, pour tester si le joueur allait frapper un mur et arrêter le mouvement si c'était le cas. La méthode que j'ai utilisée a également utilisé des instructions if, et quand j'ai couru le code, il y avait un retard MAJEUR. J'ai d'abord essayé une boucle en boucle, mais ça a fait encore pire. Quoi qu'il en soit, pour que ça ne soit pas trop lent? Cela ne semble pas si complexe qu'un programme à exécuter, et je dois encore ajouter une autre instruction if pour pouvoir passer dans une autre pièce, donc je dois faire quelque chose pour réduire massivement le décalage.Java jeu retard, trop si la déclaration?
Voici la classe:
class Player extends JPanel implements KeyListener{
private char c = 'e';
int x = 400;
int y = 400;
int mapX = 0;
int mapY = 0;
public Player() {
this.setPreferredSize(new Dimension(800, 500));
addKeyListener(this);
}
public void addNotify() {
super.addNotify();
requestFocus();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Environment Layout = new Environment();
Layout.drawRoom(mapX,mapY,g);
g.fillRect(x , y , 20, 20);
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) {
c = e.getKeyChar();
repaint();
Environment Layout = new Environment();
if(Layout.isWall(x,y,c)){}
else{
if (c == 'a'){
x = x - 3;
}
else if (c == 'w'){
y = y - 3;
}
else if (c == 's'){
y = y + 3;
}
else if (c == 'd'){
x = x + 3;
}
}
}
public static void main(String[] s) throws IOException{
JFrame f = new JFrame();
f.getContentPane().add(new Player());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
La méthode de salle de tirage je dans c'était juste de mettre l'arrière-plan de la pièce en place.
Voici la méthode isWall de la classe Environnement:
public boolean isWall(int moveX, int moveY, char let){
BufferedImage room = null;
try {
room = ImageIO.read(new File(xNum + "," + yNum + ".png"));
}
catch (IOException e) {
}
int[][] walls = convertImage(room);
boolean blocked = false;
if(let == 'w') {
if(walls[moveY-8][moveX] == -3584){blocked = true;}
}
else if(let == 's') {
if(walls[moveY+20][moveX] == -3584){blocked = true;}
}
else if(let == 'a') {
if(walls[moveY][moveX-5] == -3584){blocked = true;}
}
else if(let == 'd') {
if(walls[moveY][moveX+20] == -3584){blocked = true;}
}
return blocked;
}
la méthode convertImage convertit seulement l'image de la pièce dans un tableau int, pour la valeur des couleurs. -3584 est la couleur des murs. Il est possible que ce soit ce qui est en retard, mais cela semblait être le meilleur moyen pour que chaque pièce fasse automatiquement les murs. J'ai également essayé une minuterie, mais soit j'ai mal fait, soit cela n'a pas aidé.
Je peux donner plus de mon code si c'est nécessaire, mais l'aide avec ceci serait très appréciée. Je suis relativement nouveau dans ce genre de choses, donc il me manque probablement quelque chose de grand. Merci.
Obtenez un profileur. – Robert