这篇我要给大家介绍两个知识点:

1. 创建游戏物理世界

2. 没了(小若:我噗)

害怕了?不用操心。这太简单了~!

笨木头花心贡献。啥?花心?不呢。是用心~

转载请注明,原文地址:http://www.benmutou.com/blog/archives/804

文章来源:笨木头与游戏开发

3.0新亮点。史上最简单的物理引擎

在Cocos2d-x3.0里使用物理引擎,会非常有快感,由于非常多繁琐的东西它都帮我们封装好了。

那么,我要開始创建游戏的关卡场景了,大家跟紧了。

我们给关卡场景命名为TollgateScene,头文件例如以下:

  1. #ifndef TollgateScene_H
  2. #define TollgateScene_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. class TollgateScene : public Layer
  6. {
  7. public:
  8. ~TollgateScene();
  9. static Scene* scene();
  10. CREATE_FUNC(TollgateScene);
  11. virtual bool init();
  12. virtual void onExit() override;
  13. };
  14. #endif
 

头文件没有什么特别的,和普通的场景头文件一样。

然后,来看看cpp文件:

  1. #include "TollgateScene.h"
  1. TollgateScene::~TollgateScene()
  2. {
  3. }
  4. Scene* TollgateScene::scene()
  5. {
  6. auto scene = Scene::createWithPhysics();
  7. /* 微重力世界 */
  8. Vect gravity(0, -0.5f);
  9. scene->getPhysicsWorld()->setGravity(gravity);
  10. /* 开启測试模式 */
  11. scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
  12. //创建一个边界
  13. Size visibleSize = Director::getInstance()->getVisibleSize();
  14. /*
  15. 创建一个空心盒子刚体,作为我们游戏世界的边界(避免游戏内的物体跑出屏幕)
  16. 參数各自是刚体大小、材质(事实上就是一些预设的配置数据)、边线厚度
  17. */
  18. auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
  19. /* 创建一个节点。用于承载刚体,这样刚体就能參与到游戏的物理世界 */
  20. auto node = Node::create();
  21. node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
  22. node->setPhysicsBody(body);
  23. scene->addChild(node);
  24. auto layer = TollgateScene::create();
  25. scene->addChild(layer, 10);
  26. return scene;
  27. }
  28. bool TollgateScene::init()
  29. {
  30. if (!Layer::init())
  31. {
  32. return false;
  33. }
  34. return true;
  35. }
  36. void TollgateScene::onExit()
  37. {
  38. Layer::onExit();
  39. }
太复杂了。我要分几个部分来解说(小若:可是你一開始说非常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函数里做一些配置:

  1. #include "TollgateScene.h" /* 头文件一定不要忘了 */
  2. bool AppDelegate::applicationDidFinishLaunching() {
  3. // initialize director
  4. auto director = Director::getInstance();
  5. auto glview = director->getOpenGLView();
  6. if(!glview) {
  7. glview = GLView::create("Don't Save Me!");
  8. director->setOpenGLView(glview);
  9. }
  10. /* 设置Win32屏幕大小为480X800, */
  11. glview->setFrameSize(480, 800);
  12. /* 简单的屏幕适配,按比例拉伸。可能有黑边 */
  13. glview->setDesignResolutionSize(480, 800, ResolutionPolicy::SHOW_ALL);
  14. director->setDisplayStats(true);
  15. director->setAnimationInterval(1.0 / 60);
  16. /* 初始场景为关卡场景 */
  17. auto scene = TollgateScene::scene();
  18. director->runWithScene(scene);
  19. return true;
  20. }

屏幕大小设置为480X800(这个任意了,仅仅是windows执行时的大小而已)。

游戏设计大小设置为480X800,这个大小决定了游戏素材的规格。我仅仅使用一套资源来做适配。

然后。这是一个竖屏方向的游戏。

屏幕适配方式我使用最简单的SHOW_ALL模式。在某些手机上会有黑边。

然后初始执行场景为TollgateScene,好了,执行游戏。效果如图:

 

留意一下屏幕边缘的红色线条,这就是我们创建的空心盒子物体。开启了调试模式,所以会把它绘制出来。

有了这个空心盒子,在盒子里的物体就不会随便跑出屏幕外面了。

好了,下一篇。我们要加入游戏的背景。

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界的更多相关文章

  1. Cocos2d-x3.0游戏实例《不要救我》第十篇(结束)——使用Json配置数据类型的怪物

    如今我们有2种类型的怪物,并且创建的时候是写死在代码里的,这是要作死的节奏~ 所以.必须可配置.不然会累死人的. ; i < size; ++i) { int id = root[i][&quo ...

  2. Cocos2d-x3.0游戏实例《不要救我》第一章——前言

    我们可以学习? 这是一个非常easy游戏.但更多的东西用(对于初学者).至少,对于它的一个例子,有点多. 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www.benm ...

  3. Cocos2d-x3.0游戏实例《不要救我》三——背景滚动周期

    好.让我们来解释一下这个无限循环滚动的背景.这方面的知识一直讲到烂.我以前的文章还介绍了.所以不是那么特别清楚. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www. ...

  4. Cocos2d-x3.0游戏实例之《别救我》第八篇——TiledMap实现关卡编辑器

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/musicvs/article/details/25368273 好吧.我真心全然搞不懂.我如今仅仅只 ...

  5. Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角

    好了,前面说了那么多废话,最终要进入正题了(等等,敢情前面你都是在耍我们么?) 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blo ...

  6. Cocos2d-x3.0游戏实例之《别救我》第七篇——物理世界的碰撞检測

    事实上我也非常吃惊-居然写到第七篇了,我估计也就是四篇的内容,感觉非常奇妙,我也不会非常唠叨什么吖);    // 0001 );   // 0001 ); // 0001 这样我们才干监听到它们的碰 ...

  7. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第七步--物理碰撞检測(1)

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

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

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  9. Cocos2d-x3.0游戏实例之《别救我》第六篇——从代码中获取UI控件

    这篇的内容非常easy,获取UI控件,然后使用它. 还记得我们在UI编辑器中给三个button分别命名了吧? 如今要用上了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http ...

随机推荐

  1. Nicholas C. Zakas(JS圣经:JavaScript高级程序设计作者)如何面试前端工程师

    Original Post:Interviewing the front-end engineerNicholas C. Zakas,2010年1月5日翻译完成:2010年1月7日,最后更新:2010 ...

  2. [React] React Router: activeStyle & activeClassName

    react-router provides two props for setting a specific style on a Link component whose path matches ...

  3. (三)《Java编程思想》——构造函数初始化

    1.初始化顺序是由变量在类内的定义顺序决定的,并且先初始化变量,然后才调用构造函数. package chapter4; //: OrderOfInitialization.java /** * 初始 ...

  4. 纯css实现幻灯片效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...

  5. JS客户端读取Excel文件插件js-xls使用方法

    js-xls是一款客户端读取Excel的插件,亲测IE11.FireFox.Chrome可用,读取速度也客观. 插件Demo地址:http://oss.sheetjs.com/js-xlsx/    ...

  6. xp sp3安装 iis5.1

    1.依次打开左下角的 "开始" 菜单----控制面板----选择 "添加/删除程序", 点击窗体左侧 "添加/删除Windows组件"(A) ...

  7. eclipse python开发环境搭建

    eclipse python开发环境搭建[非原创] 1.在www.eclipse.org官网下载Eclipse Classic 4.2.2,Win7 64位下载eclipse-SDK-4.2.2-wi ...

  8. 【转】C++:MessageBox的常见用法

    一    函数原型及参数 function MessageBox(hWnd: HWND; Text, Caption: PChar; Type: Word): Integer; hWnd:对话框父窗口 ...

  9. include,include_once,require,require_once的区别

    1.include,require在其被调用的位置处包含一个文件. 2.include_once,require_once函数的作用与include相同,不过它会首先验证是否已包含该文件.如果已经包含 ...

  10. 面试题:获取大量数据中某一条的index

    提问: 群里分享了一个面试题:页面里有很多条数据,怎么知道这条数据的index,并且不使用循环? 分析: 如果在数组里,直接用indexOf,但对于对象会比较麻烦. 在页面上,不使用循环的话,可以用定 ...