【发布时间】:2018-05-13 07:45:17
【问题描述】:
大家好,我的代码有问题。请忽略其他没有意义的事情,我还有很多工作要做......
正如您在下面看到的,我所做的是更改名为 checkDirection 的变量,然后检查相同的变量。
Check Direction 是一个私有变量...idk 如果这改变了任何东西
@Override
public void paint(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillRect(appleXPosition, appleYPosition, 10, 10);
g.setColor(Color.GREEN);
g.fillRect(snakeXPosition, snakeYPosition, 10, 10);
if (checkDirection == 0) {
snakeXPosition = right(snakeXPosition);
} else if(checkDirection == 1) {
snakeXPosition = left(snakeXPosition);
} else if (checkDirection == 2) {
snakeYPosition = up(snakeYPosition);
} else {
snakeYPosition = down(snakeYPosition);
}
}
@Override
public void keyPressed(KeyEvent ke) {
int code = ke.getKeyCode();
switch (code) {
case KeyEvent.VK_RIGHT:
checkDirection = 0;
break;
case KeyEvent.VK_LEFT:
checkDirection = 1;
break;
case KeyEvent.VK_UP:
checkDirection = 2;
break;
case KeyEvent.VK_DOWN:
checkDirection = 3;
break;
default:
break;
}
}
【问题讨论】:
-
“请忽略任何其他没有意义的事情”请努力删除没有意义的内容并发布minimal reproducible example。还要添加您为调试问题所做的工作。
-
public void paint(Graphics g) { super.paintComponent(g); ... }是一个真正的问题 -
你不应该在渲染阶段做出逻辑选择,这些应该在“更新”阶段处理,渲染应该渲染当前状态,没有别的 - 为什么?因为这也是它的职责所在,所以在 Swing 中,油漆传球可能因多种原因而被触发,其中许多原因是您无法直接控制的。您的代码应该有一个“主循环”,它的职责是更新游戏模型的状态并安排渲染通道,然后在更新之间等待规定的时间 - 我建议使用 Swing
Timer作为简单的起点 -
我也鼓励使用
KeyListener的key bindings API,它将解决它的不可靠性问题 -
谢谢@MadProgrammer!我真的不明白......所以我把所有打算更新的代码放在不同的方法中。但是我又叫油漆了吗?还是我只调用重绘?
标签: java swing keylistener