【问题标题】:Why aren't I getting One Bullet One Hit?为什么我没有得到一发一击?
【发布时间】:2011-08-31 13:58:27
【问题描述】:

在我的碰撞检测代码中,子弹一旦发生碰撞就会被停用:

for(int j = 0; j < enemies.size(); j++){
    //check for collision
    if(bullets[i].isActive() && bullets[i].getSprite().collidesWith(enemies.get(j).getSprite())){
    
        //remove bullet  
        removeBullet(i); //bullet is deactivated here, .isActive() will return false
        
        if(enemies.get(j).damage(1)){
            // --snip--
        }
        break;
    }
}

项目符号被停用的唯一地方是在这段代码中。它们唯一被激活的地方是它们被创建的时候。

尽管如此,一颗子弹会造成多次伤害。 removeBullet() 触发爆炸动画,并播放多次。可能出了什么问题?

更新

这里是removeBullet()

private void removeBullet(int i){
    if(bullets[i] == null) return;
    bullets[i].deactivate();
    makeSmallExplosion(bullets[i].getSprite().getX(),bullets[i].getSprite().getY());
    bulletPool.recyclePoolItem(bullets[i]);
    bullets[i] = null;
}

【问题讨论】:

  • 发布 removeBullet 代码,对您到目前为止发布的内容无济于事。

标签: android collision-detection andengine


【解决方案1】:

可能有多个线程在运行?或者,移除子弹可能不是问题。但是那个位置和/或敌人有多发子弹?

【讨论】:

  • 我不完全确定线程在 AndEngine 中是如何工作的,但是由于线程计时问题,第一次命中和后续命中之间的延迟可能很大,所以我怀疑是不是这样。我已经用一颗子弹和一个敌人进行了测试。
【解决方案2】:

啊和引擎;我实际上是论坛上的Mod :)

我已经写了这篇关于对象池的博客文章,以防您需要检查您的实现方式: http://c0deattack.wordpress.com/category/programming/andengine/

我想知道你是否正确地回收了子弹?

【讨论】:

  • 我已经阅读了,它对我为爆炸制作的 ExplosionPool 非常有效 :-) 我已经将我的 BulletPool 实现粘贴到 pastebin.com/TvveYkkP,发布整个内容可能有点多在这里。
  • 我看过 pastebin,一切看起来都很好。如果没有看到整个实现,我认为我不能说更多,但感觉就像它的线程相关。
  • 嗯。我不想粘贴 all 我的代码。你知道一些可以让我大致了解 AndEngine 如何使用线程的东西吗?
  • 不确定是否有任何记录,我没有看到任何东西,也许有人在论坛上发帖。我只是通过阅读源代码来学习的。我已经创建了自己的线程,然后我会查看您可能已注册的任何 UpdateHandlers。失败了,我只会调试整个事情。抱歉不能给你解决方案。
  • 我已经在论坛帖子中发布了我认为可能相关的所有内容,也许您可​​以在那里获得更多见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 2020-11-19
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多