我一直致力于一个试图学习一些基础知识的小项目,我正在尝试克隆太空入侵者。我没有真正的经验(这就是为什么我这样做)而且我遇到过以前从未遇到过问题的事情。
我的问题是循环,我使用了基本循环,但我现在使用了一些嵌套循环,它给了我一些问题。这是破坏我的项目的代码
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)。 此代码是从另一个函数调用的,该函数经常从swing计时器调用。
正在发生的事情是,当代码到达这一点时,程序似乎冻结了。我在JPanel上有一个没有反应的按钮,我有一个热键来关闭没有反应的应用程序,并且用鼠标退出应用程序什么也没做(我在JFrame中包含了一个DefaultCloseOperation(EXIT_ON_CLOSE)循环时没有这个工作。)
如果我用“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:{
}
}
}
这基本上是将所有外星人向右移动并停止到目前为止,但我已经超越了原来的问题。
答案 0 :(得分:4)
你有一个无限循环:
moveRight = true;
while(moveRight == true){
x += 1;
}
因为moveRight
以true
进入循环,并且永远不会通过重复执行false
而成为x += 1;
。
看起来你正试图让某些东西动画到右边的连续动作。但是,这不是这样做的方法,因为你的循环不会让代码的任何其他部分(包括渲染)执行。在不了解您的代码结构的情况下,很难提供具体的建议,但我建议您阅读动画循环。网上有很多关于这个主题的教程资源。寻找像 java swing animation loop 这样的东西。
此外,在每个案例结束时,您似乎需要break;
语句。
答案 1 :(得分:1)
你loop
,就像现在的状态一样,是无限的。您需要设置一个条件,将boolean
变量moveRight
设置为false
。