2011-11-24 70 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模板项目。