我正在制作一款可以躲避激光的游戏。我希望激光移动到屏幕上的随机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();
}
}
答案 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; }
}
而不是制作额外的布尔值以跟踪整个事情?