Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)
?? ??這里是Evankaka的博客,歡迎大家前面討論與交流~~~~~~
? ? ? 轉(zhuǎn)載請注明出處http://blog.csdn.net/evankaka/article/details/42439707
? ? ?本章在前面Cocos2d-x 自定義按鈕類控制精靈攻擊----之游戲開發(fā)《趙云要格斗》(2)的基礎(chǔ)上,實(shí)現(xiàn)了精靈向右運(yùn)動(dòng)到地圖中間時(shí),地圖能跟著移動(dòng),但此時(shí)精靈是原地不動(dòng)只是播放跑動(dòng)畫。并且,當(dāng)?shù)貓D移動(dòng)到邊緣時(shí),地圖不在移動(dòng),但此時(shí)精靈能移動(dòng)同時(shí)播放跑動(dòng)畫。網(wǎng)上看了些別人寫的地圖,很多都是通過兩張地圖交替顯示來實(shí)現(xiàn),這里我就想通過一個(gè)地圖來實(shí)現(xiàn),英雄移動(dòng)到地圖的最左邊或最右邊時(shí),地圖不能移動(dòng),但是英雄還是能移動(dòng)。這樣比較符合我們玩游戲時(shí)的情形。
cocos2d-x版本:2.2.5
工程環(huán)境:windows7+VS2010
打開方式:將工程放在cocos2d-x安裝目錄下的project文件夾下用VS打開
源碼免費(fèi)下載(博主決定本系列資源全部免費(fèi)~)
?目錄
一、在英雄類中增加判斷英雄是否運(yùn)動(dòng)到了窗口的中間位置函數(shù)
二、自定義地圖類
三、根據(jù)英雄精靈和窗口的大小來移動(dòng)地圖或移動(dòng)精靈
四、思路總結(jié)
下面是要滾動(dòng)的地圖,只有一張,但是很長。
先看看效果
一、在英雄類中增加判斷英雄是否運(yùn)動(dòng)到了窗口的中間位置函數(shù)
在上一篇的英雄類中再增加一個(gè)函數(shù):
<pre name="code" class="cpp">//判斷英雄是否運(yùn)動(dòng)到了窗口的中間位置,visibleSize為當(dāng)前窗口的大小bool JudgePositona(CCSize visibleSize); 然后這是它的實(shí)現(xiàn): bool Hero::JudgePositona (CCSize visibleSize){if(this->getPositionX()!=visibleSize.width/2)//精靈到達(dá)左邊return false;elsereturn true;//到達(dá)中間位置}二、自定義地圖類
?這里為了后頭地圖能再實(shí)現(xiàn)其它功能,我自己又設(shè)計(jì)了一個(gè)地圖類,它能根據(jù)英雄的運(yùn)動(dòng)還判斷是否要移動(dòng)地圖
其實(shí)這里的地圖就是一個(gè)CCSprite ,然后把它加到當(dāng)前類中,這個(gè)類是從CCNODE中派生的。然后根據(jù)當(dāng)前英雄的位置來判斷自己是否在進(jìn)行移動(dòng),在MoveMap(CCNode *hero,CCSize visibleSize)這個(gè)函數(shù)中,其實(shí)實(shí)現(xiàn)得很簡單。傳入當(dāng)前英雄和當(dāng)前窗口的大小,然后就是一些判斷了
直接看代碼了Map.h:
#ifndef __MAP_H__ #define __MAP_H__ #include "cocos2d.h" USING_NS_CC; class Map:public CCNode { public:Map();~Map();//初始化地圖,window_sizeo為控制臺(tái)大小void InitMap(const char *map_name,const CCSize &window_size);//根據(jù)精靈的位置移動(dòng)地圖,visibleSize為當(dāng)前窗口的大小void MoveMap(CCNode *hero,CCSize visibleSize);//判斷地圖是否到達(dá)邊緣bool JudgeMap(CCNode *hero,CCSize visibleSize);//virtual void update(float delta);CREATE_FUNC(Map);private:CCSprite *m_map;//地圖精靈}; #endif // __MAP_H__
然后這是它的實(shí)現(xiàn)Map.cpp:
#include "Map.h" Map::Map():m_map(NULL) {} Map::~Map() {} void Map::InitMap(const char *map_name,const CCSize &window_size) {this->m_map=CCSprite::create(map_name);m_map->setAnchorPoint(ccp(0,0));//設(shè)置錨點(diǎn)this->setAnchorPoint(ccp(0,0));//設(shè)置錨點(diǎn)this->addChild(m_map);} void Map::MoveMap(CCNode *hero,CCSize visibleSize)// {if(hero->getPositionX()==visibleSize.width/2)//精靈運(yùn)動(dòng)到中間,地圖才移動(dòng){if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地圖左邊運(yùn)動(dòng)后超出邊緣this->setPosition(this->getPositionX()-1,this->getPositionY());} } bool Map::JudgeMap(CCNode *hero,CCSize visibleSize) {if(this->getPositionX()!=-(m_map->getContentSize().width-visibleSize.width))//防止地圖左邊運(yùn)動(dòng)后超出邊緣return false;else //地圖已經(jīng)移動(dòng)到達(dá)邊緣return true; }
三、根據(jù)英雄精靈和窗口的大小來移動(dòng)地圖或移動(dòng)精靈
上面自定義的地圖類要怎么用呢?在HelloWorldScene.h中添加頭文件#include "Map.h"
同時(shí)定義一個(gè)成員變量
private:Map* mymap;//地圖這時(shí)就可以直接用了。在init()函數(shù)中:
原本我是用:(在第一篇-虛擬搖桿的開頭那里有寫)
//修改背景圖片 CCSprite* pSprite = CCSprite::create("background_1.jpg"); pSprite->setPosition(ccp(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y)); this->addChild(pSprite, 0);//這里的0表示放在最底層
把上面的去掉,改成:
//更改為自己定義的地圖mymap=Map::create();mymap->InitMap("12.png",visibleSize);this->addChild(mymap,0);
然后再改HelloWorldScene.cpp中的updata()事件:
void HelloWorld::update(float delta) {CCSize visibleSize1 = CCDirector::sharedDirector()->getVisibleSize();//判斷是否按下?lián)u桿及其類型switch(rocker->rocketDirection){case 1://hero->SetAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun);hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"為run_animation.png集合圖片中每張圖片的公共名稱部分if(hero->getPositionX()<=visibleSize1.width-8)//不讓精靈超出右邊,8可以改成你喜歡的{if(!hero->JudgePositona(visibleSize1)||mymap->JudgeMap(hero,visibleSize1))//精靈沒到達(dá)窗口中間位置或者地圖已經(jīng)移動(dòng)到邊緣了,精靈才可以移動(dòng),否則只播放動(dòng)畫hero->setPosition(ccp(hero->getPosition().x+1,hero->getPosition().y)); //向右走//下面是移動(dòng)地圖mymap->MoveMap(hero,visibleSize1);}break;case 2:hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"為run_animation.png集合圖片中每張圖片的公共名稱部分hero->setPosition(ccp(hero->getPosition().x, hero->getPosition().y+1)); //向上走break;case 3:hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"為run_animation.png集合圖片中每張圖片的公共名稱部分if(hero->getPositionX()>=8)//不讓精靈超出左邊,8可以改成你喜歡的hero->setPosition(ccp(hero->getPosition().x-1,hero->getPosition().y)); //向左走break;case 4:hero->SetAnimation("run_animation.plist","run_animation.png","run_",8,rocker->rocketRun);//"run_"為run_animation.png集合圖片中每張圖片的公共名稱部分hero->setPosition(ccp(hero->getPosition().x,hero->getPosition().y-1)); //向下走break;case 0:hero->StopAnimation();//停止所有動(dòng)畫和運(yùn)動(dòng)break;}if(btn->isTouch)hero->AttackAnimation("attack1_animation.plist","attack1_animation.png","attack_",6,rocker->rocketRun); }
這樣就大功告成了,我們來看看效果:
1.首先,精靈向左運(yùn)動(dòng)的邊緣時(shí),不能再移動(dòng)過去。
2.接下來,英雄向右移動(dòng)到中間時(shí)(地圖還沒到最右邊),地圖移動(dòng),精靈只播放動(dòng)畫但不改變它的位置(相當(dāng)于英雄一直在中間,但是地圖移動(dòng)了,造成英雄移動(dòng)的錯(cuò)覺)
3.當(dāng)?shù)貓D移動(dòng)到最右邊時(shí)。地圖不動(dòng)了,英雄可以移動(dòng)超過中間的位置
效果就是這樣了,原本是想弄成地圖可以跟著精靈左右移動(dòng)的,但是這個(gè)有點(diǎn)兒麻煩,還得判斷左右,就偷了下懶,
這里地圖移動(dòng)過去了就不能再移動(dòng)回來 了。想移動(dòng)回來是有思路,但是寫比來比較費(fèi)事,后頭有時(shí)間再來把這好好改下吧
四、思路總結(jié)
其實(shí)簡單說:
1.精靈向右還沒運(yùn)動(dòng)到窗口中間
精靈播放跑動(dòng)畫同時(shí)移動(dòng)位置,但此時(shí)地圖位置不改變。
2.精靈向右運(yùn)動(dòng)到窗口中間且地圖還沒有移動(dòng)到最右邊
精靈只播放跑的動(dòng)畫,但是不改變它的位置。但地圖要向左移動(dòng),造成精靈在移動(dòng)的錯(cuò)覺
3.地圖移動(dòng)到最右邊了
此時(shí)地圖不要改變位置了,精靈播放跑動(dòng)畫同時(shí)要移動(dòng)
由于當(dāng)前工程一直在修改中,有需要的把郵箱留下就是哈,后頭不修改了我會(huì)把每一個(gè)一個(gè)工程都上傳上去。
源碼免費(fèi)下載(博主決定本系列資源全部免費(fèi)~)
總結(jié)
以上是生活随笔為你收集整理的Cocos2d-x地图随精灵无限滚动与边缘检测----之游戏开发《赵云要格斗》(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信公众号网页授权域名证书验证位置
- 下一篇: python bif_小猪的Python