《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,然后放回数组里,下次又可从里面再取出来,再次向玩家发起进攻。
编译并运行,体验杀死敌机的快感吧!

相关文章
|
容器
关于在容器通过apt安装程序碰到的问题
记录容器安装程序的问题
2374 0
cocos 2.4*项目实战笔记及源码分享 —— 飞机大战小游戏
cocos 2.4*项目实战笔记及源码分享 —— 飞机大战小游戏
372 0
|
图形学 开发工具 git
Unity与版本控制:游戏开发团队如何利用Git打造高效协作流程,实现代码管理的最佳实践指南
【8月更文挑战第31天】版本控制在软件开发中至关重要,尤其在Unity游戏开发中,能提升团队协作效率并避免错误。本文介绍如何在Unity项目中应用版本控制的最佳实践,包括选择Git、配置项目以排除不必要的文件、组织项目结构、避免冲突、规范提交信息以及使用分支管理开发流程,从而提高代码质量和团队协作效率。
1106 2
|
数据可视化 API 索引
DOTween教程☀️DOTween的使用教程
DOTween教程☀️DOTween的使用教程
|
开发工具 git 开发者
|
Kubernetes Java Nacos
nacos常见问题之k8s上部署需要自动扩缩容如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
399 0
|
弹性计算 运维 负载均衡
Serverless实战——2分钟,教你用Serverless每天给女朋友自动发土味情话
今天说一下如何用Python结合阿里云Serverless函数计算每天定时给女朋友发天气预报和情话,让她明白程序员也有浪漫。欢迎大家学习哈。
35179 28
Serverless实战——2分钟,教你用Serverless每天给女朋友自动发土味情话
|
人工智能
【AI绘画】使用ControlNet- lineart模型
【AI绘画】使用ControlNet- lineart模型
818 0
【AI绘画】使用ControlNet- lineart模型
|
网络协议 JavaScript Linux
一文彻底搞懂ssh的端口转发
端口转发是突破网络域隔离的一个手段。在学习这个知识的时候需要不断自问
5121 0
|
Dart IDE 开发工具
Flutter框架对热重载在项目里的深度运用,状态热重新加载以及静态字段被延迟初始化【Flutter】
Flutter框架对热重载在项目里的深度运用,状态热重新加载以及静态字段被延迟初始化【Flutter】