1. 程式人生 > >Cocos2d-x3.0遊戲例項之《別救我》第二篇——建立物理世界

Cocos2d-x3.0遊戲例項之《別救我》第二篇——建立物理世界

這篇我要給大家介紹兩個知識點:

1. 建立遊戲物理世界

2. 沒了(小若:我噗)

害怕了?不用擔心,這太簡單了~!

3.0新亮點,史上最簡單的物理引擎

在Cocos2d-x3.0裡使用物理引擎,會很有快感,因為很多繁瑣的東西它都幫我們封裝好了。

那麼,我要開始建立遊戲的關卡場景了,大家跟緊了。

我們給關卡場景命名為TollgateScene,標頭檔案如下:

  1. #ifndef TollgateScene_H
  2. #define TollgateScene_H
  3. #include "cocos2d.h"
  4. USING_NS_CC;
  5. classTollgateScene:publicLayer
  6. {
  7. public:
  8.     ~TollgateScene
    (
    );
  9.    staticScene*scene();
  10.     CREATE_FUNC(TollgateScene);
  11.    virtualboolinit();
  12.    virtualvoidonExit()override;
  13. };
  14. #endif

標頭檔案沒有什麼特別的,和普通的場景標頭檔案一樣。

然後,來看看cpp檔案:

  1. #include "TollgateScene.h"
  1. TollgateScene::~TollgateScene()
  2. {
  3. }
  4. Scene*TollgateScene::scene()
  5. {
  6.    autoscene=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.    autobody=PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT,3);
  19.    /* 建立一個節點,用於承載剛體,這樣剛體就能參與到遊戲的物理世界 */
  20.    autonode=Node::create();
  21.     node->setPosition(Point(visibleSize.width/2, visibleSize.height/2));
  22.     node->setPhysicsBody(body);
  23.     scene->addChild(node);
  24.    autolayer=TollgateScene::create();
  25.     scene->addChild(layer,10);
  26.    returnscene;
  27. }
  28. boolTollgateScene::init()
  29. {
  30.    if(!Layer::init())
  31.    {
  32.        returnfalse;
  33.    }
  34.    returntrue;
  35. }
  36. voidTollgateScene::onExit()
  37. {
  38.     Layer::onExit();
  39. }
太複雜了,我要分幾個部分來講解(小若:但是你一開始說很簡單的啊!)

整合物理世界的場景

在3.0裡要建立一個物理世界,很簡單,之前我們建立場景,呼叫的是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. boolAppDelegate::applicationDidFinishLaunching(){
  3.    // initialize director
  4.    autodirector=Director::getInstance();
  5.    autoglview=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.    autoscene=TollgateScene::scene();
  18.     director->runWithScene(scene);
  19.    returntrue;
  20. }

螢幕大小設定為480X800(這個隨意了,只是windows執行時的大小而已)。

遊戲設計大小設定為480X800,這個大小決定了遊戲素材的規格,我只使用一套資源來做適配。然後,這是一個豎屏方向的遊戲。

螢幕適配方式我使用最簡單的SHOW_ALL模式,在某些手機上會有黑邊。

然後初始執行場景為TollgateScene,好了,運行遊戲,效果如圖:

Cocos2d-x3.0遊戲例項之《別救我》第二篇-截圖-執行效果

留意一下螢幕邊緣的紅色線條,這就是我們建立的空心盒子物體,開啟了除錯模式,所以會把它繪製出來。

有了這個空心盒子,在盒子裡的物體就不會隨便跑出螢幕外面了。

好了,下一篇,我們要加入遊戲的背景。