zoukankan      html  css  js  c++  java
  • cocos2d碰撞检测及注意事项

    检测函数:

    - (void)update:(ccTime)dt {

    NSLog(@"start......")

    NSMutableArray *projectilesToDelete = [[NSMutableArray alloc] init];
    for (CCSprite *projectile in _projectiles) {
    CGRect projectileRect = CGRectMake(
    projectile.position.x - (projectile.contentSize.width/2),
    projectile.position.y - (projectile.contentSize.height/2),
    projectile.contentSize.width,
    projectile.contentSize.height);

    NSMutableArray *targetsToDelete = [[NSMutableArray alloc] init];
    for (CCSprite *target in _targets) {
    CGRect targetRect = CGRectMake(
    target.position.x - (target.contentSize.width/2),
    target.position.y - (target.contentSize.height/2),
    target.contentSize.width,
    target.contentSize.height);

    if (CGRectIntersectsRect(projectileRect, targetRect)) {
    [targetsToDelete addObject:target];

    NSLog(@"check......")
    }
    }

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

    if (targetsToDelete.count >0) {
    [projectilesToDelete addObject:projectile];
    }
    [targetsToDelete release];
    }

    for (CCSprite *projectile in projectilesToDelete) {
    [_projectiles removeObject:projectile];
    [self removeChild:projectile cleanup:YES];
    }
    [projectilesToDelete release];

    NSLog(@"end......")
    }

    说明:我们仅仅通过遍历projectiles和targets数组,为每个projectile和target创建边界矩形,然后使用CGRectIntersectsRect来检测碰撞。如果发现有碰撞了,我们就从场景中移除精灵,同时也把它移除出数组。

    注意:我们不得不添加一个toDelete数组,因为我们不能在遍历一个数组的时候去删除数组中的对象。

    正常的运行结果是这样的:

    start....

    check....

    ....

    end....

    如果在遍历一个数组时删除数组中的对象的话,程序不会报错,但是逻辑就不对了,如下面的写法:

    if (CGRectIntersectsRect(projectileRect, targetRect)) {'

    NSLog(@"check.....")
    [_targets removeObject:target];
    [self removeChild:target cleanup:YES];

    [_projectiles removeObject:projectile];
    [self removeChild:projectile cleanup:YES];

    }

    调试函数运行的结果是这样的

    start....

    check....

    ....

    start....

    end....

    这肯定就不对了

  • 相关阅读:
    HDU3555:Bomb
    入门OJ:售货员的难题
    Zju1100 Mondriaan
    与图论的邂逅08:树上倍增
    入门OJ:八中生成树2
    Poj2286 The Rotation Game
    P1379 八数码难题
    [SCOI2005]骑士精神
    与图论的邂逅07:K短路
    [Usaco2007 Feb]Cow Party
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332627.html
Copyright © 2011-2022 走看看