我正在使用游戏来管理游戏中的子弹。唯一的问题是当从刚刚被回收的池中获取子弹时,因为它涉及碰撞,虽然它的Body的位置在初始化时使用Body.setTransform()
重置,子弹的Sprite的位置(用于使用Sprite.collidesWith(otherSprite)
检测碰撞的速度不够快(因为它在物理线程中更新)。这意味着新创建的子弹在创建瞬间会导致冲突,从而导致单个子弹导致多个冲突。
我在初始化时尝试调用Bullet.sprite.setPosition(0,0)
,但这显然会产生干扰,因为Bullets根本无法显示该代码行。我该怎么做才能防止这个问题?
子弹创作:
bullets[bulletCounter] = bulletPool.obtainPoolItem();
bullets[bulletCounter].getBody().setTransform(shipBody.getTransform().getPosition(),0);
bullets[bulletCounter].getBody().setLinearVelocity(shipBody.getLinearVelocity());
bullets[bulletCounter].activate();
碰撞检测:
for(int i = 0; i < BULLET_MAX; i++){
if(bullets[i] != null && bullets[i].isActive()){
for(int j = 0; j < enemies.size(); j++){
//check for collision!
if(bullets[i].getSprite().collidesWith(enemies.get(j).getSprite())){
//-snip-
break;
}
}
}
}
答案 0 :(得分:0)
我有兴趣看到你在调用onHandleObtainItem
从池中获取子弹时所做的事情。
当您调用onHandleRecycleItem
时,将精灵位置设置为某个屏幕外值是没有意义的,例如:
@Override
protected void onHandleRecycleItem(final Bullet pBullet) {
pBullet.disable();
pBullet.getSprite().setPosition(-1, -1);
}