while (true) { if (game_state == PLING) { try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } if (camDrop()) { currentOne.moveDrop(); } else { landToWall(); destroyLine(); if (isGameOver()) { game_state = OVER; } else { //游戏没有结束 currentOne = nextOne; nextOne = Tetromino.randomOne(); } } } repaint(); } }
时间: 2024-02-10 21:09:25 浏览: 173
根据您提供的代码,我发现您的游戏逻辑处于一个无限循环中,这可能会导致您的程序一直处于忙碌状态,无法响应其他事件。建议您在这个循环中添加一些延迟,例如使用`Thread.sleep()`方法,这样可以减少循环的频率,从而使程序有空闲时间响应其他事件,例如键盘事件。
另外,建议您在循环的每个迭代中检查游戏状态,以确保游戏正在运行或已经结束,否则可能会导致不必要的计算和更新。例如,您可以在循环的开始处添加以下代码:
```java
while (true) {
if (game_state == OVER) {
break;
}
if (game_state == PLING) {
// 游戏主要逻辑
}
repaint();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
```
在这个例子中,我将循环的频率降低到每秒 20 次,以便程序有足够的时间响应其他事件。同时,我添加了一个检查,以确保游戏状态正确。
相关问题
public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); switch (code) { case KeyEvent.VK_DOWN: sortDropActive(); break; case KeyEvent.VK_LEFT: moveleftActive(); break; case KeyEvent.VK_RIGHT: moveRightActive(); break; case KeyEvent.VK_UP: rotateRightActive(); break; case KeyEvent.VK_SPACE: hadnDropActive(); break; case KeyEvent.VK_P: //判断当前游戏状态 if (game_state == PLING) { game_state = STOP; } break; case KeyEvent.VK_C: if (game_state == STOP) { game_state = PLING; } break; case KeyEvent.VK_S: //重新开始 game_state = PLING; wall = new Cell[18][9]; currentOne = Tetromino.randomOne(); nextOne = Tetromino.randomOne(); totalScore = 0; totalLine = 0; break; } } }; //将窗口设置为焦点 this.addKeyListener(l); this.requestFocus();
根据您提供的代码,我发现在这里的`this`可能是指的`JFrame`或`JPanel`等组件,这些组件需要获得焦点才能响应键盘事件。但是,在某些情况下,由于组件层次结构的问题,可能无法获得焦点,从而导致键盘事件无法响应。
解决此问题的一种方法是将焦点请求移动到组件的父级容器上,例如`JFrame`或`JPanel`等。请尝试将`this.requestFocus()`更改为`getParent().requestFocus()`或`getRootPane().requestFocus()`,看看问题是否得到解决。
阅读全文