1

我正在用 cocos2D 制作一个小游戏,您可以在其中使用加速度计驾驶一艘船并通过点击屏幕击落物体。您击落的物体由 CCMoveTo 控制,它会将它们从屏幕顶部向下移动到 0 以下。如果船与其中一个飞行物体发生碰撞,它们将停止产卵,并且所有其他时间表都将暂停。出现“暂停屏幕”。

代码:

for (CCSprite *sprite in _flyingObjects)
{
    if (CGRectIntersectsRect(_ship.boundingBox, _sprite.boundingBox))
    {
        [sprite removeFromParentAndCleanUp:YES];
        [self pauseSchedulerAndActions];

        CCMenuItem *resumeMenuItem = [CCMenuItemImage itemWithNormalImage:@"resume.gif" selectedImage:@"resume.gif" target:self selector:@selector(resumeButtonTapped:)];
        resumeMenuItem.position = ccp(150, 190);
    }
}

- (void)resumeButtonTapped:(id)sender
{
    [self removeChild:resumeMenuItem];
    [self resumeSchedulerAndActions];

}

飞行物体在 x 轴上每隔 1 秒在相同的 y 值上随机生成。



我的问题是,当 _ship 与飞行物体发生碰撞时,菜单与 resumeButton 一起弹出,如果我单击 resumeButton,它会按原样移除但仅持续 1/100 秒,然后再次加载菜单。

这意味着CGRectIntersecsRect()检测到碰撞,即使我removeAndCleandUp之前有它应该删除,然后当点击 resumeButton 时,它们应该开始在顶部产卵,而不是不可见的左侧并与船相撞。这是什么原因造成的?

抱歉,提出了一个糟糕的问题,如果不清楚,请询问。提前致谢!

4

1 回答 1

3

removeFromParentAndCleanUp:children在枚举_flyingObjects集合时从其父数组中删除节点。您也必须从中删除您的精灵_flyingObjects

请记住,您不能在枚举集合时对其进行变异,因此将必须删除的对象存储在临时集合中,并在_flyingObjects完成枚举后从该集合中删除对象。

于 2013-08-19T16:44:34.500 回答