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

    这肯定就不对了

  • 相关阅读:
    input光标位置
    清除浮动
    CSS的两种盒模型
    网页中常用的命名
    清除inline-block元素默认间距
    自定义复选框样式及全选操作
    如何用elementui去实现图片上传和表单提交,用axios的post方法
    datatables
    9273:PKU2506Tiling
    666:放苹果
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332627.html
Copyright © 2011-2022 走看看