我上周开始开发“太空飞船与彗星”风格的游戏,现在我停了下来。
游戏的目的是在彗星通过您的飞船之前对其进行射击。您通过向它们射击使彗星爆炸。简单的想法!
但是,有时在我玩游戏时会出现“ IndexOutOfBounds”错误。当我一段时间没有射击(我的镜头ArrayList的大小为0),然后我射击并碰撞它时,它几乎总是出现崩溃。
因此我的代码中存在某种错误,但我确实看不到它。现在,我希望你们中的一个可以理解为什么会这样,并使我免于进一步的“ IndexOutOfBounds”错误!:)
这是代码失败的部分,包括我用来移动彗星和镜头的功能:
游戏类
if(!Game.player.getShots().isEmpty() && !comet.getComets().isEmpty()) { //Om de är tomma så ignorera
for(int x = 0; x < Game.player.getShots().size(); x++) { //Shots X
if(!comet.getComets().isEmpty() && !comet.getComets().isEmpty()) {
for(int y = 0; y < comet.getComets().size(); y++) { //Comets Y
if(comet.getComets().get(y).intersects(Game.player.getShots().get(x)) && !comet.getComets().isEmpty() && !Game.player.getShots().isEmpty()) {
//the for loop above is the line that won't compile sometimes
comet.getComets().remove(y);
Game.player.getShots().remove(x);
score++;
}
}
}
}
}
//Comet spawn timer
comet.addComets();
//Move the comets and shots!
Game.player.moveShots();
comet.moveComets();
repaint();
班级
public ArrayList<Rectangle> getComets() {
return comets;
}
public void moveComets() {
if(!comets.isEmpty()) {
for(int x = 0; x < comets.size(); x++) {
comets.get(x).x -= cometSpeed;
}
}
}
播放器类(此类射击)
public void fire() {
shots.add(new Rectangle(x + player.width, y + 23, shotWidth,shotHeight));
}
public ArrayList<Rectangle> getShots() {
return shots;
}
public void moveShots() {
if(!shots.isEmpty()) {
for(int x = 0; x < shots.size(); x++) {
shots.get(x).x += fireSpeed;
}
}
}
请记住,彗星和镜头都是“矩形对象之外的ArrayList”
错误行在上面的代码中标记,if语句应阻止它崩溃(我认为)。
提前致谢!感谢所有帮助!:)
问题来源:Stack Overflow
您应该在if语句中更改顺序,以免对其一部分进行求值。您应该将条件更改为:
if( x < Game.player.getShots().size() && comet.getComets().get(y).intersects(Game.player.getShots().get(x))) {
那是因为您要删除镜头,并且在彗星内部,因为在下一次彗星迭代时删除镜头时,它将被抛出,IndexOutOfBounds因为数组不再具有您在if处检查的镜头,因此您需要再次检查用于拍摄中的x。您也可以在处进行检查,同时检查两个条件,然后让相交处仅在if处检查。
更好的性能是:
if(!Game.player.getShots().isEmpty() || !comet.getComets().isEmpty()) {
//if one of them is empty, won't be intersections
for(int x = 0; x < Game.player.getShots().size(); x++) { //Shots X
for(int y = 0; y < comet.getComets().size() && x < Game.player.getShots().size(); y++) {
//Comets Y only if the shoot still available
if(comet.getComets().get(y).intersects(Game.player.getShots().get(x))) {
//the for loop above is the line that won't compile sometimes
comet.getComets().remove(y);
Game.player.getShots().remove(x);
score++;
y = 0; // if you don't set the y = 0 the next shoot (as you removed the x, getShots.get(x) would be the x + 1 shoot) will only evaluate for the comets after y, won't evaluate the firsts comets at the array.
}
}
}
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。