【发布时间】:2012-09-21 14:50:46
【问题描述】:
我是 AndEngine 游戏开发(或一般游戏开发)的新手,我正在开发一款非常简单的游戏。设置是我在游戏中有4个主要精灵:
a.) 战斗机 b.) 坦克 c.) 步兵 d.) 炸弹
游戏处于当前无限循环中。战机从左边出来,在屏幕上缩放,每秒又从右边出来。坦克从屏幕左侧出来,走到屏幕中间,放下一些向屏幕右侧移动的步兵。然后坦克将面向左侧并返回原来的位置。
玩家可以点击屏幕来发射一个垂直向下的炸弹。当它击中坦克或士兵时,炸弹会爆炸(留下爆炸精灵)并且炸弹以及它所碰撞的物体(坦克或士兵)会从场景中脱离。
我的困境是,我似乎无法解决涉及碰撞的逻辑。我的意思是肯定的,我得到了这些功能,但我在逻辑上被难住了。这是游戏本身的快照:
这是我的 sn-p(这个函数是从 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)
Entity 和 Scene 活动是 AndEngine 的一部分,那里确实不可能有错误。 BombTheTank2 是我活动的名称,所以是的,错误就在那里。
【问题讨论】:
-
您是否尝试将两个for循环中的numCompares替换为bombGroup.getChildCount()?
-
是的,是一样的,不就是和numCompares一样吗?
-
不起作用,程序一开始出现 nullPointerException
-
嗯,我认为不,因为当您迭代列表然后删除其中的元素时,当您动态检查列表的限制时它可能会有所帮助。另一个想法,如果添加 i-- 是否有帮助;删除元素后?最后一个想法很垃圾,所以我删除了它,当这不起作用时,我真的没有更多的想法;)
标签: android collision-detection sprite andengine game-physics