Как запустить KeyListener одновременно с другими методами?

1

Я на самом деле кодирую 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.

  • 0
    вы получили ключ в, в то время как вы используете переменную dir в методе обновления. Я думаю, вы должны обновить этот метод, чтобы он был публичным void keyPressed (KeyEvent e) {dir = e.getKeyCode (); } Я надеюсь, что это может помочь!
  • 0
    Извините, я забыл, что я с ума сошел, чтобы оценить, проходила ли программа через метод KeyListener, но это ничего не меняет, она всегда печатает 0, даже когда я спамую все остальные ключи ... Значит, он не распознает это или программа не выполняет этот код?
Показать ещё 1 комментарий
Теги:

2 ответа

0

Вы сохраняете значение ключа в a а затем проверяете dir в своем коммутаторе. Очевидно, это не сработает. Вы, кажется, не использовать a другом месте в приложении, поэтому я предлагаю вам удалить переменную полностью, чтобы избежать путаницы.

0

Для правильного нажатия клавиши необходимо выполнить следующие действия:

  • Зарегистрируйте адаптер прослушивателя клавиш/ключа для Swing (или AWT).
  • После нажатия клавиши событие называется вызовом метода, который должен отвечать на ключ.

Может быть, вы поступаете правильно. Если это так, вам нужно сузить проблему и получить разумную помощь.

  • 0
    Я постарался добавить как можно больше подробностей. Я также стараюсь облегчить чтение основной информации, спасибо за вашу помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню