我正在编写一个简单的Top Down Shooter。玩家可以按住鼠标不断拍摄。由于没有本地的方法来检查鼠标按钮是否被按下,我实现了这个解决方案:https://stackoverflow.com/a/6828990/3716866Java - 两条线程不同步
这很好。但问题是我把每个子弹对象和每个游戏对象(敌人,玩家,桶等)放在一个链接列表中(两个列表中的一个用于对象,一个用于子弹)。当你拍摄一颗子弹时,它会被添加到LinkedList中。整个列表的每个runthrough都会通过碰撞检查。在射击2次后,游戏崩溃,并出现空指针异常。我认为问题在于,因为我使用第二个线程来实现鼠标按钮的按住,所以在另一个线程中它会检查整个列表中的子弹对象。由于我通过列表检查,而大小正在变化,它正在通过列表检查,它崩溃。但那只是我的理论。有人想知道如何让他们同步?
如果你需要更多的代码等告诉我,我会上传它。我只是不确定我应该发布什么。因此,在我收到垃圾邮件之前,我想等待您的反馈。
例外:
Exception in thread "Thread-2" java.lang.NullPointerException
at shooter.main.Handler.checkForCollision(Handler.java:50)
at shooter.main.Handler.tick(Handler.java:41)
at shooter.main.Game.tick(Game.java:189)
at shooter.main.Game.run(Game.java:290)
at java.lang.Thread.run(Unknown Source)
处理类运行所有为每个对象蜱和更新方法,包括碰撞:
我的MouseListener类在其他线程实现:
我主要的游戏类,但我不认为这将是对这个问题非常重要:
我的游戏对象的抽象类:一个游戏对象的
例子:
我的抽象弹药类:子弹
例子:
怎么个拍法是这样的:
public void shoot() {
//play sound effect
// fire bullet
game.getHandler().addBullet(new Bullet9mm(game.getHandler().getPlayer().getX(), game.getHandler().getPlayer().getY(), game.getBulletImageManager(), game));
// remove 1 bullet from magazine
game.getHandler().getPlayer().getCurWeapon().setMagAmmo(-1);
}
我希望我提供的每一个信息需要。如果你仍然需要我的代码,请告诉我。
'java.util.LinkedList'是**不是**同步的,并且**不是**线程安全。 – mkobit 2014-12-03 03:40:48
tempObject和tempBullet是什么类型?你在哪里声明了这些变量? – isnot2bad 2014-12-03 07:26:06
如果出现异常,您应该始终发布异常堆栈跟踪。没有它,我们可以猜测你的代码中可能发生异常的地方。 – isnot2bad 2014-12-03 07:50:13