Android AndEngine:正确处理Collission Detection

Android AndEngine:正确处理Collission Detection,第1张

概述我正在研究一个涉及ff的简单AndEngine游戏.精灵 a.)坦克 b.)士兵 c.)炸d 我在这里有一个类似的问题:Android AndEngine: Simple sprite collision 游戏的样子: 但是,在解决最初的问题时,又出现了另一个问题: 当炸d(飞机当前所在的地方并垂直下降,直到它到达目标或地板,通过鼠标点击)击中目标,说一名士兵,士兵精灵必须分离并留下血液飞溅精灵1 我正在研究一个涉及ff的简单AndEngine游戏.精灵

a.)坦克
b.)士兵
c.)炸d

我在这里有一个类似的问题:Android AndEngine: Simple sprite collision

游戏的样子:

但是,在解决最初的问题时,又出现了另一个问题:

当炸d(飞机当前所在的地方并垂直下降,直到它到达目标或地板,通过鼠标点击)击中目标,说一名士兵,士兵精灵必须分离并留下血液飞溅精灵1秒,以及炸d爆炸精灵.但是,游戏力关闭会产生indexOutOfBoundError.据我所知,这可能是炸d与其目标之间精灵数量的差异,导致出现数组错误,但logCat根本没有帮助.

09-22 11:13:37.585: E/AndroIDRuntime(735): FATAL EXCEPTION: UpdateThread09-22 11:13:37.585: E/AndroIDRuntime(735): java.lang.indexoutofboundsexception: InvalID  index 5,size is 509-22 11:13:37.585: E/AndroIDRuntime(735):  at java.util.ArrayList.throwindexoutofboundsexception(ArrayList.java:251)09-22 11:13:37.585: E/AndroIDRuntime(735):  at java.util.ArrayList.get(ArrayList.java:304)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.entity.Entity.onUpdate(Entity.java:1167)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.entity.Entity.onUpdate(Entity.java:1167)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.engine.Engine.onUpdateScene(Engine.java:591)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.engine.Engine.onUpdate(Engine.java:586)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.engine.Engine.onTickUpdate(Engine.java:548)09-22 11:13:37.585: E/AndroIDRuntime(735):  at org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

如此处所示,logCat没有在我的代码上给出错误,但是在AndEngine本身上,并且很可能不是这样.

我的新代码在onCreateScene Update Handler中运行(根据上面链接的上一个问题的帮助):

protected voID checkSoldIErCollision() {    // Todo auto-generated method stub    int numBombs = bombGroup.getChildCount();    int numTroops = troopsGroup.getChildCount();    final ArrayList<Sprite> tobedetached = new ArrayList<Sprite>();    for (int i = 0; i < numBombs; i++) {        Sprite s = (Sprite) bombGroup.getChildByIndex(i);        for (int j = 0; j < numTroops; j++) {            Sprite s2 = (Sprite) troopsGroup.getChildByIndex(j);            if (s.collIDesWith(s2)) {                /*Sprite splat = createSplat();                splat.setposition(s.getX(),s.getY());                getEngine().getScene().attachChild(splat);*/                Sprite splode = createExplosion();                splode.setposition(s.getX(),s.getY());                getEngine().getScene().attachChild(splode);                // 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();                Sprite splode = createExplosion();                splode.setposition(s.getX(),s.getY());                getEngine().getScene().attachChild(splode);            }            tobedetached.clear();        }    });}

我注意到它只能是一个splat或爆炸,因为它没有错误.如果在碰撞时溅射和爆炸都填充场景,则会发生错误.

此外,即使炸d不击中士兵(但仍然分开并在击中地板时被爆炸云取代),它也会出现类似的错误:

我的createBomb函数:

public Sprite createBomb(float x,float y) {    Sprite bombSprite = new Sprite(x,y,this.mBombTextureRegion,getVertexBufferObjectManager());    MoveYModifIEr downModBomb = new MoveYModifIEr(1,60,FLOOR);    downModBomb.addModifIErListener(new IModifIErListener<IEntity>() {        @OverrIDe        public voID onModifIErStarted(IModifIEr<IEntity> pModifIEr,IEntity pItem) {        }        @OverrIDe        public voID onModifIErFinished(IModifIEr<IEntity> pModifIEr,final IEntity pItem) {             pItem.detachSelf();             AnimatedSprite explodeSprite = createExplosion();             explodeSprite.setposition(pItem.getX(),FLOOR);             getEngine().getScene().attachChild(explodeSprite);        }    });    bombSprite.registerEntityModifIEr(downModBomb); // register action    return bombSprite;}

我的onCreateScene炸d功能和碰撞up​​dateHandler:

scene.setonScenetouchListener(new IOnScenetouchListener() {        @OverrIDe        public boolean onScenetouchEvent(Scene pScene,touchEvent pScenetouchEvent) {            if (pScenetouchEvent.getAction() == touchEvent.ACTION_UP) {                runOnUiThread(new Runnable() {                    @OverrIDe                    public voID run() {                        Sprite bomb = createBomb(f16Sprite.getX(),f16Sprite.getY());                        bombGroup.attachChild(bomb);                    }                });                return true;            }            return false;        }    });    // periodic checks    scene.registerUpdateHandler(new IUpdateHandler() {        @OverrIDe        public voID onUpdate(float pSecondsElapsed) {            // checkTankCollision();            // checkSoldIErBackCollision();            checkSoldIErCollision();        }        @OverrIDe        public voID reset() {        }    });

我的createExplosion方法:

public AnimatedSprite createExplosion() {    AnimatedSprite boomSprite = new AnimatedSprite(0,this.mExplodeTextureRegion,getVertexBufferObjectManager());    DelayModifIEr delay = new DelayModifIEr(.3f); // delay in seconds,can                                                    // take float numbers .5                                                    // seconds    delay.addModifIErListener(new IModifIErListener<IEntity>() {        @OverrIDe        public voID onModifIErStarted(IModifIEr<IEntity> pModifIEr,IEntity pItem) {            ((AnimatedSprite) pItem).animate(new long[] { 100,100,100 },// durations/frame                    new int[] { 1,2,3 },// which frames                    true); // loop        }        @OverrIDe        public voID onModifIErFinished(IModifIEr<IEntity> pModifIEr,final IEntity pItem) {            ((AnimatedSprite) pItem).detachSelf();        }    });    boomSprite.registerEntityModifIEr(delay); // register action    return boomSprite;}

我该如何解决这个问题?循环逻辑并不完全是我的强项.我也对如何实现这个问题持开放态度.

更新:刚刚意识到,即使碰撞的结果是啪啪声或爆炸声,也没关系,如果玩家持续发送垃圾邮件(比如4-5次)整个游戏部队关闭.

– 无论何时创建焊料/罐的实例,似乎都有可允许的轰炸次数.每当炸d袭击一名士兵时,我就会先关闭制造爆炸(所以血液板只会留在原位而不是两者).它工作正常,但超过4-6枚炸d,游戏结束.当一个新的士兵实例产生时(意味着当旧的士兵离开屏幕并分离时),然后在游戏部队关闭之前给予玩家4-6个炸d.

解决方法 问题可能是由于您通过调用runOnUiThread在UI线程上附加炸d而检查更新线程上的冲突.尝试在runOnUpdateThread中添加炸d.

通常,您希望保持一致的用于 *** 作事物的线程,否则将出现奇怪的错误,这是调试的痛苦.

旁注:UI线程非常适合显示Toasts,请参阅此示例:

runOnUiThread(new Runnable() {    @OverrIDe    public voID run() {        Toast.makeText(GameActivity.this,"Hello!",Toast.LENGTH_SHORT).show();    }});
总结

以上是内存溢出为你收集整理的Android AndEngine:正确处理Collission Detection全部内容,希望文章能够帮你解决Android AndEngine:正确处理Collission Detection所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1130268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存