我已经为此花了很短的时间,我真的很困惑。最近,我一直在做游戏,现在我正尝试重做最初创建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循环只忽略某些行,除非在某些情况下。我绝对没有理由为此考虑。有任何想法吗?

最佳答案

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

关于java - While循环忽略行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37198822/

10-09 13:28