zoukankan      html  css  js  c++  java
  • Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

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

    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游戏实例之《别救我》第二篇-截图-执行效果

     

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

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

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

  • 相关阅读:
    javascript --学习this
    seaJS
    wamp之htaccess的配置
    replace之$1、$2等
    nw.js使用
    新电脑开发环境配置
    vue-vue常用指令
    Array的splice与slice
    vue-入门体验
    Object.defineProperty
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5246874.html
Copyright © 2011-2022 走看看