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

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. mysql 建立加密连接

    加密连接可提高数据的安全性,但会降低性能.要进行加密连接,必须满足以下要求: user权限表里要有相关的SSL数据列.如果安装的MySQL服务器是4.0.0版的,user权限表已包含相关的SSL数据列 ...

  2. c++ 连接两个字符串实现代码 实现类似strcat功能(转)

    想实现strcat功能,直接网上找一个. 第一种: #include "stdafx.h" #include<iostream> using namespace std ...

  3. Java初转型-Tomcat安装和配置

    1.http://www.cnblogs.com/diegodu/p/5915358.html tomcat直接解压,启动然后测试是否正常. 2.http://www.cnblogs.com/mq00 ...

  4. OD: Format String, SQL Injection, XSS

    Format String 格式化串漏洞 考虑如下的代码: #include<stdio.h> int main() { int a=44,b=77; printf("a=%d, ...

  5. C3P0连接池配置方式

    c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...

  6. Sql时间函数

    一.sql server日期时间函数 Sql Server中的日期与时间函数  1.  当前系统日期.时间   select getdate()    2. dateadd  在向指定日期加上一段时间 ...

  7. eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法

    通常安装,搭建安卓环境后,不显示Android SDK Manager和Android Virtual Device Manager ize解决方法:Eclipse ->window->c ...

  8. 从零开始制作Minecraft启动器(C++开源)

    从零开始制作Minecraft启动器(C++开源) 新手飙车了~~~,MC启动器源码大放送,随心所欲打造自己的专属MC启动器,这不是易语言,是C++...分析原理,关键源码都有详细的注释,代码编好就打 ...

  9. css 单位 px em rem

    http://www.cnblogs.com/leejersey/p/3662612.html

  10. PHP学习系列(1)——字符串处理函数(1)

    从09年开始使用JAVA到现在差不多5年多了,然后由于即将要去的公司(研究僧终于要毕业了!)是使用PHP,Python作为后台开发语言的,所以要开始一段双P的学习旅程.用过PHP的都说这是很简单的一门 ...