0

我刚刚尝试在我的游戏中添加一些东西,如果一个玩家被子弹击中,他的健康就会下降。问题是当我检查这个时,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);
             }
         }
     }
  }

我很确定这就是问题所在。编译或运行时没有错误。如果有人可以提供帮助,那就太棒了!我只是制作这个类,所以代码并不完美。我已经尝试了很多来解决这个问题,Threads start() 方法在我的 Display 类中被调用,它只显示 JFrame。我以前在我的一个播放器中使用了 start 方法。

4

2 回答 2

0

The problem is not in this code. There are one or two flaws, but nothing in this code that would result in laggyness ... as far as I can tell.


FWIW, the flaws are as follows:

1) This is bad style:

  checkBulletCollision.sleep(100);

The Thread.sleep method is static, so you should invoke it as:

  Thread.sleep(100);

2) Your thread run() method should return if it receives an interrupt. You have coded it to keep going ... which would defeat the purpose of interrupting it.

于 2012-10-27T08:22:44.700 回答
0

在我看来,在这种情况下,在单独的线程中使用这个无块运行是不正确的。

while(true) {
    checkPlayerBulletCollide();
    try {
        checkBulletCollision.sleep(100);
    } catch (InterruptedException ex) {
        Logger.getLogger(BulletCollision.class.getName()).log(Level.SEVERE, null, ex);
    }
}

我每帧只做一次,我会checkPlayerBulletCollide()从绘图逻辑中调用。

还要注意这Thread.sleep()是一个静态函数,所以你不能让一个特定的线程实例从另一个线程休眠,一个 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);

于 2012-10-27T07:51:21.670 回答