如何修复这个无限循环

时间:2014-07-30 19:24:12

标签: java infinite-loop

我正在制作一款可以躲避激光的游戏。我希望激光移动到屏幕上的随机y位置。然后,一旦激光器处于所需的随机位置,它将激发激光束。并重复此操作,直到游戏结束;又名你击中了激光束。

我不知道如何在没有无限循环问题的情况下使其工作,因为我还是java和libgdx的新手。

将标签从javascript更改为java。遗憾。

你应该做什么:在经历了很多困惑之后我重新上课了。我将fire()和move()组合成一个方法,并从我的Screens渲染方法中调用它(每帧都调用render)。

package com.JrodManU.LaserJumper;

import java.util.Random;

import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.utils.TimeUtils;

public class Laser {
    public Sprite image;
    public Rectangle bounds;
    public LaserBeam laserBeam;
    public boolean on;
    public long timer;
    public Random random;
    public int targetY;
    public float speed;
    public boolean moving;

    public Laser(int x) {
        moving = false;
        on = false;
        random = new Random();
        image = Assets.laser;
        bounds = new Rectangle(x, random.nextInt(892) + 32, 32, 16);
        laserBeam = new LaserBeam();
        move();
    }

    public void fire() {
        laserBeam.bounds.y = bounds.y - 5;
        on = true;
        timer = TimeUtils.millis();
        while(on) {
            if(timer + 1000l < TimeUtils.millis()) {
                on = false;
            }
        }
        move();
    }

    public void move() {
        targetY = random.nextInt(892) + 32;
        speed = (targetY - bounds.y) / 100;
        for(int i = 0; i < 100; i++) {
            bounds.y += speed;
        }
        fire();
    }
}

3 个答案:

答案 0 :(得分:1)

激活电话move(),呼叫fire()fire()来电move()

循环介于fire()move()之间。

你需要以某种方式阻止这种情况(使用return;内部火力\具有条件的移动将完成工作。)

答案 1 :(得分:1)

你得到无限循环,其中move()调用fire,然后fire()调用move()。

要解决此问题,您需要有一个条件来打破此调用循环。例如,当激光在fire()函数中击中玩家时。这是一些伪代码,可以给你一个想法:

 public void fire() {

    if (playerHit)
        gameOver();
    else
        move();
 }

答案 2 :(得分:0)

也许它与您的情况中的1000l有关?为什么那里有l?您也可以将循环更改为

while (true) {
  if (...) { break; }
}

而不是制作额外的布尔值以跟踪整个事情?