【问题标题】:While loops ignoring lines?While循环忽略行?
【发布时间】:2016-09-08 23:46:40
【问题描述】:

我已经在这个问题上摸索了一会儿,我真的很困惑。最近,我一直在制作游戏,现在我正在尝试重做我最初创建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 循环只是忽略某些行,除非它在某些条件下。我绝对没有理由这样做。有什么想法吗?

【问题讨论】:

  • 听起来像getLocation() 只工作一次。您需要定义“停止工作”。
  • 这几乎肯定是Data Race
  • 可以说调试中最重要的部分之一就是提出正确的问题。 google.com/#q=scientific+method“我不知道为什么 while 循环只是忽略某些行,除非它在某些条件下” 我向您保证您的代码不是“忽略某些行”。不要说你的问题不好,只要确保你提出了一个有效的假设。
  • 您需要提供更多信息。哪些线程正在访问/修改center?一个好的开始是使用synchronized 块来处理竞争条件(如@Natecat 所述)。
  • Data Race 似乎是我问题的最准确表述。我将如何解决数据竞赛? (我会尝试使用同步块)

标签: java


【解决方案1】:

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

【讨论】:

  • 不幸的是,没有。除了这个 Camera 类之外,游戏中没有其他位置可以修改 xOffset 和 yOffset 变量。 (我做了一个项目搜索这些方法和变量的用法只是为了确保)
【解决方案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);
}

【讨论】:

  • 所以,当你说“不幸的是,不”。在您对@DavidWaters 回答的评论中,我认为您的意思是“实际上,是的”:)
  • 大声笑,我确实修改了它某处。我不知道我在哪里修改它,但显然我做了:P 这个线程的全部目的是所以我不必在其他任何地方更新它
猜你喜欢
  • 2017-04-29
  • 2021-10-17
  • 2019-11-07
  • 1970-01-01
  • 2016-12-24
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多