日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

【cocos2d-x】游戏构成要素③----游戏关卡的实现

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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);?
  • ????????//切換到第二個(gè)Layer?
  • multiplex->switchTo(1);?
  • ????????//切換到第二個(gè)Layer并且釋放當(dāng)前Layer?以后就不能切換到當(dāng)前Layer?
  • 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"));?
  • ?
  • //??????setType??設(shè)置類型?
  • //??????kCCProgressTimerTypeRadial為弧形?
  • //??????kCCProgressTimerTypeBar為條形?
  • ????????middle->setType(kCCProgressTimerTypeRadial);?
  • ?
  • //??????setMidpoint?實(shí)現(xiàn)向左,向右,向上,向下或中間像兩頭移動(dòng)的,?
  • //??????你只要改變ccp(x,y)中x,y的值來實(shí)現(xiàn)?
  • //??????ccp(0,0)這表示從左到右的曾加,?
  • //??????ccp(1,0)表示從右到左的增加?
  • //??????ccp(0,1)表示從下到上的增加?
  • //??????ccp(0.5f,0)表示從中間向左向右兩頭增加,?
  • //??????還有很多,看你怎么設(shè)置了?
  • ????????middle->setMidpoint(ccp(0,0));?
  • ????????//設(shè)置進(jìn)度??0-100?
  • ????????middle->setPercentage(proportion);?
  • ????????middle->setPosition(ccp(size.width/2,size.height/2));?
  • ????????addChild(middle);?
  • ????????//進(jìn)度條需要預(yù)約的更新方法來更新自身的狀態(tài)?
  • ????????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");?
  • ?
  • ????????//設(shè)置速度?
  • ????????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();?
  • //??????第一個(gè)參數(shù)用于決定元素消失的速度,它的值越小,元素消失的越快
  • //??????第二個(gè)參數(shù)是間隱片斷的大小?
  • //??????第三個(gè)參數(shù)是貼圖的寬?
  • //??????第四個(gè)參數(shù)是顏色值argb?
  • //??????第五個(gè)參數(shù)是貼圖的路徑?
  • ????????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();?
  • //??convertToGL:?轉(zhuǎn)換成opengl坐標(biāo)啊,(0,0)在左下方?
  • //??convertToUI:轉(zhuǎn)換成quartz坐標(biāo),(0,0)在左上方的.?
  • ????point=CCDirector::sharedDirector()->convertToUI(point);?
  • ????motion->setPosition(point);?
  • }?
  • ?
  • //bool?Ribbon::ccTouchBegan(CCTouch?*pTouch,?CCEvent?*pEvent){?
  • //??CCLog("觸摸到屏幕");?
  • //??return?true;?
  • //}?

  • 接下來一章將深入的講解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ò),歡迎將生活随笔推薦給好友。