gpt4 book ai didi

安卓和引擎 : Simple sprite collision

转载 作者:行者123 更新时间:2023-11-29 18:07:41 27 4
gpt4 key购买 nike

我是 AndEngine 游戏开发(或一般游戏开发)的新手,我正在开发一款非常简单的游戏。设置是我在游戏中有4个主要 Sprite :

a.) 战斗机b.) 坦克c.) 步兵d.) 炸弹

游戏目前处于无限循环中。战斗机从左边出来,在屏幕上不断放大,每秒不断地从右边出来。坦克从屏幕左侧出来,开到屏幕中间,放下一些开到屏幕右侧的步兵。然后坦克将面向左并回到它来自的地方。

玩家可以点击屏幕发射一枚直下的炸弹。当它击中坦克或士兵时,炸弹会爆炸(留下爆炸 Sprite )并且炸弹以及它与之碰撞的物体(坦克或士兵)从场景中分离。

我的困境是,我似乎无法解决涉及碰撞的逻辑。我的意思是当然,我得到了这些功能,但我在逻辑上被难住了。这是游戏本身的快照:

enter image description here

这是我的代码 fragment (此函数是从 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)

实体和场景 Activity 是 AndEngine 的一部分,那里真的不可能有错误。 BombTheTank2 是我的 Activity 的名称,所以是的,错误就在那里。

最佳答案

在停止遍历子项列表之前,您似乎正在分离 Sprites。让我们以干净的方式来做。试试这个:

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();
}
});
}

编辑:实际问题出在其他地方 - Erasmus 不小心迭代了 Tank 组和 Bomb 组相同的次数。解决方案是检查坦克数量并尽快停止迭代。

我个人总是使用 For-Each 循环,除非我真的需要知道索引,这让我省去了很多麻烦:-)

关于安卓和引擎 : Simple sprite collision,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532918/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com