java - 贪吃蛇游戏 - KeyListener 不起作用
问题描述
嘿伙计们,我的代码有问题。请忽略任何其他没有意义的事情,我还有很多工作要做......
正如您在下面看到的那样,我所做的是更改名为 checkDirection 的变量,然后检查相同的变量。
检查方向是一个私有变量......如果这改变了什么
@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;
}
}
解决方案
让我们从...
@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);
}
}
你压倒一切paint
,但打电话super.paintComponent
。paint
本身做了很多重要的工作,打电话paintComponent
只是其中之一。
相反,您应该直接覆盖paintComponent
(并调用它super
)
有关详细信息,请参阅在 AWT 和 Swing中执行自定义绘画和绘画
绘画不应该是做出逻辑决策,而应该只是绘画模型的当前状态。相反,这些决定应该作为“更新”传递的一部分,作为“主循环”的一部分执行
“主循环”将检查输入的状态,决定如何更新状态并安排渲染通道。
一个简单的起点可能是使用SwingTimer
我还建议使用key bindings API over KeyListener
,它将解决与相关的不可靠性问题KeyListener
推荐阅读
- sql - 如何对 Redshift 视图进行性能测试?
- python - 在列表中环绕运行窗口
- javascript - 计算两种颜色的对比色以确定两种颜色的边框颜色
- python - 在线程中运行函数时,Tkinter 正在打开新窗口
- git - 有什么方法可以让 github 桌面自动拉取和推送更改
- javascript - 导出按钮以在 Devextreme 中的数据网格之外使用
- swagger - Swagger Redoc CORS 问题与托管在另一台服务器上的 json 文件有关
- amazon-web-services - 无法在同一 cloudformation 堆栈中创建具有死信队列的 FIFO 队列
- javascript - 在 Redux 存储文件中遇到 Typescript 状态类型不匹配错误
- javascript - 使用表单时删除缓存的搜索