您好,登錄后才能下訂單哦!
這篇我要給大家介紹兩個(gè)知識(shí)點(diǎn):
1. 創(chuàng)建游戲物理世界
2. 沒了(小若:我噗)
害怕了?不用擔(dān)心,這太簡(jiǎn)單了~!
笨木頭花心貢獻(xiàn),啥?花心?不呢,是用心~
轉(zhuǎn)載請(qǐng)注明,原文地址:http://www.benmutou.com/blog/archives/804
文章來源:笨木頭與游戲開發(fā)
在Cocos2d-x3.0里使用物理引擎,會(huì)很有快感,因?yàn)楹芏喾爆嵉臇|西它都幫我們封裝好了。
那么,我要開始創(chuàng)建游戲的關(guān)卡場(chǎng)景了,大家跟緊了。
我們給關(guān)卡場(chǎng)景命名為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
頭文件沒有什么特別的,和普通的場(chǎng)景頭文件一樣。
然后,來看看cpp文件:
#include "TollgateScene.h"
#include "BackgroundLayer.h"
TollgateScene::~TollgateScene()
{
}
Scene*TollgateScene::scene()
{
autoscene=Scene::createWithPhysics();
/* 微重力世界 */
Vect gravity(0,-0.5f);
scene->getPhysicsWorld()->setGravity(gravity);
/* 開啟測(cè)試模式 */
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
//創(chuàng)建一個(gè)邊界
Size visibleSize=Director::getInstance()->getVisibleSize();
/*
創(chuàng)建一個(gè)空心盒子剛體,作為我們游戲世界的邊界(避免游戲內(nèi)的物體跑出屏幕)
參數(shù)分別是剛體大小、材質(zhì)(其實(shí)就是一些預(yù)設(shè)的配置數(shù)據(jù))、邊線厚度
*/
autobody=PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT,3);
/* 創(chuàng)建一個(gè)節(jié)點(diǎn),用于承載剛體,這樣剛體就能參與到游戲的物理世界 */
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();
}
太復(fù)雜了,我要分幾個(gè)部分來講解(小若:但是你一開始說很簡(jiǎn)單的?。。?/span>
在3.0里要?jiǎng)?chuàng)建一個(gè)物理世界,很簡(jiǎn)單,之前我們創(chuàng)建場(chǎng)景,調(diào)用的是Scene::create()。如果要?jiǎng)?chuàng)建物理場(chǎng)景,那就:
auto scene = Scene::createWithPhysics();
于是這個(gè)場(chǎng)景就具備了物理世界的功能,不要再做什么其他處理了。
接下來我們要為物理世界設(shè)定一個(gè)重力方向,這個(gè)方向隨大家喜歡,我也是隨意設(shè)置的,不同的方向?qū)τ螒虻牟僮饕灿幸欢ǖ挠绊?,說不定還更有意思。
要對(duì)物理世界進(jìn)行操作,就要通過場(chǎng)景來獲取物理世界對(duì)象,然后再進(jìn)行操作:
/* 微重力世界 */
Vect gravity(0, -0.5f);
scene->getPhysicsWorld()->setGravity(gravity);
/* 開啟測(cè)試模式 */
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
Vect就是一個(gè)向量,代表x和y方向,其實(shí)它就是一個(gè)Point對(duì)象。
后面好像亂入了一句代碼?沒錯(cuò),那是開啟調(diào)試模式的,這個(gè)功能很爽。開啟調(diào)試模式的話,所有物體對(duì)象的形狀節(jié)點(diǎn)什么的都會(huì)被畫出來,方便我們測(cè)試。當(dāng)然,有個(gè)參數(shù),可以設(shè)置你想要繪制的那些部分。
一般情況下,我們要?jiǎng)?chuàng)建剛體,還要先創(chuàng)建形狀,然后各種設(shè)置。在3.0里,不需要,只需要一句代碼:
/*
創(chuàng)建一個(gè)空心盒子剛體,作為我們游戲世界的邊界(避免游戲內(nèi)的物體跑出屏幕)
參數(shù)分別是剛體大小、材質(zhì)(其實(shí)就是一些預(yù)設(shè)的配置數(shù)據(jù))、邊線厚度
*/
auto body = PhysicsBody::createEdgeBox(Size(visibleSize.width, visibleSize.height), PHYSICSBODY_MATERIAL_DEFAULT, 3);
createEdgeBox函數(shù)是創(chuàng)建空心盒子剛體,還有更多函數(shù)大家看看PhysicsBody的頭文件就知道了。
在createEdgeBox函數(shù)里,已經(jīng)把形狀創(chuàng)建好,并添加給剛體了。
/* 創(chuàng)建一個(gè)節(jié)點(diǎn),用于承載剛體,這樣剛體就能參與到游戲的物理世界 */
auto node = Node::create();
node->setPosition(Point(visibleSize.width / 2, visibleSize.height / 2));
node->setPhysicsBody(body);
scene->addChild(node);
別忘了,現(xiàn)在的物理世界就是我們的場(chǎng)景,場(chǎng)景就是世界,世界就是場(chǎng)景。按照這種思想,剛體要加入到物理世界,那就要添加到場(chǎng)景里,而剛體怎么添加到場(chǎng)景里呢?直接addChild?
不~!場(chǎng)景是用來添加節(jié)點(diǎn)對(duì)象的,于是,我們把剛體放到節(jié)點(diǎn)里,然后把節(jié)點(diǎn)添加到場(chǎng)景里。懂了吧?(小若:哦~原來如此啊(完全沒聽懂))
其實(shí)很好理解,剛體只是一些模擬數(shù)據(jù)而已,它是看不見的,而游戲里面的對(duì)象需要用各種圖片、動(dòng)畫來表現(xiàn)。
因此,節(jié)點(diǎn)對(duì)象用于表現(xiàn),剛體對(duì)象用于物理模擬,兩者結(jié)合,就完美了。
剛體添加到節(jié)點(diǎn)之后,可以通過getPhysicsBody函數(shù)來獲取。
OK,準(zhǔn)備看看運(yùn)行效果吧,在此之前,先改改AppDelegate.cpp文件,在applicationDidFinishLaunching函數(shù)里做一些配置:
boolAppDelegate::applicationDidFinishLaunching(){
// initialize director
autodirector=Director::getInstance();
autoglview=director->getOpenGLView();
if(!glview){
glview=GLView::create("Don't Save Me!");
director->setOpenGLView(glview);
}
/* 設(shè)置Win32屏幕大小為480X800, */
glview->setFrameSize(480,800);
/* 簡(jiǎn)單的屏幕適配,按比例拉伸,可能有黑邊 */
glview->setDesignResolutionSize(480,800, ResolutionPolicy::SHOW_ALL);
director->setDisplayStats(true);
director->setAnimationInterval(1.0/60);
/* 初始場(chǎng)景為關(guān)卡場(chǎng)景 */
autoscene=TollgateScene::scene();
director->runWithScene(scene);
returntrue;
}
屏幕大小設(shè)置為480X800(這個(gè)隨意了,只是windows運(yùn)行時(shí)的大小而已)。
游戲設(shè)計(jì)大小設(shè)置為480X800,這個(gè)大小決定了游戲素材的規(guī)格,我只使用一套資源來做適配。然后,這是一個(gè)豎屏方向的游戲。
屏幕適配方式我使用最簡(jiǎn)單的SHOW_ALL模式,在某些手機(jī)上會(huì)有黑邊。
然后初始運(yùn)行場(chǎng)景為TollgateScene,好了,運(yùn)行游戲,效果如圖:
留意一下屏幕邊緣的紅色線條,這就是我們創(chuàng)建的空心盒子物體,開啟了調(diào)試模式,所以會(huì)把它繪制出來。
有了這個(gè)空心盒子,在盒子里的物體就不會(huì)隨便跑出屏幕外面了。
好了,下一篇,我們要加入游戲的背景。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。