大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.

如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;)


现在回到GameScene.m中,我们所有的碰撞处理就放在该类中.我们首先要搞清楚什么会和什么碰撞.就目前来说,我们先来实现2中碰撞:小球和砖块的碰撞,以及小球和反弹棒的碰撞.

小球和砖块的碰撞:碰撞开始

我们知道一般物理引擎对于碰撞的处理不是一蹴而就的,它分为多个阶段.在Chipmunk中将碰撞按照时间的前后分为开始和后续两个部分;不是在所有的碰撞处理中都要关注这2个方法,一般只要关注开始碰撞的部分就可以了.但是在小球和砖块碰撞的处理中,我们还要关注后续的部分,因为有些代码不可以放在碰撞的开始部分.下面我们先来看看碰撞开始回调代码是如何写的:

-(BOOL)ccPhysicsCollisionBegin:(CCPhysicsCollisionPair *)pair ball:(CCNode *)ball brick:(CCNode *)brick{

    [_userInterface updateHitsLabel:[NSString stringWithFormat:@"Hits:%d",++_hits]];

    _score += ((Brick*)brick).value * _scoreRatio;
    if (_scoreRatio > 1) {
        [self updateMsgLabel:[NSString stringWithFormat:@"Score X %d",_scoreRatio]];
    }
    //小球没连续碰撞一次砖块,得分比率都会翻倍
    _scoreRatio *= 2;

    [_userInterface updateScoreLabel:[NSString stringWithFormat:@"得分:%d",_score]];

    [brick removeFromParent];

    @synchronized(self){
        [_level removeFromBricks:brick];
    }

    return YES;
}

代码不长,首先更新了游戏场景中的撞击计数,然后按不同砖块的分值更新玩家的得分,然后将砖块从场景中删除.注意,最后调用了我们之前在Level类中实现的removeFromBricks方法,因为我们必须要更新关卡的数组.

小球和砖块的碰撞:碰撞结束

我们希望在小球与砖块碰撞时增加它的反弹力,所以我们要调整小球的力矩,而调整物理对象的力矩不能再CollisionBegin中完成,否则物理引擎会抱怨了 ;[ ,我们自然将其放到碰撞结束部分中:

-(BOOL)ccPhysicsCollisionPreSolve:(CCPhysicsCollisionPair *)pair ball:(CCNode *)ball
                            brick:(CCNode *)brick{
    CGPoint velocity = ball.physicsBody.velocity;
    //略微增加小球的力矩
    [ball.physicsBody applyImpulse:ccpMult(velocity, 1.00005)];
    return YES;
}

注意我增加了一个特别微小的力矩值,因为力矩会在多次碰撞后快速累积,很快就会变得非常大,毕竟你也不想看到小球经过几次反弹后超过光速吧 ;)

(NO.00004)iOS实现打砖块游戏(八):游戏中小球与砖块的碰撞的更多相关文章

  1. (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 前一篇博文介绍了物理对象中小球与砖块的碰撞处理,在这一篇中我们再 ...

  2. (NO.00004)iOS实现打砖块游戏(三):游戏主场景和砖块

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 制作墙体 首先在SpriteBuilder中新建Wall.ccb ...

  3. (NO.00004)iOS实现打砖块游戏(五):游戏场景类

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 创建游戏场景类头文件 在Xcode创建新GameScene类,继 ...

  4. (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 通用的星星类已经完成了,下面我们来实现具体的变长和缩短道具. 变 ...

  5. (NO.00004)iOS实现打砖块游戏(十六):导弹发射道具的实现(下)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 上一篇我们完成了导弹道具相关的道具制作,本篇中我们来完成其实现 ...

  6. (NO.00004)iOS实现打砖块游戏(一):素材的制作

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本系列来实现一个儿时就很喜欢的打砖块游戏,我记得以前红白机上有一 ...

  7. (NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 到目前为止游戏基本可玩,但是砖块数量是不变的,等玩家打光所有的砖 ...

  8. (NO.00004)iOS实现打砖块游戏(七):关卡类的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 关卡游戏的精髓都集中在游戏的关卡里,其中包含了游戏的所有要素,至 ...

  9. (NO.00004)iOS实现打砖块游戏(十四):3球道具的实现

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 反弹棒变化道具实现前面已经介绍过了,我们下面可以在小球上做些文章 ...

随机推荐

  1. ubuntu 16.04常见错误--Could not get lock /var/lib/dpkg/lock解决

    我的博客 ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决 通过终端安装程序sudo apt-get install xxx时出错: E: Cou ...

  2. redis启动失败

    redis.conf 设置的daemonize yes后台运行,使用redis-server redis.conf之后没有任何反应,以为启动成功 使用 ps -ef|grep redis 查看redi ...

  3. (概念)多个CPU和多核CPU以及超线程(Hyper-Threading)

    引言 在这篇文章中我会主要介绍CPU相关的一些重要概念和技术.如果你想更好地了解操作系统,那就从本文开始吧. 中央处理器(Central processing unit) 在我们了解其它概念之前,我们 ...

  4. 开发一个 app 有多难?

    171 个回答 默认排序​ 道衍天机 有事情的加微信1293190838找我 1,150 人赞同了该回答 ----------------------------------------------- ...

  5. Linux平台安装MongoDB

    MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download-center#community ...

  6. ubuntu + 远程桌面连接命令 + rdesktop + 连接windows或者ubuntu远程桌面

    原文 https://www.cnblogs.com/xiaouisme/p/5166469.html sudo apt-get install rdesktop rdesktop 124.42.12 ...

  7. 从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)

    1. python 中 axis 参数直觉解释 网络上的解释很多,有的还带图带箭头.但在高维下是画不出什么箭头的.这里阐述了 axis 参数最简洁的解释. 假设我们有矩阵a, 它的shape是(4, ...

  8. samba服务器配置过程

    SAMBA服务器配置 yum install samba samba-client samba-swat 改变文件权限及用户 vi /etc/samba/smb.conf d+G全删注释 复制下面代码 ...

  9. Thread 调用方法的方式

    1.传统ThreadStart 2.ParameterizedThreadStart 3.委托thread = new Thread(delegate() { NoticeBroadcast(user ...

  10. 中间件——canal小记

    接到个小需求,将mysql的部分数据增量同步到es,但是不仅仅是使用canal而已,整体的流程是mysql>>canal>>flume>>kafka>> ...