這篇我要給大家介紹兩個知識點:
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;
classTollgateScene:publicLayer
{
public:
~TollgateScene();
staticScene*scene();
CREATE_FUNC(TollgateScene);
virtualboolinit();
virtualvoidonExit()override;
};
#endif
頭文件沒有什麼特別的,和普通的場景頭文件一樣。
然後,來看看cpp文件:
#include "TollgateScene.h"
#include "BackgroundLayer.h"
TollgateScene::~TollgateScene()
{
}
Scene*TollgateScene::scene()
{
autoscene=Scene::createWithPhysics();
/* 微重力世界 */
Vect gravity(0,-0.5f);
scene->getPhysicsWorld()->setGravity(gravity);
/* 開啓測試模式 */
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//創建一個邊界
Size visibleSize=Director::getInstance()->getVisibleSize();
/*
創建一個空心盒子剛體,作爲我們遊戲世界的邊界(避免遊戲內的物體跑出屏幕)
參數分別是剛體大小、材質(其實就是一些預設的配置數據)、邊線厚度
*/
autobody=PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT,3);
/* 創建一個節點,用於承載剛體,這樣剛體就能參與到遊戲的物理世界 */
autonode=Node::create();
node->setPosition(Point(visibleSize.width/2, visibleSize.height/2));
node->setPhysicsBody(body);
scene->addChild(node);
autolayer=TollgateScene::create();
scene->addChild(layer,10);
returnscene;
}
boolTollgateScene::init()
{
if(!Layer::init())
{
returnfalse;
}
returntrue;
}
voidTollgateScene::onExit()
{
Layer::onExit();
}
太複雜了,我要分幾個部分來講解(小若:但是你一開始說很簡單的啊!)
集成物理世界的場景
在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函數裏做一些配置:
boolAppDelegate::applicationDidFinishLaunching(){
// initialize director
autodirector=Director::getInstance();
autoglview=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);
/* 初始場景爲關卡場景 */
autoscene=TollgateScene::scene();
director->runWithScene(scene);
returntrue;
}
屏幕大小設置爲480X800(這個隨意了,只是windows運行時的大小而已)。
遊戲設計大小設置爲480X800,這個大小決定了遊戲素材的規格,我只使用一套資源來做適配。然後,這是一個豎屏方向的遊戲。
屏幕適配方式我使用最簡單的SHOW_ALL模式,在某些手機上會有黑邊。
然後初始運行場景爲TollgateScene,好了,運行遊戲,效果如圖:
留意一下屏幕邊緣的紅色線條,這就是我們創建的空心盒子物體,開啓了調試模式,所以會把它繪製出來。
有了這個空心盒子,在盒子裏的物體就不會隨便跑出屏幕外面了。
好了,下一篇,我們要加入遊戲的背景。