cocos2D(六)----CCLayer,cocos2d----cclayer

來源:互聯網
上載者:User

cocos2D(六)----CCLayer,cocos2d----cclayer

一個遊戲中可以有很多個情境,每個情境裡面又可能包含有多個圖層,這裡的圖層一般就是CCLayer對象。CCLayer本身幾乎沒什麼功能,對比CCNode,CCLayer可用於接收觸摸和加速計輸入。其實,cocos2d對圖層並沒有嚴格的要求,圖層不一定要使用CCLayer類,它也可以是一個簡單的CCNode,為什麼呢?我們建立一個圖層不就是為了能夠容納更多的子節點麼,CCNode也可以添加子節點啊。所以,如果你的圖層不需要接收觸摸和加速計輸入,就盡量使用CCNode表示圖層,CCLayer因為能夠接收觸摸和加速計輸入會增加不必要的開銷。移動、縮放、旋轉整個圖層,圖層上的所有節點也會跟著一起移動、縮放、旋轉。


常用設定
1.接收觸摸輸入

CCLayer預設情況是不接收觸摸輸入的,需要顯示地設定isTouchEnabled為YES

[java] view plaincopy
  1. self.isTouchEnabled = YES;  
設定isTouchEnabled為YES後,就會調用圖層相應的方法來處理觸摸輸入:

這些都是在CCStandardTouchDelegate協議中定義的方法

1> 當單指接觸到螢幕時

[java] view plaincopy
  1. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;  

2> 當手指在螢幕上移動時

[java] view plaincopy
  1. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;  

3> 當單指離開螢幕時

[java] view plaincopy
  1. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;  

4> 當觸摸被取消時

[java] view plaincopy
  1. - (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;  
很少會發生觸摸被取消的情況,所以大多數情況下可忽略,或用ccTouchesEnded代替,因為ccTouchesCancelled和ccTouchesEnded類似


大部分情況下,我們需要知道觸摸發生在什麼位置。這裡的觸摸事件是由UIKit架構接收的,因此需要把觸摸位置轉換為OpenGL座標。

比如在手指移動過程中:

[java] view plaincopy
  1. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  2.     // 擷取觸摸對象  
  3.     UITouch *touch = [touches anyObject];  
  4.     // 擷取觸摸在UIView視圖上的位置  
  5.     CGPoint uiPoint = [touch locationInView:touch.view];  
  6.     // 轉換為OpenGL座標  
  7.     CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];  
  8. }  


下面利用一個小例子來綜合使用上述的方法,假設圖層上有個精靈,我手指觸摸到哪,這個精靈的位置就在哪

首先在圖層初始化的時候添加精靈

[java] view plaincopy
  1. // 圖層的init方法  
  2. -(id) init  
  3. {  
  4.     if( (self=[super init])) {  
  5.         // 初始化一個精靈  
  6.         CCSprite *lufy = [CCSprite spriteWithFile:@"lufy.png"];  
  7.         CGSize size = [[CCDirector sharedDirector] winSize];  
  8.         lufy.position =  ccp(size.width * 0.5f, size.height * 0.5f);  
  9.         // 添加精靈,並設定標記  
  10.         [self addChild: lufy z:0 tag:kLufyTag];  
  11.           
  12.         self.isTouchEnabled = YES;  
  13.     }  
  14.     return self;  
  15. }  

接下來是在圖層中接收觸摸輸入

[java] view plaincopy
  1. // 計算觸摸在圖層中的位置(OpenGL座標)  
  2. - (CGPoint)locationInLayer:(NSSet *)touches {  
  3.     // 擷取觸摸對象  
  4.     UITouch *touch = [touches anyObject];  
  5.     // 擷取觸摸在UIView視圖上的位置  
  6.     CGPoint uiPoint = [touch locationInView:touch.view];  
  7.     // 轉換為OpenGL座標  
  8.     CGPoint glPoint = [[CCDirector sharedDirector] convertToGL:uiPoint];  
  9.       
  10.     return glPoint;  
  11. }  
  12.   
  13. // 由於ccTouchesBegan、ccTouchesMoved、ccTouchesEnded中的做法都是一樣,所以抽成一個方法  
  14. - (void)dealTouches:(NSSet *)touches {  
  15.     // 計算觸摸的位置  
  16.     CGPoint point = [self locationInLayer:touches];  
  17.     // 根據標記擷取精靈  
  18.     CCSprite *lufy = (CCSprite *)[self getChildByTag:kLufyTag];  
  19.     // 設定精靈的位置  
  20.     lufy.position = point;  
  21. }  
  22.   
  23. - (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  24.     [self dealTouches:touches];  
  25. }  
  26.   
  27. - (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {  
  28.     [self dealTouches:touches];  
  29. }  
  30.   
  31. - (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {  
  32.     [self dealTouches:touches];  
  33. }  

圖層的觸摸輸入暫時講到這裡,其他進階的用法在後面會提及


2.接收加速計輸入

CCLayer預設情況是不接收加速計輸入的,需要顯示地設定isAccelerometerEnabled為YES

[java] view plaincopy
  1. self.isAccelerometerEnabled = YES;  
設定isAccelerometerEnabled為YES後,就會調用圖層相應的方法來處理加速計輸入:

這是在UIAccelerometerDelegate協議中定義的方法

[java] view plaincopy
  1. - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {  
  2.     // typedef double UIAccelerationValue;  
  3.     UIAccelerationValue x =  acceleration.x;  
  4.     UIAccelerationValue y =  acceleration.y;  
  5.     UIAccelerationValue z =  acceleration.z;  
  6.     // x,y,z代表三維中任意方向的加速度  
  7. }  


CCLayerColor

有時候,我們想給整個圖層設定一種背景顏色,那麼就需要用到CCLayerColor了,CCLayerColor是CCLayer的子類

[java] view plaincopy
  1. // 紅色:#ffff0000  
  2. ccColor4B color = ccc4(255, 0, 0, 255);  
  3. // 初始化一個顏色圖層  
  4. CCLayerColor *layerColor = [CCLayerColor layerWithColor:color];  
  5. // 添加到情境中  
  6. [scene addChild:layerColor];  


CCLayerGradient

CCLayerGradient是CCLayerColor的子類,可以給圖層設定漸層色

[java] view plaincopy
  1. // 紅色:#ffff0000  
  2. ccColor4B red = ccc4(255, 0, 0, 255);  
  3. // 藍色:#ff0000ff  
  4. ccColor4B blue = ccc4(0, 0, 255, 255);  
  5. // 初始化一個漸層圖層,從紅色漸層到藍色  
  6. CCLayerGradient *layerGradient = [CCLayerGradient layerWithColor:red fadingTo:blue];  
  7. // 添加到情境中  
  8. [scene addChild:layerGradient];  


CCLayerMultiplex

CCLayerMultiplex繼承自CCLayer,稱為"多重圖層"。它可以包含多個CCLayer對象,但在任意時刻只可以有一個CCLayer處於活動狀態,用switchTo:和switchToAndReleaseMe:方法可以讓某個圖層處於活動狀態,區別在於switchToAndReleaseMe:方法會先釋放當前處於活動狀態的圖層,再讓參數中要求的圖層處於活動狀態

[java] view plaincopy
  1. // 建立2個圖層  
  2. CCLayer *layer1 = [CCLayer node];  
  3. CCLayer *layer2 = [CCLayer node];  
  4.   
  5. // 建立一個多重圖層,包含了layer1和layer2  
  6.   
  7. CCLayerMultiplex *plex = [CCLayerMultiplex layerWithLayers:layer1, layer2, nil];  
  8.   
  9. // 讓layer1處於活動狀態(layer2還在記憶體中)  
  10. [plex switchTo:0];  
  11.   
  12. // 讓layer2處於活動狀態(layer1還在記憶體中)  
  13. [plex switchTo:1];  
  14.   
  15. // 釋放當前處於活動狀態的layer2(layer2從記憶體中移除),然後讓layer1處於活動狀態  
  16. [plex switchToAndReleaseMe:0];   

圖層之間的切換是沒有過渡效果的





原文地址:http://blog.csdn.net/q199109106q/article/details/8601533

感謝作者~!


COCOS2d中建立一個CCLayer層為何顯示不出來

請問你add了嗎?
 
怎從sdk(UIController)跳轉到cocos2d(CClayer)

這個還這麼沒這麼弄過,你在工程中直接引入2d的庫試試看
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.