2012-07-18 44 views
3

我想在cocos2d的项目中显示一个UIViewController,所以我在我的CCLayer类做到这一点:添加的UIViewController在cocos2d

-(void)displayMainMenu { 
    CGSize screenSize = [CCDirector sharedDirector].winSize; 
    [CCMenuItemFont setFontName:@"Marker Felt"]; 
    [CCMenuItemFont setFontSize:26]; 

    CCMenuItemFont *openViewC = [CCMenuItemFont itemWithString:@"Open View" target:self selector:@selector(loadMyViewController)]; 
    mainMenu = [CCMenu menuWithItems:openViewC, nil]; 
    [self addChild:mainMenu z:0]; 
} 

-(void) loadMyViewController{ 

    //Add the tableview when the transition is done 
    myView = [[MyViewController alloc] init]; 
    UIView *viewHost = hostView.view; 

    [[[CCDirector sharedDirector] view] addSubview:viewHost]; 
} 

,然后在我的ViewController回到我CCLayer我这样做:

- (IBAction)exitAction:(id)sender 
    { 
    [self.view removeFromSuperview]; 

    [[CCDirector sharedDirector] pushScene: [MainMenu scene]]; //i need it or not? 
} 

和所有的工作,我使用cocos2d v2.0,但我想知道是否有更好的方式添加一个UIViewController在cocos2d场景,谢谢!

+0

为避免泄漏,将MyViewController als childViewController添加到Director,并在添加后释放myView。在删除时,从超级视图中删除myView及其视图。 myView覆盖呈现CCNode的eaglview。所以你不需要推送和流行CCLayers。 – zeiteisen 2012-07-18 18:22:21

+0

你能解答一下吗?谢谢,我在等待它! – Piero 2012-07-18 22:00:48

回答

9

由于在cocos2d 2.0导演是如在AppDelegate中加载的导航控制器的根的UIViewController的一个子类,实际上存在能够利用非常简单的方式UIKit动画,如果你喜欢的话。它也使得场景完好无损,而不用担心内存管理。你可以改变你的-loadMyViewController方法是:

- (void)loadMyViewController { 
    myView = [[MyViewController alloc] init]; 
    AppController *app = (AppController *)[[UIApplication sharedApplication] delegate]; 
    [app.navController pushViewController:myView animated:YES]; 
    [CCDirector sharedDirector].pause; 
} 

,然后简单地恢复导演和调用[app.navController popViewController ...]当你想返回到cocos2d的场景。或者,您可以在推送视图控制器而不是暂停时使用stopAnimation方法,与cocos2d处理进入背景的应用程序类似。

+0

你还能从cocos2d节点内的uikit控件获得回调等吗? – zardon 2012-08-14 19:34:40

+0

@zardon是的,你可以。 – Clay 2012-10-19 22:44:09

+0

优秀.. !!帽子脱下男人...... – 2013-02-19 19:11:18

1

如果是cocos2D 2.0,那就用这个。

AppController *app = (AppController*) [[UIApplication sharedApplication] delegate]; 
     [app.navController.view addSubview:newView]; 

娄的cocos2d 2.0

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
    [app .viewController.view addSubview:newView]; 
+0

这比我的解决方案好吗? – Piero 2012-07-18 16:05:15

+1

我更喜欢你的解决方案 – zeiteisen 2012-07-18 18:16:48

2

您可以使用一个简单的代码,如果你想弹出一个视图,只需要导入yourviewcontroller.h文件,并使用此代码,它支持所有的cocos2d版本

- (void)loadMyViewController { 

    yourviewcontroller *myView = [[yourviewcontroller alloc] init]; 

    UIView *viewHost = myView.view; 

    [[[CCDirector sharedDirector] openGLView] addSubview:viewHost]; 

}

//更换屏幕上,如果你想减少内存使用,或只是暂停

1

或者您可以使用此代码..

ViewController *vc = [[ViewController alloc] init]; 

AppController *app = (AppController*) [[UIApplication sharedApplication] delegate]; 

[[app navController] presentModalViewController:vc animated:YES];