生活随笔
收集整理的這篇文章主要介紹了
【cocos2d-x】游戏构成要素③----游戏关卡的实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
到目前為止,我們討論了多個(gè)場(chǎng)景和多個(gè)層的應(yīng)用。現(xiàn)在我們來討論關(guān)卡。
?
大家應(yīng)該對(duì)關(guān)卡的概念都很熟悉,所以我不在這里做解釋了。設(shè)計(jì)關(guān)卡的難點(diǎn)是決定用什么樣的方式來設(shè)計(jì)基于關(guān)卡的游戲。
在Cocos2d-x中個(gè)關(guān)卡都使用一個(gè)場(chǎng)景,或者在同一個(gè)場(chǎng)景里設(shè)置多個(gè)層作為關(guān)卡。選擇哪種方式取決于關(guān)卡在你游戲中的作用。
No.1?每一個(gè)關(guān)卡都使用一個(gè)場(chǎng)景
| ?? 最直接的方法是每一個(gè)關(guān)卡都使用一個(gè)單獨(dú)的場(chǎng)景。你可以為每一個(gè)關(guān)卡創(chuàng)建一個(gè)新的場(chǎng)景類(Scene class),或者通過把關(guān)卡號(hào)碼或其它與關(guān)卡相關(guān)的信息傳遞給一個(gè)通用的關(guān)卡場(chǎng)景類(LevelScene class)用于加載正確的關(guān)卡數(shù)據(jù)。 ? 這個(gè)方法很適合每個(gè)關(guān)卡之間沒有多大關(guān)系,關(guān)卡可以清晰地分開的情況。你可能需要保存玩家的得分和當(dāng)前剩余的生命數(shù),除此之外不需要再保存其它的信息了。這種情況下的用戶界面可能是靜態(tài)的,或者最多只有一個(gè)暫停按鈕。 |
No.2?同一個(gè)場(chǎng)景里設(shè)置多個(gè)層作為關(guān)卡
| ??如果你有一個(gè)復(fù)雜的用戶界面,并且在關(guān)卡轉(zhuǎn)換時(shí)不允許重置游戲場(chǎng)景的話,你就需要在同一個(gè)場(chǎng)景里用不同的層來加載和顯示不同的關(guān)卡。在轉(zhuǎn)換關(guān)卡時(shí),你可能會(huì)將游戲角色和其它的游戲物體保持在同一個(gè)位置。 ? 你可能使用幾個(gè)變量來保存當(dāng)前的游戲狀態(tài)信息和用戶界面設(shè)置信息,比如說倉(cāng)庫(kù)里的物品。如果你使用多個(gè)場(chǎng)景作為關(guān)卡的話,在轉(zhuǎn)換關(guān)卡的時(shí)候,你就需要做很多工作來保存和重置游戲設(shè)置,還有重置所有的視覺元素。 ? 這個(gè)方式很適合物品尋找類或者冒險(xiǎn)類游戲,因?yàn)橥婕倚枰诓煌姆块g之間移動(dòng)。特別是你想在替換關(guān)卡內(nèi)容的過程中使用動(dòng)畫的情況下。 |
?
CCLayerMultiplex?
CCLayerMultiplex類可被用于這種方式中。它可以同時(shí)包含多個(gè)節(jié)點(diǎn),但是任意時(shí)間里只有一個(gè)節(jié)點(diǎn)是有效的。但是唯一的缺點(diǎn)是你不能在層之間使用過渡效果。因?yàn)槿我鈺r(shí)間里只能有一個(gè)層是可視的,所以任何過渡效果都是不可能發(fā)生的。
CCLayerMultiplex?*multiplex=CCLayerMultiplex::layerWithLayers(layer1,layer2,NULL);??????????multiplex->switchTo(1);??????????multiplex->switchToAndReleaseMe(1);?
CCLayerColor
CCLayerColor類可用于改變背景顏色
CCLayerColor?*layercolor=CCLayerColor::layerWithColor(ccc4(225,0,225,255));?this->addChild(layercolor,0);?
? 如果你熟悉OpenGL的話,你可能會(huì)覺得沒有必要為了改變背景顏色而添加一個(gè)單獨(dú)的層。你可以使用以下OpenGL代碼得到相同的效果:
glClearColor(255,0,255,255);?
| ?但是如果你在場(chǎng)景中使用了過渡效果的話,你最好先在游戲里測(cè)試一下上述OpenGL代碼,因?yàn)間lClearColor對(duì)場(chǎng)景過渡效果會(huì)產(chǎn)生不好的影響。 |
?
一些很酷的CCNode類
?
以下我會(huì)介紹四個(gè)基于CCNode可以滿足特定要求的類。它們是:
CCProgressTimer,
CCParallaxNode,
CCMotionStreak。
CCProgressTimer進(jìn)度條
CCSize?size?=?CCDirector::sharedDirector()->getWinSize();?????????middle?=?CCProgressTimer::create(CCSprite::create("time.png"));?????????????middle->setType(kCCProgressTimerTypeRadial);?????????????????middle->setMidpoint(ccp(0,0));??????????????????middle->setPercentage(proportion);?????????middle->setPosition(ccp(size.width/2,size.height/2));?????????addChild(middle);??????????????????scheduleUpdate();? | ?進(jìn)度條有一個(gè)缺點(diǎn):它不會(huì)自己更新自己。你必須經(jīng)常更新進(jìn)度條的百分比數(shù)值來顯示進(jìn)度. |
Update方法代碼:
void?MyScene::update(ccTime?time)?{?????proportion++;?????middle->setPercentage(proportion);?????if?(proportion?>=?100)?????????proportion=?0;?}? ?CCParallaxNode 視差視圖
?“視差”(Parallaxing)是2D游戲中通過讓不同層上的圖片用不同的速度移動(dòng),來創(chuàng)造視覺深度的方法。前景的圖片移動(dòng)的比背景圖片要快。cocos2d-x有一個(gè)特殊的節(jié)點(diǎn)用于實(shí)現(xiàn)這個(gè)效果
?
bool?ParallaxScreen::init()?{?????bool?bRet?=?false;?????do?{??????????CCSize?size?=?CCDirector::sharedDirector()->getWinSize();?????????node?=?CCParallaxNode::create();?????????this->addChild(node);?????????CCSprite?*sprite1?=?CCSprite::create("parallax/parallax1.png");?????????CCSprite?*sprite2?=?CCSprite::create("parallax/parallax2.png");???????????????????CCPoint?speed1?=?CCPointMake(0.5,0.5);?????????CCPoint?speed2?=?CCPointMake(0.1,0.1);??????????node->addChild(sprite1,?1,?speed1,?CCPointMake(0,0));?????????node->addChild(sprite2,?2,?speed2,?CCPointMake(0,size.width/2));??????????this->scheduleUpdate();?????????bRet?=?true;?????}?while?(0);?????return?bRet;?}??void?ParallaxScreen::update(ccTime?time)?{??????CCSize?size?=?CCDirector::sharedDirector()->getWinSize();?????CCPoint?backgroundScrollVert?=?CCPointMake(1000,0);?????node->setPosition(?????????????ccpAdd(node->getPosition(),?ccpMult(backgroundScrollVert,?time)));?????if?(node->getPosition().x?>?size.width*4)?{?????????node->setPosition(CCPointMake(0,node->getPosition().y));?????}?}? ?CCMotionStreak(拖尾效果)
?
bool?Ribbon::init()?{?????bool?bRet?=?false;?????do?{?????????CCSize?size=CCDirector::sharedDirector()->getWinSize();?用于決定元素消失的速度,它的值越小,元素消失的越快????????????motion?=?CCMotionStreak::create(3,?3,?32,?ccc3(255,?255,?0),?"s1.png");?????????motion->setPosition(CCPointMake(size.width/2,size.height/2));?????????this->addChild(motion);?????????this->setTouchEnabled(true);?????????bRet?=?true;?????}?while?(0);?????return?bRet;?}??void?Ribbon::registerWithTouchDispatcher(){?CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);?}??void?Ribbon::ccTouchMoved(CCTouch?*pTouch,?CCEvent?*pEvent)?{?????CCLog("拖動(dòng)");?????CCPoint?point?=?pTouch->getLocation();???????point=CCDirector::sharedDirector()->convertToUI(point);?????motion->setPosition(point);?}??????
接下來一章將深入的講解CCsprite(精靈),如有問題,請(qǐng)?zhí)岢?/span>
本教程根據(jù)Cocos2d教程翻譯過來
使用的cocos2d-x版本為2.02
?
轉(zhuǎn)載于:https://blog.51cto.com/gejw0623/990492
總結(jié)
以上是生活随笔為你收集整理的【cocos2d-x】游戏构成要素③----游戏关卡的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。