Java 使用EventListener更新变量

Java 使用EventListener更新变量,java,swing,keylistener,keyevent,updating,Java,Swing,Keylistener,Keyevent,Updating,我已经开始自学java游戏设计,我遇到了我的第一个障碍:我有一个KeyListener对象,当用户单击右键或左键时,它立即被调用。当它被调用时,我让控制台打印“ThisWorks”,并将vel更新为1或-1。但是,在控制台打印时,vel不会更新。为什么会这样 public class Paddle{ private int width = 100; private int height = 15; private int winWidth; private int posX; private

我已经开始自学java游戏设计,我遇到了我的第一个障碍:我有一个KeyListener对象,当用户单击右键或左键时,它立即被调用。当它被调用时,我让控制台打印“ThisWorks”,并将vel更新为1或-1。但是,在控制台打印时,vel不会更新。为什么会这样

public class Paddle{

private int width = 100;
private int height = 15;
private int winWidth;
private int posX;
private int posY;
int vel = 0;
Game game;

public Paddle(){

}
public Paddle(int winWidth, int winHeight, Game game){
    posX = winWidth / 2;
    posY = winHeight - 70;
    this.winWidth = winWidth;
    this.game = game;
}
**public void move(){
    if((posX + vel < winWidth) && (posX + vel > 0)){
        posX += vel;
    }
}**
public void paint(Graphics2D g){
    g.setColor(Color.BLACK);
    g.fillRect(posX, posY, width, height);
}
**public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
        System.out.println("This works");
        this.vel = 1;
    }
    if(e.getKeyCode() == KeyEvent.VK_LEFT){
        vel = -1;
    }
}
public void keyReleased(KeyEvent e) {
    vel = 0;
}**
}


您在键盘计算器中声明了以下内容:

Paddle paddle = new Paddle();
这意味着你正在增加的v与Game.java类中的v不同

您应该将拨片对象传递给键盘计算器

你的划桨课应该是

public class Keyboard implements KeyListener {

Paddle paddle;

public Keyboard(Paddle paddel) {
    this.paddle = paddel;
}

@Override
public void keyPressed(KeyEvent e) {
    paddle.keyPressed(e);
}

@Override
public void keyReleased(KeyEvent e) {
    paddle.keyReleased(e);
}

@Override
public void keyTyped(KeyEvent e) {
    // Not using it
}
}
而不是在游戏课上

Keyboard keyboard = new Keyboard();
应该补充一点,

Keyboard keyboard = new Keyboard(paddle);

如果您有任何疑问,请告诉我。

当使用某个键时,它会被按下然后释放。您的
vel
变量在按键事件期间更改为1或-1,然后在释放时重置为0。

当我们处于学习模式时,让我们看看一些即时问题/改进。作为一般建议,您应该覆盖paintComponent而不是paint,这可能不会对您造成很大影响,但稍后可能会在您的脸上爆炸。我会避免使用一个线程(或while循环)作为更新机制,直到你对你正在做的事情有更好的了解,Swing不是线程安全的,而是考虑使用Swing定时器。您应该避免使用KeyListener,而更喜欢使用Key Bindings API,它修复了与焦点相关的问题,并提供了更可重用的结构。您遇到的问题是KeyListener正在更改的拨片实例与您正在绘制的不同。作为一个想法,您的KeyListener应该设置某种状态变量,然后在更新循环运行时将其传递给游戏元素,这将输入机制与游戏元素分离,从而更容易change@MadProgrammer非常感谢您的反馈!我一定会考虑所有这些建议。然而,我确实有两个非常愚蠢的问题。当你说游戏元素时,你指的是什么?你能给我一个KeyListener传递状态变量的例子吗。很抱歉,我已经使用java基础知识一段时间了,但我刚刚开始游戏开发。这对显示的拨片的当前状态没有多大影响更好的解决方案是将输入与更新周期分离,而不是将拨片传递给
KeyListener
KeyListener
应该正在更改游戏模型的状态,从该状态更新拨片from@MadProgrammer从设计的角度来看,你是对的。谢谢
Keyboard keyboard = new Keyboard();
Keyboard keyboard = new Keyboard(paddle);