成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 iOS 游戲開發
Cocos2d各種視圖是本文要介紹的內容,iPhone上的每個View代表一個圖層,每個圖層有它的坐標系統。拿iPhone為例,在豎屏狀態下UIView的坐標系是高480寬320的系統。

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各種視圖轉換情況分析的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-07-08 16:09:54

Cocoa Cocos2d 動作

2011-07-08 16:27:52

Cocoa Cocos2d 動作

2011-08-08 11:26:39

Cocos2d 游戲 Class類

2012-06-01 10:27:44

Cocos2d觸摸分發原理

2011-08-09 16:08:58

IOS游戲Cocos2d

2011-08-22 10:49:42

Cocos2d 開發CCLayerTouch事件

2011-08-11 17:52:01

Cocos2d游戲對象

2011-07-27 10:13:23

Cocos2D iPhone

2011-08-11 18:00:18

Cocos2d動作Action

2011-07-29 18:02:06

2012-02-19 20:10:23

Cocos2d-x fCocos2dWindows Pho

2011-07-20 14:04:46

Cocos2d iPhone 游戲

2011-07-27 13:44:08

2011-08-02 15:37:48

Cocos2D UIAccelero

2011-08-08 17:17:55

Cocos2D 坐標 OpenglES

2011-07-27 14:48:21

iPhone Cocos2D 坐標

2011-07-08 14:33:02

Cocos2d iphone

2011-08-02 15:47:28

Cocos2D Animation

2011-08-04 17:01:16

iPhone游戲開發 Cocos2d

2011-08-11 14:22:47

iPhone游戲Cocos2D
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产区第一页 | av日韩精品 | 羞羞视频在线观看免费观看 | 99热播精品 | 一级黄a | 中文字幕日韩一区 | 久久久久成人精品亚洲国产 | 亚洲精品一区二区三区丝袜 | 国产午夜精品久久 | 久久久久久久久久久久久久av | 亚洲综合天堂网 | 久久99久久| 欧美日韩精品久久久免费观看 | 精品视频在线观看 | 天堂av中文在线 | 亚洲欧美日韩国产综合 | 国产精品久久久久久久久久久久 | 亚洲国产成人精品女人久久久 | 在线中文字幕av | 亚洲精品福利视频 | 91偷拍精品一区二区三区 | 日韩欧美高清 | www.youjizz.com日韩 | www狠狠爱com | 日韩精品久久久久 | 天天干夜夜操 | 国产午夜精品久久久久 | 国产激情网站 | 久久久久国产一区二区三区四区 | 亚洲 欧美 日韩 在线 | 亚洲高清在线观看 | 亚洲一区二区三区视频在线 | 97人人爱 | 黑人巨大精品欧美一区二区免费 | 99在线观看视频 | 国产精品久久久久久婷婷天堂 | 久久天天综合 | 国产亚洲一区二区在线观看 | 亚洲第一天堂 | 久久精品免费看 | av在线一区二区三区 |