《Cocos2D权威指南》——2.4 碰撞检测

简介: 本节书摘来自华章计算机《Cocos2D权威指南》一书中的第2章,第2.4节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 碰撞检测

很快大家就会发现,射出的子弹和敌机都是“擦肩而过”,毫无威力,这显然不合逻辑。这里我们介绍Cocos2D里常用的碰撞检测方法,用于检测游戏对象之间的碰撞。虽然这种碰撞比较简单,检测精度也不是很高,但是对于一般游戏来说已经足够了。
在介绍实际的碰撞检测方法之前,我们需要一个辅助方法,根据精灵当前的位置算出它的“可碰撞区域”,如代码清单2-24所示。
代码清单2-24 辅助方法的实现

-(CGRect) rectOfSprite:(CCSprite*)sprite{
   returnCGRectMake(sprite.position.x - sprite.contentSize.width / 2, 
                  sprite.position.y - sprite.contentSize.height /2, 
                  sprite.contentSize.width, sprite.contentSize.height);
}

此方法根据精灵所在位置和精灵的实际大小计算出一个矩形区域代表精灵的可碰撞区域。
具体的碰撞检测代码如代码清单2-25所示。
代码清单2-25 碰撞检测

-(void) collisionDetection:(ccTime)dt{

   CCSprite *enemy;
   CGRectbulletRect = [self rectOfSprite:_bulletSprite];
   CCARRAY_FOREACH(_enemySprites, enemy)
   {
      if (enemy.visible) {
         //1.bullet & enemy collision detection
         CGRectenemyRect = [self rectOfSprite:enemy];
         if (_bulletSprite.visible&&CGRectIntersectsRect(enemyRect, bulletRect)) {
             enemy.visible = NO;
            _bulletSprite.visible = NO;

            [_bulletSpritestopAllActions];
            [enemystopAllActions];
            CCLOG(@"collision bullet");
            break;
         }

         //2.enemy & player collision detection
         CCSprite *playerSprite = (CCSprite*)[self getChildByTag:kTagPalyer];
         CGRectplayRect = [self rectOfSprite:playerSprite];
         if (playerSprite.visible&&
            playerSprite.numberOfRunningActions == 0
            &&CGRectIntersectsRect(enemyRect, playRect)) {
            enemy.visible = NO;
            id blink = [CCBlink actionWithDuration:2.0 blinks:4];
            [playerSpritestopAllActions];
            [playerSpriterunAction:blink];
            CCLOG(@"collision player");
            break;
         }
      }
   }
}

在这个游戏中我们只需要关心子弹与敌机的碰撞、敌机与玩家飞机的碰撞就行了。因此,首先我们计算出子弹的碰撞区域,遍历所有的敌机,逐个判断敌机与子弹以及敌机与玩家飞机之间的碰撞。
注意 这里用CGRectIntersectsRect方法检测碰撞,此方法判断两个矩形是否相交。如果形状不规则,或者原始精灵图片的透明像素过多,这种检测方法就会非常不准确。后面学习物理引擎时,我们将介绍一种更加精确的碰撞检测方法。
这里需要注意两点:
检测对象必须在屏幕可见范围之内;
检测到碰撞以后需要停止action,再做相应的碰撞处理逻辑,比如让敌机消失、计分之类。
当然,由于此处敌机采用复用的方式,击中以后并不是删除这个对象,而只是把可见性设置为NO,然后放回数组里,下次又可从里面再取出来,再次向玩家发起进攻。
编译并运行,体验杀死敌机的快感吧!

相关文章
|
存储 开发工具 索引
游戏编程之十七 生成简单的动画
游戏编程之十七 生成简单的动画
54 0
|
Android开发 iOS开发
【Cocos2d-x】开发基础-Cocos2d-x坐标系
【Cocos2d-x】开发基础-Cocos2d-x坐标系
163 0
|
JavaScript 前端开发
《Cocos2D-x权威指南》——3.9 绘制图形
本节书摘来自华章计算机《Cocos2D-x权威指南》一书中的第3章,第3.9节,作者:满硕泉著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1193 0
|
容器
《Cocos2D-x权威指南》——3.6 摄像机类
本节书摘来自华章计算机《Cocos2D-x权威指南》一书中的第3章,第3.6节,作者:满硕泉著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1255 0
|
存储 缓存 JavaScript
《Cocos2D权威指南》——3.5 CCTexture纹理类
本节书摘来自华章计算机《Cocos2D权威指南》一书中的第3章,第3.5节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1414 0
|
JavaScript
《Cocos2D权威指南》——2.5 游戏音效
本节书摘来自华章计算机《Cocos2D权威指南》一书中的第2章,第2.5节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
926 0
|
缓存 JavaScript 前端开发
《Cocos2D-x权威指南》——3.5 精灵类
本节书摘来自华章计算机《Cocos2D-x权威指南》一书中的第3章,第3.5节,作者:满硕泉著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1136 0
|
前端开发 JavaScript iOS开发
《Cocos2D权威指南》——2.2 构建游戏场景
本节书摘来自华章计算机《Cocos2D权威指南》一书中的第2章,第2.2节,作者:王寒,屈光辉,周雪彬著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1161 0