cocos2dx打飛機項目筆記三:HeroLayer類和坐標系


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 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM