而循环忽略线?

时间:2016-05-12 23:03:18

标签: java

我现在一直在摸不着头脑,我真的很困惑。最近,我一直在制作游戏,现在我正在尝试重做我最初创建Camera class的方式。它现在是Thread的一部分,并遵循特定的Location

以下是代码:

public void run(){  
    while (game.isRunning()){
        if (!lockLocation) continue;

        while (center == null){
            EntityHandler handler = game.getEntityHandler();
            if (handler == null) continue;

            center = (Entity) game.getEntityHandler().getFirst(ObjectType.PLAYER);
        }

        xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
        yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);
    }

    try { thread.join(); } 
    catch (InterruptedException e) { e.printStackTrace(); }
}

所以这段代码在某些条件下有效。 请注意以下几行:

xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);

当我保持原样时,只有yOffset有效。当我注释掉yOffset行时,xOffset将停止工作(因此,两行都不起作用)。

当我注释掉xOffset行时,与评论yOffset很相似,yOffset将不再有效,导致整个代码无用。

这是最奇怪的部分;当我使用System.out.println()方法时,它们都会起作用。 (如果其中一个被评论并且放置了System.out.println(),则取消注释的那个将起作用。)

我不知道为什么while循环只是忽略某些行,除非它在某些条件下。我完全没理由这样做。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

是否有可能另一个线程正在更新xOffset,yOffset或center? 如果两个线程都试图更新这些变量,您可能会看到所描述的行为。您可以尝试在这两行周围添加锁定语句或synchronized块。锁定需要与更新这些变量的其他线程共享,并且该线程还需要锁定语句。

答案 1 :(得分:2)

解决! :D答案如下:

synchronized (game.getMainThread()){
    xOffset = center.getLocation().getRawX() - (Game.WIDTH / 2) + (center.getWidth() / 2);
    yOffset = center.getLocation().getRawY() - (Game.HEIGHT / 2) + (center.getHeight() / 2);
}