Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
这篇我要给大家介绍两个知识点:
1. 创建游戏物理世界
2. 没了(小若:我噗)
害怕了?不用操心。这太简单了~!
笨木头花心贡献。啥?花心?不呢。是用心~
转载请注明,原文地址:http://www.benmutou.com/blog/archives/804
文章来源:笨木头与游戏开发
3.0新亮点。史上最简单的物理引擎
在Cocos2d-x3.0里使用物理引擎,会非常有快感,由于非常多繁琐的东西它都帮我们封装好了。
那么,我要開始创建游戏的关卡场景了,大家跟紧了。
我们给关卡场景命名为TollgateScene,头文件例如以下:
- #ifndef TollgateScene_H
- #define TollgateScene_H
- #include "cocos2d.h"
- USING_NS_CC;
- class TollgateScene : public Layer
- {
- public:
- ~TollgateScene();
- static Scene* scene();
- CREATE_FUNC(TollgateScene);
- virtual bool init();
- virtual void onExit() override;
- };
- #endif
头文件没有什么特别的,和普通的场景头文件一样。
然后,来看看cpp文件:
- #include "TollgateScene.h"
- TollgateScene::~TollgateScene()
- {
- }
- Scene* TollgateScene::scene()
- {
- auto scene = Scene::createWithPhysics();
- /* 微重力世界 */
- Vect gravity(0, -0.5f);
- scene->getPhysicsWorld()->setGravity(gravity);
- /* 开启測试模式 */
- scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
- //创建一个边界
- Size visibleSize = Director::getInstance()->getVisibleSize();
- /*
- 创建一个空心盒子刚体,作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)
- 參数各自是刚体大小、材质(事实上就是一些预设的配置数据)、边线厚度
- */
- auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
- /* 创建一个节点。用于承载刚体,这样刚体就能參与到游戏的物理世界 */
- auto node = Node::create();
- node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
- node->setPhysicsBody(body);
- scene->addChild(node);
- auto layer = TollgateScene::create();
- scene->addChild(layer, 10);
- return scene;
- }
- bool TollgateScene::init()
- {
- if (!Layer::init())
- {
- return false;
- }
- return true;
- }
- void TollgateScene::onExit()
- {
- Layer::onExit();
- }
太复杂了。我要分几个部分来解说(小若:可是你一開始说非常easy的啊。)
集成物理世界的场景
在3.0里要创建一个物理世界,非常easy。之前我们创建场景。调用的是Scene::create()。假设要创建物理场景,那就:
auto scene = Scene::createWithPhysics();
于是这个场景就具备了物理世界的功能,不要再做什么其它处理了。
设置游戏的重力方向
接下来我们要为物理世界设定一个重力方向,这个方向随大家喜欢,我也是任意设置的,不同的方向对游戏的操作也有一定的影响。说不定还更有意思。
要对物理世界进行操作,就要通过场景来获取物理世界对象,然后再进行操作:
/* 微重力世界 */
Vect gravity(0, -0.5f);
scene->getPhysicsWorld()->setGravity(gravity);
/* 开启測试模式 */
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
Vect就是一个向量,代表x和y方向,事实上它就是一个Point对象。
后面好像乱入了一句代码?没错,那是开启调试模式的,这个功能非常爽。开启调试模式的话,全部物体对象的形状节点什么的都会被画出来,方便我们測试。
当然,有个參数,能够设置你想要绘制的那些部分。
用最简单的方式创建刚体
普通情况下,我们要创建刚体,还要先创建形状,然后各种设置。在3.0里,不须要,仅仅须要一句代码:
/*
创建一个空心盒子刚体。作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)
參数各自是刚体大小、材质(事实上就是一些预设的配置数据)、边线厚度
*/
auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
createEdgeBox函数是创建空心盒子刚体,还有很多其它函数大家看看PhysicsBody的头文件就知道了。
在createEdgeBox函数里,已经把形状创建好,并加入给刚体了。
让刚体加入到物理世界
/* 创建一个节点。用于承载刚体,这样刚体就能參与到游戏的物理世界 */
auto node = Node::create();
node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
node->setPhysicsBody(body);
scene->addChild(node);
别忘了,如今的物理世界就是我们的场景,场景就是世界,世界就是场景。依照这样的思想,刚体要加入到物理世界,那就要加入到场景里。而刚体怎么加入到场景里呢?直接addChild?
不~!场景是用来加入节点对象的,于是,我们把刚体放到节点里,然后把节点加入到场景里。懂了吧?(小若:哦~原来如此啊(全然没听懂))
事实上非常好理解,刚体仅仅是一些模拟数据而已,它是看不见的,而游戏里面的对象须要用各种图片、动画来表现。
因此,节点对象用于表现。刚体对象用于物理模拟,两者结合,就完美了。
刚体加入到节点之后,能够通过getPhysicsBody函数来获取。
执行效果
OK。准备看看执行效果吧,在此之前。先改改AppDelegate.cpp文件,在applicationDidFinishLaunching函数里做一些配置:
- #include "TollgateScene.h" /* 头文件一定不要忘了 */
- bool AppDelegate::applicationDidFinishLaunching() {
- // initialize director
- auto director = Director::getInstance();
- auto glview = director->getOpenGLView();
- if(!glview) {
- glview = GLView::create("Don't Save Me!");
- director->setOpenGLView(glview);
- }
- /* 设置Win32屏幕大小为480X800, */
- glview->setFrameSize(480, 800);
- /* 简单的屏幕适配,按比例拉伸。可能有黑边 */
- glview->setDesignResolutionSize(480, 800, ResolutionPolicy::SHOW_ALL);
- director->setDisplayStats(true);
- director->setAnimationInterval(1.0 / 60);
- /* 初始场景为关卡场景 */
- auto scene = TollgateScene::scene();
- director->runWithScene(scene);
- return true;
- }
屏幕大小设置为480X800(这个任意了,仅仅是windows执行时的大小而已)。
游戏设计大小设置为480X800,这个大小决定了游戏素材的规格。我仅仅使用一套资源来做适配。
然后。这是一个竖屏方向的游戏。
屏幕适配方式我使用最简单的SHOW_ALL模式。在某些手机上会有黑边。
然后初始执行场景为TollgateScene,好了,执行游戏。效果如图:
留意一下屏幕边缘的红色线条,这就是我们创建的空心盒子物体。开启了调试模式,所以会把它绘制出来。
有了这个空心盒子,在盒子里的物体就不会随便跑出屏幕外面了。
好了,下一篇。我们要加入游戏的背景。
Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界的更多相关文章
- Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物
如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...
- Cocos2d-x3.0游戏实例《不要救我》第一章——前言
我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...
- Cocos2d-x3.0游戏实例《不要救我》三——背景滚动周期
好.让我们来解释一下这个无限循环滚动的背景.这方面的知识一直讲到烂.我以前的文章还介绍了.所以不是那么特别清楚. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www. ...
- Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...
- Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角
好了,前面说了那么多废话,最终要进入正题了(等等,敢情前面你都是在耍我们么?) 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blo ...
- Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測
事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖); // 0001 ); // 0001 ); // 0001 这样我们才干监听到它们的碰 ...
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)
说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用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-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件
这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ...
随机推荐
- BNU10804:域名统计
域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置),目前域名已经成为 互联网的品牌.网 ...
- 【从零学习openCV】IOS7下的人脸检測
前言: 人脸检測与识别一直是计算机视觉领域一大热门研究方向,并且也从安全监控等工业级的应用扩展到了手机移动端的app,总之随着人脸识别技术获得突破,其应用前景和市场价值都是不可估量的,眼下在学习ope ...
- SPOJ 416 - Divisibility by 15(贪心)
糟烂的代码啊... 这个题目思路很简单——末位只可能为0和5,所有数字的和肯定被3整除 没有0和5的肯定不行 否则,把所有数字求和 如果被3整除,则从大到小输出 如果除3余1,则按以下顺序——删1: ...
- LIB文件和DLL文件的作用
(1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...
- Velocity 语法示例
一.简介: 1)它允许任何人使用简单而强大的模板语言来引用定义在 java 代码中的对象" 2)Velocity是一个基于java的模板引擎,简称VTL(Velocity Template ...
- 网页调用QQ聊天
把下面的复制到地址栏里,QQ号为你要聊天的人的qq号,如果你没有登录你自己的qq,首先会调出qq登录窗体. tencent://message/?uin=QQ号
- div有最小高度且自适应高度
DIV最小高度且自适应高度 在IE6中,如果子容器的高度超过父容器的时候,父容器会被子容器撑开,所以我们可以直接设置一个height的高度值即可.但是在IE7和firefox就不行了,它不会自动撑 ...
- ICP编程软件配置(烧写KEIL编译后的bin文件)
1. 安装NuMicro_ICP_Programming_Tool_1.29.6425软件 2. 打开软件后选择目标芯片后点击“连接”按钮 3. 添加程序 4. 点击设定按钮进行设定 5. 点击开始 ...
- Hibernate插入数据效率测试
硬件配置: 4G内存.CPUi3-2.3 数据库SQL2008 package com.pan.test; import org.hibernate.Session; import org.hiber ...
- smarty练习: 设置试题及打印试卷
数据库表格:shiti, shititimu, timu, kemu, xuanxiang 根据科目设置一个可以添加试题的页面:(如下图) 具体的题目从数据库中查出并形成一张试卷的形式 考试试题设置: ...