cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x
2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记
那么这一步,我们先不急着给主角和金币岩石碰撞检測,我这里把cocos2d-x 3.0 的物理碰撞检測单独抽取出来。之前看了cocos的官网,有一个教程:用新物理引擎完毕碰撞检測。就是一个车和猫的碰撞检測。车撞倒猫。猫就消失。我之前也单独试了下。可是那个教程的代码好像完整性不好,不能执行。。。于是我又借鉴了笨木头的的实例教程,完毕了这个简单的碰撞检測。
检測例如以下:有一个受重力影响的小球1。会下落。然后以下有一个静态刚体的小球2,不受重力影响的固定在小球1的正下方。然后小球1撞到小球2,小球2就消失。而且碰撞的时候,小球1不会受到小球2的阻力而停一下。那么这里实际上就是为了给主角和金币的碰撞检測。
仅仅是为了简单。这里先单独把碰撞检測抽离出来。
以下来完毕:
先新建一个新的项目:改动HelloWorld.h & .cpp文件内容例如以下:
#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__ #include "cocos2d.h" class HelloWorld : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(HelloWorld); cocos2d::PhysicsWorld* m_world;
void setPhyWorld(cocos2d::PhysicsWorld* world){ m_world = world;};
//以下的内容就是为了物理碰撞检測
cocos2d::EventDispatcher* dispatcher;
void onEnter();
void onExit();
bool onContactBegin(cocos2d::PhysicsContact& contact);
};/**/ #endif // __HELLOWORLD_SCENE_H__ -------------------.cpp-----------------------
#include "HelloWorldScene.h" USING_NS_CC; Scene* HelloWorld::createScene()
{
//创建物理scene
auto scene = Scene::createWithPhysics();
//开启调试
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL); auto layer = HelloWorld::create(); layer->setPhyWorld(scene->getPhysicsWorld()); scene->addChild(layer); return scene;
} // on "init" you need to initialize your instance
bool HelloWorld::init()
{ auto ball_1 = Sprite::create("11.png");
//创建刚体
auto body1 = PhysicsBody::createBox(ball_1->getContentSize()); //使得能够检測到物理碰撞
body1->setCategoryBitmask(1);
body1->setCollisionBitmask(1);
body1->setContactTestBitmask(1); //绑定
ball_1->setPhysicsBody(body1);
ball_1->setPosition(205,300);
//设置标签,为碰撞做推断
ball_1->setTag(1);
this->addChild(ball_1); //同上
auto ball_2 = Sprite::create("22.png");
auto body2 = PhysicsBody::createEdgeBox(ball_2->getContentSize());
body2->setCategoryBitmask(1);
body2->setCollisionBitmask(1);
body2->setContactTestBitmask(1); ball_2->setPhysicsBody(body2);
ball_2->setPosition(205,150);
ball_2->setTag(2);
this->addChild(ball_2); return true;
} void HelloWorld::onEnter(){
Layer::onEnter();
auto contactListenner = EventListenerPhysicsContact::create(); //----1-----好像两个方法都能够
//contactListenner->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this); //----2-----
contactListenner->onContactPreSolve = CC_CALLBACK_1(HelloWorld::onContactBegin,this); //事件派发机制
dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->addEventListenerWithSceneGraphPriority(contactListenner,this);
}
void HelloWorld::onExit(){
Layer::onExit();
//取消事件派发机制
dispatcher->removeAllEventListeners();
}
bool HelloWorld::onContactBegin(PhysicsContact& contact){ auto b_1 = (Sprite*)contact.getShapeA()->getBody()->getNode();
auto b_2 = (Sprite*)contact.getShapeB()->getBody()->getNode(); CCLOG("ssssss"); if(b_1->getTag() == 2){
b_1->setVisible(false);
}
if(b_2->getTag() == 2){
b_2->setVisible(false);
} //返回false 使得物理世界忽略这次碰撞带来的速度改变,反弹什么的
return false;
}
在init函数中,我们就弄了两个小球。按上面说的分别绑定刚体。并且为了让刚体能被碰撞检測到,应该加入三个语句:
setCategoryBitmask(1);
setCollisionBitmask(1);
setContactTestBitmask(1);
能够查看源代码凝视。这里不解释
关于碰撞检測:
这里主要就是 onEnter
和 onExit 函数,步骤例如以下:
onEnter:
弄一个碰撞的事件监听 contactListenner 那么这个碰撞监听应该设置它的回调函数----当有碰撞发生的时候就调用
那么3.0里面的事件管理都交给了事件派发机制 我们也须要一个 dispatcher ,把那个事件监听 contactListenner 交给它管理;
碰撞的回调函数就会有一个參数 :PhysicsContact& contact 它就能够获得这两个发生碰撞的Node。。
。。
做出对应处理
然后就是onExit函数 ,应该取消掉事件派发的监听。。
。(事实上这里我也说不清,这个函数在哪里调用也不知道)。好吧反正这里能打到目的即可。执行測试截图例如以下:
下落的小球穿过了静态小球。对于这里碰撞,我们仅仅是把 以下的小球让它看不到,这里就和我们前面一步有关系了,由于为了避免反复的create 金币,我们无论是主角吃了的金币,还是到屏幕外面看不到的金币。都设置为不可见,然后再又一次出现
OK,,有了这里。我们就运用到以下的游戏中,让金币和岩石 与主角发生碰撞。到后面一步。也就是最后一步啦。。。。
哦哦差点忘了。这一部分的代码和两个小球的资源已经上传,0 积分下载:碰撞检測样例
我们新建一个项目,直接复制代码,以及把两个小球增加Resource文件 就能够执行看到结果啦
个人愚昧观点。欢迎指正与讨论!
cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)的更多相关文章
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&全新的3.0物理世界
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第六步--金币&岩石加入而且管理
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測
玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其他的植物仅仅需触摸那个植物将其拖入到想要摆放的位置,这事实上就是这节要写的触摸事件.还能够发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸, ...
- Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题
好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第一步--- 开始界面
说明:这里是平局:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&同一时候带着刚体
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
- cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第六步---炮台&点击炮台加入英雄&英雄升级
/* 说明: **1.本次游戏实例是<cocos2d-x游戏开发之旅>上的最后一个游戏,这里用3.0重写并做下笔记 **2.我也问过木头本人啦,他说:随便写,第一别全然照搬代码:第二能够说 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机
说明:这里是借鉴:晓风残月前辈的博客.他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...
随机推荐
- Spring AOP(aspect oriented programming) 转载
1.面向切面的基本原理 软件系统可以看成是由一组关注点组成的,其中,直接的业务关注点,是直切关注点.而为直切关注点提供服务的,就是横切关注点. 01.什么是面向切面编程 横切关注点:影响应用多处的功能 ...
- mongoDB 删除集合后,空间不释放的解决方法
mongoDB 删除集合后,空间不释放,添加新集合,没有重新利用之前删除集合所空出来的空间,也就是数据库大小只增不减. 方法有: 1.导出导入 dump & restore 2.修复数据库 r ...
- JS——正则
正则的声明: 1.构造函数:var 变量名= new RegExp(/表达式/); 2.直接量:var 变量名= /表达式/; test()方法: 1.正则对象方法,检测测试字符串是否符合该规则,返回 ...
- Android Studio 快捷键整理
Alt+回车 导入包,自动修正 Ctrl+N 查找类Ctrl+Shift+N 查找文件Ctrl+Alt+L 格式化代码Ctrl+Alt+O 优化导入的类和包Alt+Insert 生成代码(如ge ...
- Java_Web三大框架之Hibernate+jsp+selvect+HQL查询数据
俗话说:"好记性不如烂笔头".本人学习Hibernate也有一个星期了,对Hibernate也有一个初步的了解.下面对Hibernate显示数据做个笔记,使用租房系统的Hibern ...
- 从CSDN转到cnblogs了
之前一直用的CSDN的博客,网站卡慢经常出问题,发布文章要审核,连修改几个标点符号也要审核,这些我都忍了,毕竟之前发的文章舍不得弃掉. 现在竟然无故封禁我的博客?请问我写的都是技术文章,有哪点违反规定 ...
- Resetting the SMC & PRAM
Resetting the SMC & PRAM on portables with a battery you should not remove on your own 1. Shut d ...
- day07-列表类型/元组类型/字典类型/集合类型内置方法
目录 列表类型内置方法 元组类型内置方法 字典类型内置方法 集合类型内置方法 列表类型内置方法 用来存多个元素,[]内用逗号隔开任意数据类型的元素 1. list()强制类型转换 print(list ...
- 字符串str
字符串: #字符串的索引从0开始的,如果倒数最后一位是-1,索引的位置是唯一的.var1 = var[0:2] #从第一个字符到第2个字符var2 = var[:] #从第一个到最后var3 = va ...
- Split()函数
最近遇到一个有趣的问题关于使用Split函数 ,该函数能够根据传递的参数拆分,并返回一个string的数组. 贴出一个奇怪的例子 using System; using System.Collecti ...