Я на самом деле кодирую pacman для проекта, но я столкнулся с проблемой, когда добавил эту часть:
@Override
public void keyPressed(KeyEvent e){
dir=e.getKeyCode();
}
Программа не вызывает этот конкретный метод, который мне нужен, чтобы получить правильное направление, а затем поместить его в обновленный.
Вот полный код, над которым я все еще работаю:
import java.awt.Graphics;
import org.game.engine.Game;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.game.engine.GameApplication;
public class Pacman extends Game {
BufferedImage pacman;
int frame;
int dir;
int x,y;
final int STEP=2;
public static void main (String[] args){
GameApplication.start(new Pacman());
}
public Pacman(){
title="Pacman";
width=height=500;
dir=KeyEvent.VK_RIGHT;
x=300;
y=200;
try {
pacman = ImageIO.read(new File("pacman.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void keyPressed(KeyEvent e){
dir=e.getKeyCode();
}
@Override
public void update() {
frame++;
if(frame>2){
frame=0;
}
**switch(dir){
case KeyEvent.VK_LEFT:
x-=STEP;
break;
case KeyEvent.VK_RIGHT:
x+=STEP;
break;**
}
if(x<0){
x=0;
}
else if(x> width -28-15){
x= width-28-15;
}
}
@Override
public void draw(Graphics g) {
g.drawImage(pacman.getSubimage(frame*30,0,28,28),x,y,null);
}
@Override
public void init() {
}
}
EXTRA Подробности: Так что в основном для запуска проекта у меня есть игровой движок, который помогает мне обрабатывать форму игры. Для этого у меня есть 4 класса:
1/Приложение для игры:
package org.game.engine;
import javax.swing.JFrame;
public class GameApplication {
static public void start (Game jeu) {
JFrame fenetre=new JFrame(jeu.getTitle());
fenetre.setSize(jeu.getWidth(),jeu.getHeight());
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GameCanvas canvas=new GameCanvas(jeu);
fenetre.add(canvas);
fenetre.setVisible(true);
GameLoop loop= new GameLoop(jeu,canvas);
loop.start();
}
}
2/GameCanvas
package org.game.engine;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JComponent;
public class GameCanvas extends JComponent{
private final Game game;
public GameCanvas(Game game) {
this.game=game;
**addKeyListener(this.game);**
requestFocus();
}
@Override
public void paintComponent(Graphics g){
game.draw(g);
}
}
3/Игровой цикл
package org.game.engine;
public class GameLoop extends Thread {
private final Game game;
private final GameCanvas canvas;
public GameLoop(Game game, GameCanvas canvas) {
this.game=game;
this.canvas=canvas;
}
@Override
public void run() {
game.init();
while(!game.isOver()){
game.update();
canvas.repaint();
try {
Thread.sleep(game.getDelay());
} catch (InterruptedException e) {
}
}
}
}
И, наконец, сама игра:
4/Игра
package org.game.engine;
import java.awt.Graphics;
**import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;**
public abstract class Game **implements KeyListener**{
protected boolean over;
protected int delay=50;
protected int width=500;
protected int height=500;
protected String title="Mon jeu";
abstract public void update();
abstract public void draw(Graphics g);
abstract public void init();
public int getWidth(){ return width;}
public int getHeight(){return height;}
public String getTitle(){return title;}
public boolean isOver(){ return over;}
public long getDelay(){ return delay;}
**public void keyTyped(KeyEvent e){}
public void keyPressed(KeyEvent e){}
public void keyReleased(KeyEvent e){}**
}
Приложение 1/Game предназначено для исполняющей части процесса (отображение макета и т.д.). 2/Game Canvas есть для рисования содержимого окна, кроме того, он также вызывает Keylistener: addKeyListener (this.game ); 3/Game Loop содержит основной цикл программы в методе запуска. И, наконец, 4/Game содержит все основные параметры программы, такие как размер заголовка, а также реализует Keylisteners.
Вы сохраняете значение ключа в a
а затем проверяете dir
в своем коммутаторе. Очевидно, это не сработает. Вы, кажется, не использовать a
другом месте в приложении, поэтому я предлагаю вам удалить переменную полностью, чтобы избежать путаницы.
Для правильного нажатия клавиши необходимо выполнить следующие действия:
Может быть, вы поступаете правильно. Если это так, вам нужно сузить проблему и получить разумную помощь.