我刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康状况会下降。问题是当我检查这个时,CPU是100%而且一切都太迟了。这是个问题。这是我正在使用的主题:
package Graphics;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BulletCollision implements Runnable {
Player1 player1 = new Player1();
Player2 player2 = new Player2();
public Thread checkBulletCollision = new Thread(this);
public void checkPlayerBulletCollide() {
if (player2.getBulletX() > player1.getX() &&
player2.getBulletX() < player1.getX() - 50) {
player2.decHealth(50);
}
}
@Override
public void run() {
while(true) {
checkPlayerBulletCollide();
try {
checkBulletCollision.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(
Level.SEVERE, null, ex);
}
}
}
}
我很确定这就是问题所在。编译或运行时没有错误。如果有人能帮助那将是惊人的!而我只是创建这个类,所以代码并不完美。我已经尝试了很多来解决这个问题,我的Display类中只调用了Threads start()方法,它只显示JFrame。我以前在我的一名球员中获得了开始方法。
答案 0 :(得分:0)
在我看来,在这种情况下,在单独的线程中使用此块自由运行是不正确的。
while(true) {
checkPlayerBulletCollide();
try {
checkBulletCollision.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
}
}
我每帧只执行一次,我会从绘图逻辑中调用checkPlayerBulletCollide()
。
另请注意Thread.sleep()
是一个静态函数,所以你不能让一个特定的Thread实例从另一个Thread中休眠,一个Threac可以让自己睡觉......
编辑如果你想编写好的和干净的代码(非常好),我建议使用Java 1.5中的锁定机制。
即使这是(在2个用户的当前上下文中每个1个子弹)不轻量级,我使用BlockingQueue。检查线程必须发出queue.take(),但实际的Integer值无关紧要(稍后例如使用更多的子弹或玩家,您可以在队列中放置指定哪些子弹和哪些用户要检查的对象。 ..)。绘图逻辑 - 或控制绘图的逻辑将执行queue.offer(0)。检查线程看起来像这样:
public class BulletCollision implements Runnable{
Player1 player1 = new Player1();
Player2 player2 = new Player2();
public BlockingQueue<Integer> checkQueue = new LinkedBlockingQueue<Integer>();
public void checkPlayerBulletCollide() {
if(player2.getBulletX() > player1.getX() && player2.getBulletX() < player1.getX() -50) {
player2.decHealth(50);
}
}
@Override
public void run() {
while(true) {
try {
queue.take();
checkPlayerBulletCollide();
} catch (InterruptedException ex) {
Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
break; //I'd put this here. If we were interrupted, the hread should stop gracefully.
}
}
}
}
此外,当您完成绘制框架时,您应该发出queue.offer(0);
答案 1 :(得分:0)
问题不在此代码中。有一两个缺陷,但是在这段代码中没有任何内容会导致延迟......据我所知。
FWIW,缺陷如下:
1)这是不好的风格:
checkBulletCollision.sleep(100);
Thread.sleep
方法是静态的,因此您应该将其调用为:
Thread.sleep(100);
2)如果收到中断,你的线程run()
方法应该返回。你已经对它进行了编码以继续......这将打破打断它的目的。