0

现在我有精灵在屏幕上移动,当你触摸一个精灵时,你正在“射击”它。要查看是否有任何“敌人”被“击中”,我正在使用CGRectContainPoint它工作正常,直到我希望它需要更多的一击才能移除敌人。这是上一步:

- (void)update:(ccTime)dt {   

    _shot = bullet.position;
    BOOL enemyHit = FALSE;
    NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];

    for (CCSprite *target in _targets) {
        CGRect targetRect = target.boundingBox;

        if (CGRectContainsPoint(targetRect, _shot)) {
            enemyHit = TRUE;
            Enemy *enemy = (Enemy *)target;
            enemy.hp--;
            if (enemy.hp <= 0) {

                [targetsToDelete addObject:target];
            }
            break;          
        }                       
    }

    for (CCSprite *target in targetsToDelete) {
        [_targets removeObject:target];
        [self removeChild:target cleanup:YES];                                  
    }

    [targetsToDelete release];

}

我遇到的问题是它的更新速度比重置触摸位置的速度要快。这样一来,它就会在从 3 开始后将敌人的生命值带到 -2。我该如何解决这个问题?

编辑:我真的没有办法设置触摸所在的CGPoint,然后在一次更新迭代后将其重置为屏幕外。

4

1 回答 1

1

每次用户开始或完成一次触摸时进行触摸交叉测试是有意义的,而不是在更新循环中连续进行,因为您希望任何触摸精灵的生命在每次触摸后准确减少 1。

您可以通过实现 ccTouchesBegan 或 ccTouchesEnded 来实现(选择取决于您想要的点击行为):

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [touches anyObject];
    _shot = [touch locationInView:[touch view]];
    _shot = [[CCDirector sharedDirector] convertToGL:_shot];

   // move your entire sprite intersection logic here
}
于 2012-10-20T01:36:22.290 回答