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

    这肯定就不对了

  • 相关阅读:
    《鸟哥的私房菜阅读摘要》——linux的简介和计算机基础
    抽象类可以有构造函数吗
    Java对象及对象引用变量
    html5的学习笔记
    xhtml的学习笔记
    交换机配置原理
    (转)MSI
    python xy
    Microsoft SilverLightt是一个跨浏览器的、跨平台的插件,为网络带来下一代基于.NETFramework的媒体体验和丰富的交互式应用程序。
    epub使用Adobe Digital Editions打开
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332627.html
Copyright © 2011-2022 走看看