0

我一直在做一个小项目,试图学习一些基础知识,我正在尝试克隆太空入侵者。我没有真正的经验(这就是我这样做的原因)而且我遇到了一些我以前从未遇到过的问题。

我的问题是循环,我使用了基本循环,但我现在使用了一些嵌套循环,这给我带来了一些问题。这是破坏我的项目的代码

    public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        centerX = 60;
        centerY = 35;
        alienArray = ms;
        moveRight = true;
        while(moveRight == true){
            x += 1;
            }
        }
    case 2:{    
        }
    }
}

如果有人认为它会有所帮助,我可以显示更多代码,但基本上,这个块获取传递给它的级别编号 (l) 以及包含大约 15 个“外星人”对象的数组列表。'x+=1' 行是移动外星人的原因(每个外星人的位置是 x)。该代码是从另一个经常从摆动计时器调用的函数中调用的。

发生的事情是,当代码到达这一点时,程序似乎冻结了。我在 JPanel 上有一个没有反应的按钮,我有一个热键来关闭没有反应的应用程序,并且用鼠标退出应用程序什么都不做(我在 JFrame 中包含了 DefaultCloseOperation(EXIT_ON_CLOSE)没有这个while循环也可以工作)。

如果我用“if”替换“while”这个词,就像下面的代码一样。

    public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        centerX = 60;
        centerY = 35;
        alienArray = ms;
        moveRight = true;
        if(moveRight == true){
            x += 1;
            }
        }
    case 2:{    
        }
    }
}

我也尝试了一个 do, while 循环。

我不知道问题是什么,我认为这是一个逻辑错误,但对我来说似乎相当简单。同样,如果有人想查看其余代码,我可以发布它。否则,如果有人有任何建议,我将不胜感激。我愿意接受具体的建议,或者只是关于代码效率的一般建议。谢谢

回答

好的,多亏了 Ted Hopp,我已经让我的代码向前发展了,他在下面发表了评论。看起来在 case 语句中正在执行一个无限循环。

这是我对任何好奇的人的修复,我已经包含了从原始帖子调用该函数的函数。

    public void move(int l, ArrayList ms){
    level = l;
    alienArray = ms;
    moveLevel(level, alienArray);

    centerX += horizontal;
    centerY += vertical;
    x += horizontal;
    y += vertical;
    if(moveRight == true){
        horizontal = 1;
        vertical = 0;
        System.out.println(centerX);
    }
    else x -= 1;
}
public void moveLevel(int l, ArrayList ms){
    switch(l){
    case 1:{
        alienArray = ms;
        moveRight = true;
        if(moveRight == true){
            if (centerX > 300){
                moveRight = false;  
            }
        if(moveRight == false){
            if(centerX < 100){
            }
        }
        }
        }
    break;
    case 2:{

    }
    }
}

这基本上只是将所有外星人向右移动并停止到目前为止,但我已经超越了最初的问题。

4

2 回答 2

4

你有一个无限循环:

moveRight = true;
while(moveRight == true){
    x += 1;
}

因为moveRight进入循环 astrue并且永远不会false通过重复执行x += 1;.

看起来你正试图让一些东西为向右的连续运动设置动画。但是,这不是这样做的方法,因为您的循环不会让代码的任何其他部分(包括渲染)执行。如果不了解您的代码结构,很难提供具体建议,但我建议您阅读动画循环。网上有很多关于这个主题的教程资源。寻找诸如java swing animation loop 之类的东西。

此外,看起来您需要break;在每个案例的末尾声明。

于 2013-08-07T00:57:04.040 回答
1

You loop,就其当前状态而言,是无限的。您需要有一个条件,您的boolean变量moveRight将设置为false.

于 2013-08-07T01:09:00.310 回答