HeroLayer類主要是處理hero的一些相關東西,以及調用bulletLayer的一些方法,因為子彈是附屬於hero的~~
HeroLayer 類的成員如下:
1 class HeroLayer : public CCLayer 2 { 3 public: 4 5 static HeroLayer* create(); 6 virtual bool init(); 7 8 virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);//觸摸事件 9 void moveHero(CCPoint toPoint);//移動hero 10 11 void heroBomb(float dt);//hero爆炸處理 12 void newLifeInit(float dt);//hero爆炸后初始化新的開始 13 14 15 CC_SYNTHESIZE(CCSprite*, m_Hero, Hero); 16 CC_SYNTHESIZE(bool, m_IsHeroLive, IsHeroLive); 17 CC_SYNTHESIZE(BulletLayer*, m_Bullets, Bullets); 18 CC_SYNTHESIZE(int, m_HeroLifes, HeroLifes); 19 20 private: 21 22 cocos2d::CCSize designResolutionSize; 23 24 };
重點一:touchesMoveed 移動hero
這里主要是設計到坐標轉換問題,cocos2dx里有幾種坐標系:UI坐標系、GL坐標系、本地坐標系和世界坐標系:
UI坐標系:以屏幕的左上角為原點,X坐標向左為正,Y坐標向下為正,一些touch事件獲取到的坐標就是以這個坐標系為標准的。
GL坐標系:也就是openGL坐標系,以屏幕的左下角為原點,X坐標向左為正,Y坐標向上為正,cocos2dx引擎底層是openGL,也用這個坐標系,一些控件的添加或設置是以這個坐標系為准的。
本地坐標系:子節點的左下角相對於父節點左下角的坐標,也就是以父節點的左下角為坐標原點,X坐標向左為正,Y坐標向上為正。boundingBox 方法獲取到的節點的rect的坐標就是這個坐標。
cocos2dx提供了一些方法來實現不同坐標系的轉換,其實cocos2dx也提供了直接從觸摸點的參數里獲取GL坐標。
ccTouchesMoveed方法實現如下:
1 void HeroLayer::ccTouchesMoved(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent) 2 { 3 /* 4 * 坐標系統 5 * cocos2dx坐標系統(opengl坐標系統):以左下角為原點 6 * UI坐標系統(繪圖坐標系統、紋理坐標系統):以左上角為原點 7 */ 8 9 //hero是否還活着 10 if(this->m_IsHeroLive) 11 { 12 /* 13 * 觸摸事件獲取坐標的幾個方法 14 * 15 * getLocation:獲取觸摸時第一點的cocos2dx 坐標 16 * getPreviousLocation 獲取觸摸時最后一點 cocos2dx 坐標 17 * getLocationInView 獲取觸摸時第一點的UI坐標 18 * getPreviousLocationInView 獲取觸摸時的最后一點 UI坐標 19 */ 20 21 CCTouch *touches = (CCTouch*)pTouches->anyObject(); 22 23 CCPoint beginPoint = touches->getLocation();//獲取觸摸坐標(cocos2dx坐標系統的) 24 25 CCRect planeRect = this->m_Hero->boundingBox();//獲取飛機當前位置形狀位置 26 27 //允許稍微加大一點觸摸位置,游戲實際需要 28 //planeRect.origin.x -= 15; 29 //planeRect.origin.y -= 15; 30 //planeRect.size.width += 30; 31 //planeRect.size.height += 30; 32 33 if(planeRect.containsPoint(beginPoint)) 34 { 35 CCPoint endPoint = touches->getPreviousLocation();//獲取觸摸的前一個位置 36 HeroLayer::moveHero(endPoint); //移動飛機 37 } 38 } 39 }