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....

    这肯定就不对了

  • 相关阅读:
    POJ 2104 K-th Number(主席树模板题)
    HDU 6072 Logical Chain(Kosaraju+bitset)
    POJ 2728 Desert King(最优比率生成树 01分数规划)
    HDU 6150 Vertex Cover(构造)
    51nod 1693 水群(神奇的最短路!)
    51nod 1444 破坏道路(最短路)
    51nod 1076 2条不相交的路径(边双连通分量)
    HDU 6156 Palindrome Function
    Cortex-M0(+)内核的处理器架构简介
    [转] 软件开发流程
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332627.html
Copyright © 2011-2022 走看看