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)

时间: 2024-08-26 04:49:01

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第六步--物理碰撞检测(1)的相关文章

cocos2d-x 3.0游戏实例学习笔记 《跑酷》一 开始界面

开始界面和前辈的基本上差不多:cocos2d-x游戏开发 跑酷(一)开始界面     但是也有不同 下面先给出游戏过程中用到的所有资源 开始界面定义为:MainScene 有如下功能: 1.背景 2.进入游戏界面按钮 3.预先加载背景音乐文件 .h文件 #ifndef __MainScene__H__ #define __MainScene__H__ #include "cocos2d.h" class MainScene : cocos2d::Layer{ public: virtu

cocos2d-x 3.0游戏实例学习笔记 《跑酷》移植到android手机

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 好吧,自从上次<跑酷>完结之后,就什么没做什么的,主要是修复了一点点bug ,也在相应的文章里面做出了相应的改动.不过,只能在window上看着玩又有什么太大意思呢!!!于是乎又尝试着弄到手机上试试--OK,初生牛犊不要脸,哦不!不怕喷.这里记录一下我的移植过程.(这里会用到新的大小的资源.待会也会

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角添加动作

这一步当中,我们主要完成以下功能: 1.地图的无限滚动---让主角看起来真的是在跑动 2.给主角添加Jump跳跃和crouch下蹲动作 那么首先来让背景滚动起来,在PlayScene.h中添加: //初始化背景 void initBG(); //用update函数让地图滚动 virtual void update(float dt); //背景精灵 cocos2d::Sprite* bgSprite1; cocos2d::Sprite* bgSprite2; cocos2d::Sprite* g

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同时带着刚体

在这一步,我们主要是把主角加入到游戏场景中来,并且让它跑动,这里的跑动,实际上也就是执行一组动画,让其看起来像是在跑动,而且相对屏幕的位置也不会改变 我们会定义一个主角类:Runner,而这一步就要用到 帧动画 的创建和使用等知识点. 对于Runner,我的设计思路如下: 1.主角有一个动作集合,包括跑动,跳起来,以及蹲下.那么就有不同的帧动画,那么这里借鉴到 晓风残月前辈的方法,将帧动画打包命名,之后根据动作名来执行动作 2.主角需要绑定刚体,并且在不同的动作下的刚体大小不同 3.我们给主角设

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本重写的,目前我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要公布源码.那么这里有两种方式: 第一种:将我运行成功的整个项目打包,VS2012+win7下的,这种方式就比较大,但是可以打开打开 Run/proj.win32/Run.sln 就可以啦 第二种:就是我只打包

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 OK,到昨天为止,我们已经将游戏基本上写完了,这里本来就是别人开源的东西,我这里重写,当然要发布源代码.那么这里有两种方式: 第一种:将我执行成功的整个项目打包,VS2012+win7下的,这样的方式就比較大,可是能够打开打开 Run/proj.win32/Run.sln 就能够啦 另外一种:就是我

cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第五步--按钮控制主角Jump&amp;Crouch

这一步当中,我们给PlayScene中 添加两个按钮,让主角Jump and Crouch,按钮功能如下: Jump按钮,按下主角跳起来 Crouch按钮,按下主角下蹲,一直按着一直蹲,松开之后主角才站起来 这里用按钮包含头文件"cocos-ext.h"会遇到一点点问题,后面给出详细解决方法: 首先PlayScene.h中要包含头文件: <span style="font-size:14px;">#include "cocos-ext.h&qu

cocos2d-x 3游戏实例学习笔记 跑酷(前言)

游戏开发环境:coco2d-x 3.0正式版 . C++ .Win7.VS2012 自己的现状: 大二学生一枚,刚刚接触cocos2dx 不久,是看着笨木头的<游戏开发之旅>入门的,并且也只是学习了基本的知识点用法,木头的代码是基于2.X写的,但是我一开始就是使用3.0的引擎,所以也是一边学习一边把之前的代码向3.0转变.也看了许多网上教程,star特530等许多人的博客....而且C++那些也只是学习了皮毛.看到网上许多游戏实例教程,于是自己决定用实例来学习cocos. 学习背景: 网上有许