我是AndEngine游戏开发(或游戏开发)的新手,我正在开发一款非常简单的游戏。设置是我在游戏中有4个主要的精灵:
a。)战斗机 b。)坦克 c。)步兵 d。)炸弹
游戏处于当前的无限循环中。战斗机从左侧出来,在屏幕上放大,并且每秒都会连续向右突出。坦克从屏幕的左侧出来,走到屏幕的中间,让一些步兵走向屏幕的右侧。然后坦克将朝左,然后回到它来自的地方。
玩家可以点击屏幕发射直接向下的炸弹。当它击中坦克或士兵时,炸弹爆炸(留下爆炸精灵)和炸弹,以及它碰撞的物体(坦克或士兵)脱离现场。
我的困境是,我似乎无法解决涉及碰撞的逻辑。我的意思是,我得到了功能,但我很难理解逻辑。以下是游戏本身的快照:
这是我的代码片段(此函数是从onCreateScene更新处理程序调用的:
protected void checkTankCollision() {
// TODO Auto-generated method stub
int numCompares = bombGroup.getChildCount();
for (int i = 0; i < numCompares; i++) {
Sprite s = (Sprite) bombGroup.getChildByIndex(i);
for (int j = 0; j < numCompares; j++) {
Sprite s2 = (Sprite) tankGroup.getChildByIndex(j);
if (s.collidesWith(s2)) {
// boom
AnimatedSprite boom = createExplosion();
boom.setPosition(s.getX(), s.getY());
getEngine().getScene().attachChild(boom);
// WARNING: cannot detach from the list
// while looping through the list
final Sprite a = s;
final Sprite b = s2;
// this will do the action after the scene is done updating
getEngine().getScene().postRunnable(new Runnable() {
@Override
public void run() {
a.detachSelf();
b.detachSelf();
}
});
}
}
}
}
一些炸弹发射后游戏部队关闭。它给出了indexOutOfBoundsException错误。
这是logCat:
09-22 00:12:14.565: E/AndroidRuntime(924): FATAL EXCEPTION: UpdateThread
09-22 00:12:14.565: E/AndroidRuntime(924): java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1
09-22 00:12:14.565: E/AndroidRuntime(924): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
09-22 00:12:14.565: E/AndroidRuntime(924): at java.util.ArrayList.get(ArrayList.java:304)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.entity.Entity.getChildByIndex(Entity.java:612)
09-22 00:12:14.565: E/AndroidRuntime(924): at com.cs119.bombthetank2.BombTankActivity.checkTankCollision(BombTankActivity.java:660)
09-22 00:12:14.565: E/AndroidRuntime(924): at com.cs119.bombthetank2.BombTankActivity$4.onUpdate(BombTankActivity.java:194)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.engine.handler.UpdateHandlerList.onUpdate(UpdateHandlerList.java:47)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1395)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.entity.Entity.onUpdate(Entity.java:1167)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.engine.Engine.onUpdateScene(Engine.java:591)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.engine.Engine.onUpdate(Engine.java:586)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)
09-22 00:12:14.565: E/AndroidRuntime(924): at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)
实体和场景活动是AndEngine的一部分,并且那里确实没有任何错误。 BombTheTank2是我活动的名称,所以是的,错误就在那里。
答案 0 :(得分:2)
在停止迭代子列表之前,您似乎正在分离Sprite。让我们干净利落。试试这个:
protected void checkTankCollision() {
int numCompares = bombGroup.getChildCount();
final ArrayList<Sprite> toBeDetached = new ArrayList<Sprite>();
for (int i = 0; i < numCompares; i++) {
Sprite s = (Sprite) bombGroup.getChildByIndex(i);
for (int j = 0; j < numCompares; j++) {
Sprite s2 = (Sprite) tankGroup.getChildByIndex(j);
if (s.collidesWith(s2)) {
// boom
AnimatedSprite boom = createExplosion();
boom.setPosition(s.getX(), s.getY());
getEngine().getScene().attachChild(boom);
// WARNING: cannot detach from the list
// while looping through the list
toBeDetached.add(s);
toBeDetached.add(s2);
}
}
}
runOnUpdateThread(new Runnable() {
@Override
public void run() {
for (Sprite s : toBeDetached) {
s.detachSelf();
}
toBeDetached.clear();
}
});
}
编辑:实际问题是在其他地方 - 伊拉斯谟意外地在坦克组上迭代了与炸弹组相同的次数。解决方案是检查坦克的数量并尽快停止迭代。
我个人总是使用For-Each循环,除非我真的需要知道索引,它给我带来了很多麻烦: - )
答案 1 :(得分:1)
我认为你需要对UpdateThread进行“分离”,所以不要这样做
getEngine().getScene().postRunnable(new Runnable() {
@Override
public void run() {
a.detachSelf();
b.detachSelf();
}
试试这个
runOnUpdateThread(new Runnable() {
@Override
public void run() {
a.detachSelf();
b.detachSelf();
}
每次分离某些内容时,都应该减少numCompares值。一旦分离了某些内容,包含这些实体的数组现在就会变小。由于您在开始时拉动数组长度,因此最终会超出数组的末尾 - 因此您的IndexOutOfBounds错误。仍需要在UpdateThread上运行分离。