關於Cocos2d各種視圖轉換情況分析

來源:互聯網
上載者:User

Cocos2d各種視圖轉換情況分析在本文介紹的內容,關於cocos2d下的旋轉螢幕,大家都熟悉在cocos2d裡,如果要設定為橫屏的話,只要在attachView之前調用以下函數就可以了。

 
  1. [[CCDirector sharedDirector] setDeviceOrientation:CCDeviceOrientationLandscapeLeft];  

但在實際開發中,我們往往還會有以下一些問題 自動旋轉螢幕處理 在cocos2d裡加入UIView cocos2d attach的不是NSWindow而是其他Subview 遇到這些問題,你會發現事情並不像你預料的那麼簡單直接。要解決這些問題,我們先要瞭解一下iPhone的旋轉螢幕到底是如何處理的。

首先,iPhone上的每個View代表一個圖層,每個圖層有它的座標系統。拿iPhone為例,在豎屏狀態下UIView的座標系是高480寬320的系統。而在橫屏狀態下,如果已經處理好旋轉螢幕的情況下,它的座標系統就應該是高320寬480. 這個大家在使用UIViewController的時候,得到的結果是顯而易見的。但當你直接自己建立一個UIView並加入到NSWindow下,你會發現不管豎屏橫屏,這個view還是豎屏的狀態。

如果你擷取一下NSWindow或者您自己View的bounds,你會得到320x480二不是480 x 320. 這是怎麼回事呢?仔細想一下我們就明白了。UIViewController提供了一個方法可以讓我們告訴它是否選擇其管理的UIView,而NSWindow或者UIApplication都沒有提供類似的方法。也就是說螢幕的旋轉處理是需要View的控制者通過監聽裝置旋轉事件來自行處理的,而UIViewController就提供了類似的實現,從而使你不需要對view進行任何操作也能隨旋轉螢幕。

而如果你是自己建立View而沒有附著於任何ViewController的話,你就需要自己監聽旋轉螢幕事件了。那怎麼實現View的旋轉呢?每個UIView都有一個transform屬性,這個屬性決定了對View的預設座標系統所做的座標轉換,所以實際上transform其實就是一個三維矩陣,用於換算一個點在前後兩個座標系的座標因為opengl是一個三維繫統,所以是三維座標)。預設座標系是以View的中心為原點,View的寬為橫軸,高為縱軸。

當然這個系統是以它的superView為參照系的。如果superView的座標系是豎屏座標,則該view的預設座標系就是豎屏座標,如果superView的座標系是橫屏座標,則該view的預設座標系就是橫屏座標。以下就以對NSWindow的一個subview所做的座標轉換來看一下怎麼通過設定transform來改變View的視圖朝向之所以選擇NSWindow的subview,是因為NSWindow在系統中是一直不會做transform的,如果你拿一個UIViewController的view的subview來做transform,以下代碼就不準確了)。

 
  1. CGFloat radian = 0;   
  2. CGRect bounds; switch ([UIApplication sharedApplication].statusBarOrientation)   
  3.  {   
  4.  case UIInterfaceOrientationPortrait: break;   
  5.  case UIInterfaceOrientationPortraitUpsideDown: radian = PI;  
  6.   break; case UIInterfaceOrientationLandscapeLeft: radian = -PI/2;  
  7.   bounds.size = CGSizeMake(480, 320);   
  8.   break;   
  9.   case UIInterfaceOrientationLandscapeRight:   
  10.   radian = PI/2;   
  11.   bounds.size = CGSizeMake(480, 320);  
  12.    break;   
  13.    default: break;   
  14. }   
  15. //設定transform變數,以當前view的center為中心   
  16. //CGAffineTransformMakeRotation可以產生對當前座標系做旋轉處理的transform矩陣,   
  17. //旋轉角度是逆時針的radion,其中radion是該角度的弧度值。   
  18. CGAffineTransform transform = CGAffineTransformMakeRotation(radian);   
  19. _contentView.transform = transform; //重新設定view的大小   
  20. _contentView.bounds = bounds;  

現在我們再回來看前面提到的cocos2d的幾個問題。

1、自動旋轉處理 預設的cocos2d程式都是把cocos2d 的openglview attache到NSWindow裡,這種情況下你就需要自己監聽UIDeviceOrientationDidChangeNotification事件, 在裝置旋轉情況下來重新設定cocos2d。(不要監聽UIApplicationDidChangeStatusBarOrientationNotification或者UIApplication的相應delegate, setDeviceOrientation:CCDeviceOrientationLandscapeLeft本身會觸發這些事件)。

在監聽處理函數裡一般需要做以下事情,

 
  1. [[CCDirector sharedDirector] detach]; //重新設定裝置旋轉方向   
  2. [[CCDirector sharedDirector] setDeviceOrientation:CCDeviceOrientationLandscapeLeft];   
  3. //重新attach到view [[CCDirector sharedDirector] attachInView:NSWindow];   
  4. //重新布局當前的scene   
  5. //這裡沒有現成的方法,你可以自己實現。  

如果你的程式是把cocos2d openglview附著到某個ViewController的view裡的話,情況就不一樣了. 因為ViewController是支援自動旋轉螢幕的。如果你讓ViewController來處理旋轉螢幕比如你還要顯示navigation bar),你就不能調用[[CCDirector sharedDirector] setDeviceOrientation:...]方法了。

原因大家可以自己想想。唯一你需要做的就是處理旋轉螢幕時scene的重新布局。所以代碼就簡化為如此,

 
  1. [[CCDirector sharedDirector] detach]; //重新attach到view   
  2. [[CCDirector sharedDirector] attachInView:NSWindow]; //重新布局當前的scene   
  3. //這裡沒有現成的方法,你可以自己實現。 

2、在cocos2d裡加入UIView 這種情況和在NSWindow裡加入UIView很類似,如果你是自己建立的view,則需要自己設定view的座標轉換。如果你的view被viewcontroller管理著,則不需要自行處理。

3、cocos2d attach的不是NSWindow而是其他Subview 這種情況在1裡面其實已經提到了,如果你要附著的View是被UIViewController管理並且你允許該Controller做旋轉螢幕處理,你則不能調用[[CCDirector sharedDirector] setDeviceOrientation:...]方法,否則你會發現視圖多旋轉了一次。

小結:關於Cocos2d各種視圖轉換情況分析的內容介紹完了,希望通過本文的學習能對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.