跟着BOY學習開發cocos2d-x 遊戲 實戰篇(8)之 升級系統的基本設計--終結篇

            本來上週日就改寫完的東西拖到了今天,不過還好總算弄完了,這個遊戲到此就完結了。哈哈雖然這個遊戲完結了但是不代表我的博客更新就此,結束。我以後還會不斷更新以項目的方式給大家講解cocos2d-x 的用法。對於這個遊戲我來總結一下。這些天羣裏問我的朋友不少,我發現一個問題。或者說 咱們的思路可能不一樣。很多人問我是怎麼想的哪些功能是怎麼實現的。其實BOY也是人也不是神。很多東西我一開始也沒想到,不過大的框架的地方一定要想到。例如拿武器系統來說 我剛開始想的時候 想這個武器系統能生產子彈和發射子彈 就可以了 後來發現不夠 還得加子彈回收系統。再後來發現還需要檢測碰撞。這些都是在做的過程中一點一點細化出來的。做的時候有最開始最簡單的做起這樣可以增強自己的信心,千萬不要一開始想的太複雜。不過如果你是一個團隊,剛開始儘量把一個功能想清楚。如果是個人的 可以按照我的想法來。總之我做遊戲的方法是從大到小從簡單到困難。還有一個最重要的我要在這裏說一下就是學習能力。很多羣裏的朋友遇到問題就問。很多時候都是很簡單的問題,你可以通過度娘谷歌 這個兩個NB的師傅來幫助你。其實這也是一個學習過程在你找的過程中可以加深記憶。如果你一上來就問,別人幫你解決了你可能就當是能記住。還有一個就是對於某些方法不知道什麼意識的一定要看註釋。或者源碼。cocos2d-x 的註釋加的還是比較好。英文看不懂的 google 翻譯一下就OK 。說了這麼多就是想給大家說如果提高自己的學習能力。還有一個最重的 就是千萬不要眼高手低 一定要多加練習。俗話說的好 好記心不如爛筆頭。

           哈哈發現我能吐槽這麼多。我把今天的代碼 大略的講解一下吧。

           首先先上游戲截圖

          

哈哈看起來比較簡單吧。不過確實很簡單,但是不代表好寫。這裏主要要掌握好個個升級以後的比例值。在這裏大家不要吐糟BOY 的數值問題。我也是隨便弄得。真正的遊戲 數值這一塊肯定是會好好的策劃一下的,不過這些東西大家可以根據自己的喜好來修改這些值。

         貼上這個界面的主要代碼

     

#include "UpgradeSystemLayer.h"
#include "DefenderGameLayer.h"
USING_NS_CC;
CCScene* UpgradeSystemLayer::scene(){
	CCScene* scene=CCScene::create();
	UpgradeSystemLayer* layer=UpgradeSystemLayer::create();
	scene->addChild(layer);
	return scene;
}
bool UpgradeSystemLayer::init(){
	bool isRet=false;
	do 
	{
		CC_BREAK_IF(!BaseLayer::init());
		CC_BREAK_IF(!this->setUpdateView());
		isRet=true;
	} while (0);
	return isRet;
}
bool UpgradeSystemLayer::setUpdateView(){
	bool isRet=false;
	do {
		char temp[12];
		// 初始化背景
		CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("game/lvSyspng.plist",CCTextureCache::sharedTextureCache()->textureForKey("game/lvSyspng.png"));
		CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("game/lvinfo.plist",CCTextureCache::sharedTextureCache()->textureForKey("game/lvinfo.png"));

		CCSprite* pbg=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("gmbg/research_bg.png"));
		CC_BREAK_IF(!pbg);
		pbg->setPosition(getWinCenter());
		this->addChild(pbg);

		int gold =CCUserDefault::sharedUserDefault()->getIntegerForKey("goldNum",0);
		// 金幣數目
		sprintf(temp,"%d",gold);
		CCLabelAtlas* goldnumbrer= CCLabelAtlas::create(temp,"game/numtips.png",25,31,'0');
		CC_BREAK_IF(!goldnumbrer);
		goldnumbrer->setAnchorPoint(ccp(0,0));
		goldnumbrer->setPosition(ccp(425,440));
		goldnumbrer->setScale(0.5);
		this->addChild(goldnumbrer,1,5);


		int lve=CCUserDefault::sharedUserDefault()->getIntegerForKey("lve",1);
		sprintf(temp,"%d",lve);
		// 當前關卡
		CCLabelAtlas* stagenumbrer= CCLabelAtlas::create(temp,"game/numtips.png",25,31,'0');
		CC_BREAK_IF(!stagenumbrer);
		stagenumbrer->setScale(0.5);
		stagenumbrer->setAnchorPoint(ccp(0,0));
		stagenumbrer->setPosition(ccp(715,440));
		this->addChild(stagenumbrer,1,6);

		// 選中某個按鈕是顯示邊框
		CCSprite* pselect= CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("logselect.png"));
		CC_BREAK_IF(!pselect);
		pselect->setVisible(false);
		this->addChild(pselect,2,1);

		// 創建 防禦者升級按鈕
		CCMenuItemSprite* denfer=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("defender.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("defender.png")),this,menu_selector(UpgradeSystemLayer::publicClickCallBack));
		CC_BREAK_IF(!denfer);
		denfer->setPosition(getWinCenter());
		denfer->setPositionY(denfer->getPositionY()+90);
		denfer->setTag(2);


		//  創建城牆升級按鈕
		CCMenuItemSprite* citywall=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("citywall.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("citywall.png")),this,menu_selector(UpgradeSystemLayer::publicClickCallBack));
		CC_BREAK_IF(!citywall);
		citywall->setPosition(getWinCenter());	
		citywall->setTag(3);


		// 創建 魔法升級按鈕
		CCMenuItemSprite* magictower=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("magictower.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("magictower.png")),this,menu_selector( UpgradeSystemLayer::publicClickCallBack));
		CC_BREAK_IF(!magictower);

		magictower->setPosition(getWinCenter());

		magictower->setPositionY(magictower->getPositionY()-90);
		magictower->setTag(4);


		// 創建繼續按鈕
		CCMenuItemSprite* contin=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("button_nextup.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnnextdown.png")),this,menu_selector( UpgradeSystemLayer::coniteClickCallBack));
		CC_BREAK_IF(!contin);
		contin->setAnchorPoint(ccp(1,0));
		contin->setPosition(converSpritRel(getWinSize().width,10));


		// 創建升級按鈕
		CCMenuItemSprite* updage=CCMenuItemSprite::create( CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnupgradeUp.png")), CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("btnUpgradedown.png")),this,menu_selector(UpgradeSystemLayer::updateClickCallBack));
		CC_BREAK_IF(!updage);

		updage->setAnchorPoint(ccp(1,0));
		updage->setPosition(converSpritRel(getWinSize().width-180,10));
		updage->setTag(5);

		CCMenu* menu=CCMenu::create(denfer,citywall,magictower,contin,updage,NULL);
		CC_BREAK_IF(!menu);
		menu->setPosition(CCPointZero);
		this->addChild(menu,1,12);

		CCSprite* deinfo=CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("definfo.png"));
		deinfo->setAnchorPoint(ccp(0,0.5));
		deinfo->setPosition(ccp(10,48));
		this->addChild(deinfo,1,7);
		deinfo->setVisible(false);

		// 創建顯示金幣的小圖標

		CCSprite* coin=CCSprite::createWithTexture(CCTextureCache::sharedTextureCache()->textureForKey("game/coin.png"));
		coin->setAnchorPoint(ccp(0,0));
		coin->setPosition(converSpritRel(getWinSize().width-315,50));
		this->addChild(coin,1,11);
		coin->setVisible(false);

		// 顯示金幣消耗數目
		CCLabelAtlas* updagexiao= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
		CC_BREAK_IF(!updagexiao);
		updagexiao->setAnchorPoint(ccp(0,0));
		updagexiao->setPosition(converSpritRel(getWinSize().width-280,57));
		updagexiao->setScale(0.7f);
		this->addChild(updagexiao,1,10);
		updagexiao->setVisible(false);


		// 當前等級說明
		CCLabelAtlas* curint= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
		CC_BREAK_IF(!curint);
		curint->setAnchorPoint(ccp(0,0));
		curint->setPosition(ccp(160,30));
		curint->setScale(0.5f);
		this->addChild(curint,1,8);
		curint->setVisible(false);

		// 下一等級說明
		CCLabelAtlas* nextp= CCLabelAtlas::create("0","game/numtips.png",25,31,'0');
		CC_BREAK_IF(!nextp);
		nextp->setAnchorPoint(ccp(0,0));
		nextp->setPosition(ccp(180,10));
		nextp->setScale(0.5f);
		this->addChild(nextp,1,9);
		nextp->setVisible(false);
		isRet=true;
	} while (0);
	return isRet;
}

// 通用觸摸回調事件
void UpgradeSystemLayer::publicClickCallBack(cocos2d::CCObject* pSend){	
	CCMenuItemSprite* item=(CCMenuItemSprite*) pSend;
	CCSprite* pselect=(CCSprite*)this->getChildByTag(1);
	pselect->setPosition(item->getPosition());
	pselect->setVisible(true);
	int tag=item->getTag();
	this->initDefner(tag);
} 
// 升級按鈕回調事件
void UpgradeSystemLayer::updateClickCallBack(cocos2d::CCObject* pSend){
	int gold =CCUserDefault::sharedUserDefault()->getIntegerForKey("goldNum",0);
	if(selectId==2){	
		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗1000
		int denfehurtlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurtlv",0); // 默認0
		if((denfehurtlv+1)*1000<=gold){
			int defr= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurt",10); // 默認攻擊力是10
			CCUserDefault::sharedUserDefault()->setIntegerForKey("denfehurt",(defr+5));// 提升攻擊力
			CCUserDefault::sharedUserDefault()->setIntegerForKey("denfehurtlv",(denfehurtlv+1));// 提升等級
			gold=gold-(denfehurtlv+1)*1000;
			CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金幣
			this->initDefner(selectId);
		}	
	}else if(selectId==3){
		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗500
		int citybloodlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citybloodlv",0); // 默認0
		if((citybloodlv+1)*500<=gold){
			int cityblood= CCUserDefault::sharedUserDefault()->getIntegerForKey("cityblood",100); // 默認攻擊力是20
			CCUserDefault::sharedUserDefault()->setIntegerForKey("cityblood",(cityblood+10));// 提升攻擊力
			CCUserDefault::sharedUserDefault()->setIntegerForKey("citybloodlv",(citybloodlv+1));// 提升等級
			gold=gold-(citybloodlv+1)*1000;
			CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金幣
			this->initDefner(selectId);
		}	
	}else if(selectId==4){

		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗1500
		int citymglv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymglv",0); // 默認0
		if((citymglv+1)*500<=gold){
			int citymg= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymg",100); // 默認攻擊力是20
			CCUserDefault::sharedUserDefault()->setIntegerForKey("citymg",(citymg+10));// 提升攻擊力
			CCUserDefault::sharedUserDefault()->setIntegerForKey("citymglv",(citymglv+1));// 提升等級
			gold=gold-(citymglv+1)*1000;
			CCUserDefault::sharedUserDefault()->setIntegerForKey("goldNum",gold);// 扣除金幣
			this->initDefner(selectId);
		}	

	}

	// 重新初始化上面顯示的總金幣數

	 CCLabelAtlas* goldnumbrer=(CCLabelAtlas*)this->getChildByTag(5);
	 char te[12];
	 sprintf(te,"%d",gold);
	 goldnumbrer->setString(te);

}
// 繼續遊戲按鈕回調事件
void UpgradeSystemLayer::coniteClickCallBack(cocos2d::CCObject* pSend){
	CCScene* se=DefenderGameLayer::scene();
	CCDirector::sharedDirector()->replaceScene(CCTransitionSlideInR::create(1,se));
}
// 初始化顯示標籤的內容
void UpgradeSystemLayer::initDefner(int selectId){
	char temp[12];
	CCSprite* deinfo=(CCSprite*)this->getChildByTag(7);
	deinfo->setVisible(true);
	CCLabelAtlas* curint=(CCLabelAtlas*)this->getChildByTag(8);
	curint->setVisible(true);
	CCLabelAtlas* nextp= (CCLabelAtlas*)this->getChildByTag(9);
	nextp->setVisible(true);
	CCLabelAtlas* updagexiao=(CCLabelAtlas*)this->getChildByTag(10);
	updagexiao->setVisible(true);
	CCSprite* coin=(CCSprite*)this->getChildByTag(11);
	coin->setVisible(true);
	int tag=selectId;

	if(tag==2){// 點擊的防禦者	
		deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("definfo.png"));
		int defr= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurt",10); // 默認攻擊力是20
		sprintf(temp,"%d",defr);
		curint->setString(temp);
		// 假設沒升級一次 增加5點攻擊力
		sprintf(temp,"%d",(defr+5));
		nextp->setString(temp);
		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗1000
		int denfehurtlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("denfehurtlv",0); // 默認攻0
		sprintf(temp,"%d",(denfehurtlv+1)*1000);
		updagexiao->setString(temp);
		this->selectId=2;
	}else if(tag==3){ // 主城
		deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("cityinfo.png"));	
		int cityblood= CCUserDefault::sharedUserDefault()->getIntegerForKey("cityblood",100); // 默認是100
		sprintf(temp,"%d",cityblood);
		curint->setString(temp);
		// 假設沒升級一次 增加10點氣血
		sprintf(temp,"%d",(cityblood+10));
		nextp->setString(temp);
		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗500
		int citybloodlv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citybloodlv",0); // 0
		sprintf(temp,"%d",(citybloodlv+1)*500);
		updagexiao->setString(temp);

		this->selectId=3;
	}else if(tag==4){
		deinfo->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("maginfo.png"));	
		int citymg= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymg",100); // 默認魔法是100 點
		sprintf(temp,"%d",citymg);
		curint->setString(temp);
		// 假設沒升級一次 增加10點魔法
		sprintf(temp,"%d",(citymg+10));
		nextp->setString(temp);
		//設沒每升一級 所消耗的金幣是上次的雙倍 第一次默認是消耗1500
		int citymglv= CCUserDefault::sharedUserDefault()->getIntegerForKey("citymglv",0); // 默認0
		sprintf(temp,"%d",(citymglv+1)*1500);
		updagexiao->setString(temp);
		this->selectId=4;
	}
}
哈哈沒想到一個小小的界面這麼多代碼吧。這個界面確實麻煩一點。可能還存在漏洞。不過整體設計就是這樣的我的代碼註釋加的還可以吧。有時候複製粘貼的可能代碼註釋不是很對但是大多時候 大家還能能看明白的 這要注意別的類裏面修改下從
CCUserDefault 這個對象中取出相應的值

在上一張遊戲開始界面的圖吧。終於看到了完整的按鈕界面了



感覺好不錯。我答應大家的說把這個遊戲做完 我現在做到了。雖然在這些天大家給我提了很多的BUG 不過整體運行還是沒問題。希望大家都比我好一點一定要堅持。

         對於遊戲中的BUG 大家可以自己把源碼下過來來自己修改。甚至可以隨便的改,不過千萬不要用這個項目做商業用途啊。哈哈。轉載的時候註明是BOY 哈哈

        對於那些熱愛遊戲的新手們希望 我的博客能給你帶來幫助。咱們一起學習進步。

                                                        

                          對於這周我會專門的做一個cocos2d-x 強聯網的DEMO  供大家參考 羣裏對這個要求是在是太多了,我就滿足大家的需求。哈哈BOY 是不是很偉大。

                         對於下一週我準備再做一次連連看,以前是用純JAVA 開發的這次給轉成Cococ2d-x 來做。 大家以後有什麼問題一起來探究啊。共同學習。千萬要有耐心啊。BOY知道的一定會告訴大家。再一次感覺自己太偉大了。哈哈。

               

   源碼下載


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章