在线程游戏中使用锁
using locks in a game with threads
我正在尝试为 space 入侵者类型的游戏调试一些代码,其中有 20 艘我们必须射击的外星飞船。游戏会显示当前屏幕上的船只数量。当您射击并摧毁一艘船时,每摧毁一艘船,船舶总数应减 1。所以对于 20 艘船,当你射击全部 20 艘时,显示屏应该显示剩余船数为“0”。然而,由于某种我不明白的原因,当我拍摄所有 20 艘船时,显示屏将显示“-2”或“-3”,这对我来说没有意义,因为船数不能为负数。
我试图用 ReentrantLock
修复这个解决方案,因为这个游戏使用多线程,但我真的不知道如何正确地做到这一点。这是检查外星飞船和子弹是否发生碰撞的片段(这是飞船应该被摧毁的时间):
public void checkCollisions()
{
//check for alien ship and bullet collisions
for (AlienShip a : aships)
{
if (a.isAlive())
{
//check for bullet collisions
for (Bullet bullet : bullets)
{
if (bullet.isAlive())
{
//perform the collision test
if (a.getBounds().contains(bullet.getX(),
bullet.getY()))
{
bullet.setAlive(false);
a.setAlive(false);
shipLock.lock();
try
{
int shipCount = aliveShips;
shipCount--;
aliveShips = shipCount;
}
finally
{
shipLock.unlock();
}
continue;
}
}
}
}
}
是否有可能在同一帧中多发子弹击中同一艘船?在经典的 space 入侵者中你只有一颗子弹,但是你正在处理一个列表所以这是不一样的。
如果两颗子弹击中了同一艘船,你的内循环 "for (Bullet bullet : bullets)" 将处理两颗子弹击中这艘船,即使船已经死了,第二颗子弹也会再次减少计数器。
如果您将 'continue' 替换为 'break' 那么子弹循环将在船被击毁时停止,这可能是您的意图?
我正在尝试为 space 入侵者类型的游戏调试一些代码,其中有 20 艘我们必须射击的外星飞船。游戏会显示当前屏幕上的船只数量。当您射击并摧毁一艘船时,每摧毁一艘船,船舶总数应减 1。所以对于 20 艘船,当你射击全部 20 艘时,显示屏应该显示剩余船数为“0”。然而,由于某种我不明白的原因,当我拍摄所有 20 艘船时,显示屏将显示“-2”或“-3”,这对我来说没有意义,因为船数不能为负数。
我试图用 ReentrantLock
修复这个解决方案,因为这个游戏使用多线程,但我真的不知道如何正确地做到这一点。这是检查外星飞船和子弹是否发生碰撞的片段(这是飞船应该被摧毁的时间):
public void checkCollisions()
{
//check for alien ship and bullet collisions
for (AlienShip a : aships)
{
if (a.isAlive())
{
//check for bullet collisions
for (Bullet bullet : bullets)
{
if (bullet.isAlive())
{
//perform the collision test
if (a.getBounds().contains(bullet.getX(),
bullet.getY()))
{
bullet.setAlive(false);
a.setAlive(false);
shipLock.lock();
try
{
int shipCount = aliveShips;
shipCount--;
aliveShips = shipCount;
}
finally
{
shipLock.unlock();
}
continue;
}
}
}
}
}
是否有可能在同一帧中多发子弹击中同一艘船?在经典的 space 入侵者中你只有一颗子弹,但是你正在处理一个列表所以这是不一样的。 如果两颗子弹击中了同一艘船,你的内循环 "for (Bullet bullet : bullets)" 将处理两颗子弹击中这艘船,即使船已经死了,第二颗子弹也会再次减少计数器。 如果您将 'continue' 替换为 'break' 那么子弹循环将在船被击毁时停止,这可能是您的意图?