基本上,我正在制作一个更新玩家位置的游戏,它使用这个线程:
@Override
public void run() {
while(true) {
System.out.println();
updatePos(x, y);
}
}
它工作正常,但如果我删除 System.out.println(),它就会停止运行。我不知道这是为什么,全类如下:
public class Player extends Block implements KeyListener, Runnable {
int x;
int y;
int speed;
boolean upPressed;
boolean downPressed;
boolean rightPressed;
boolean leftPressed;
static Sprite sprite = new Sprite("grass.png");
public Player(int x, int y, int speed) {
super(x, y, sprite);
this.x = x;
this.y = y;
this.speed = speed;
Thread playerThread = new Thread(this, "Player Thread");
playerThread.start();
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP) {
y -= speed;
}
if (e.getKeyCode() == KeyEvent.VK_DOWN)
downPressed = true;
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
rightPressed = true;
if (e.getKeyCode() == KeyEvent.VK_LEFT)
leftPressed = true;
}
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_UP)
upPressed = false;
if (e.getKeyCode() == KeyEvent.VK_DOWN)
downPressed = false;
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
rightPressed = false;
if (e.getKeyCode() == KeyEvent.VK_LEFT)
leftPressed = false;
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void run() {
while(true) {
System.out.println();
updatePos(x, y);
}
}}
最后说明:忽略 boolean 值 upPresses 和 downPressed,我唯一关注的是:
if (e.getKeyCode() == KeyEvent.VK_UP) {
y -= speed;
}
最佳答案
像一个循环
while(true) {
updatePos(x, y);
}
会完全占用 CPU。使用 println
它开始表现得更好的原因可能是因为每次 I/O 迭代产生几百个周期。
我建议你根据所需的帧率添加一个小的 sleep 方法:
while (true) {
try {
Thread.sleep(10); // for 100 FPS
} catch (InterruptedException ignore) {
}
updatePos(x, y);
}
或者,更好的是,采用事件驱动的方法,例如 java.util.Timer
. (这会更符合 Java 的习惯。)
关于java - 只有在 while true 循环中有 System.out.println() 时线程才能正确运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7140548/