2011-11-24 76 views
1

我使用下面的初始化代碼初始化我CCLayer:對象順序

- (id)init { 
    if((self=[super init])) { 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
     picker.wantsFullScreenLayout = YES; 
     picker.allowsEditing = NO; 
     picker.showsCameraControls = NO; 
     picker.navigationBarHidden = YES; 
     picker.toolbarHidden = YES; 
     picker.cameraViewTransform= CGAffineTransformMakeScale(1.3, 1.33); 
     [[[CCDirector sharedDirector] openGLView] addSubview:picker.view]; 

     CCSprite *gold = [CCSprite sprite]; 
     gold.position = ccp(150, 150); 
     [self addChild:gold]; 
    } 
    return self; 
} 

的CCSprite在相機視圖上方的相機快門打開之前,但是當快門打開時,CCSprite被相機重疊。

我可以重新排列這些2個對象的順序/把攝影機視圖後面?

回答

4

不是沒有一些額外的工作。

要理解這一點,你必須考慮你要添加的攝影機視圖由Cocos2D中的openGLView。這使相機查看Cocos2D視圖的「子」視圖。這類似於向CCScene或CCLayer添加子節點,然後想讓該節點在後面繪製這個場景或圖層。如果不更改視圖層次結構的設置方式,則無法執行此操作。

所以,你將不得不修改的Cocos2D的啓動,使得openGLView不直接添加到一個UIWindow,但另一個UIView的。

UIView* dummyView = [[UIView alloc] initWithFrame:[window bounds]]; 
[dummyView autorelease]; 
[dummyView addSubview:[CCDirector sharedDirector].openGLView]; 
rootViewController.view = dummyView; 

可以再加入攝像機視圖到dummyView(不是openGLView,否則你會像以前一樣有同樣的問題),並在其上執行sendSubviewToBack以便它在後臺運行。

你也必須初始化Cocos2D中的與kEAGLColorFormatRGBA8的PixelFormat OpenGL的視圖,以提供一個alpha通道。

EAGLView* glView = [EAGLView viewWithFrame:[window bounds] 
           pixelFormat:kEAGLColorFormatRGBA8 
           depthFormat:0 
         preserveBackbuffer:NO 
           sharegroup:nil 
          multiSampling:NO 
          numberOfSamples:0]; 

您還需要使openGLView透明:

[CCDirector sharedDirector].openGLView.opaque = NO; 

當然,如果你沒有任何渲染全屏的cocos2d的觀點這僅適用。例如,如果您爲Cocos2D視圖提供全屏幕背景圖像,則不會顯示任何內容,因爲背景圖像將呈現在攝像機視圖之上。

您可以找到second edition of my book更詳細的解釋。您也可以從該鏈接下載本書的源代碼並查看第15章的示例。或者下載Kobold2D並使用提供的Cocos2D-With-UIKit-Views模板項目。