UIView和Coco2d-x场景之间的相互跳转切换

原文链接:http://cocos2d.9tech.cn/news/2013/1121/38770.html

首先要解释一下这篇文章要讲解的内容:我们在IOS程序中可能要添加一些用cocos2dx实现的功能的话,

那么就需要涉及到UIView和Cocos2dx场景之间的切换。那么要如何实现呢?

我们如果在xcode中新建一个cocos2dx项目,在ios文件夹中就可以发现,其实这个cocos2dx就是EAGLView,这是一个UIView。

然后这个view封装到RootViewController中;最后,这个controller在AppController中设置为window的root view controller.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
     // Override point for customization after application launch.
 
     // Add the view controller's view to the window and display.
     window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
     EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
                                      pixelFormat: kEAGLColorFormatRGBA8
                                      depthFormat: GL_DEPTH_COMPONENT16
                               preserveBackbuffer: NO
                                       sharegroup: nil
                                    multiSampling: NO
                                  numberOfSamples:0 ];
 
     // Use RootViewController manage EAGLView
     viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
     viewController.wantsFullScreenLayout = YES;
     viewController.view = __glView;
 
     // Set RootViewController to window
     if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
     {
         // warning: addSubView doesn't work on iOS6
         [window addSubview: viewController.view];
     }
     else
     {
         // use this method on ios6
         [window setRootViewController:viewController];
     }
     
     [window makeKeyAndVisible];
 
     [[UIApplication sharedApplication] setStatusBarHidden: YES];
 
     cocos2d::CCApplication::sharedApplication()->run();
     return YES;
}

好了,有了上面的了解,那么我们就有办法了。

假如现在我们的要求是:程序启动,第一个视图是UIView,然后点击button,调到cocos2dx的一个场景,然后点击button还可以返回到UIView。

运行的效果是:

 

点击跳到Scene跳转到第二个图片所示的视图;点击跳到View跳回到第一个图片所示的视图。

实现过程:

(1)很明显这是两个view controller控制下的两个view视图:第一个view只包含了一个button(MyViewController);

第二个view包含了一个cocos2dx视图和一个button(RootViewController)。

(2)所以问题就变成了这两个view之间跳转的问题了,下面我采用navigation controller来处理这二者的切换。

(3)先看看AppController.h

1
2
3
4
5
6
7
8
9
10
11
#import "MyViewController.h"
 
@interface AppController : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate,UIApplicationDelegate>
 
@property (nonatomic, retain) UIWindow *window;
 
@property (nonatomic, retain) UINavigationController* navController;
 
@property (nonatomic, retain)MyViewController* myController;
 
@end

然后:AppController.mm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
     
     window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
     
     myController = [[MyViewController alloc] init];
         
     navController = [[UINavigationController alloc] init];
     [navController pushViewController:myController animated:NO];
     navController.navigationBarHidden = YES;
 
     // Set RootViewController to window
     if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
     {
         // warning: addSubView doesn't work on iOS6
         [window addSubview:navController.view];
     }
     else
     {
         // use this method on ios6
         [window setRootViewController:navController];
     }
 
     [window makeKeyAndVisible];
     [[UIApplication sharedApplication] setStatusBarHidden: YES];
 
//    cocos2d::CCApplication::sharedApplication()->run(); 注意暂时不可以run
     return YES;
}

注意最后面:cocos2d::CCApplication::sharedApplication()->run(); 要注释掉,因为开的时候运行的是第一个view,

此时cocos2dx还没有跑起来。

(4)所以看看这两个视图controller:

①第一个图片所对应的MyViewController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)viewDidLoad
{
     [ super viewDidLoad];
     // Do any additional setup after loading the view.
     
     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     button.frame = CGRectMake(0, 100, 100, 50);
     [button setTitle:@ "跳到 Scene" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
}
 
-(void)buttonPressed:(id)sender
{
     RootViewController* rootController = [[RootViewController alloc]init];
     [self.navigationController pushViewController:rootController animated:YES];
}

②第二个图片所对应的RootViewController

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
- (void)viewDidLoad {
     [ super viewDidLoad];
     
     //添加一个button
     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
     button.frame = CGRectMake(0, 400, 100, 50);
     [button setTitle:@ "跳到 View" forState:UIControlStateNormal];
     [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
     [self.view addSubview:button];
         
     [self addGLView]; //添加cocos2dx视图
     
}
 
-(void)buttonPressed:(id)sender
{
     CCDirector::sharedDirector()->end();
     [self.navigationController popViewControllerAnimated:YES];
}
 
 
-(void)addGLView
{
     UIWindow *window = [UIApplication sharedApplication].keyWindow;
     EAGLView *__glView = [EAGLView viewWithFrame: [window bounds]
                                      pixelFormat: kEAGLColorFormatRGBA8
                                      depthFormat: GL_DEPTH_COMPONENT16
                               preserveBackbuffer: NO
                                       sharegroup: nil
                                    multiSampling: NO
                                  numberOfSamples:0 ];
     [__glView setFrame:CGRectMake(0, 0, 320, 320)];
     [self.view addSubview:__glView];
     cocos2d::CCApplication::sharedApplication()->run(); //这个时候就run
}
 
 
 
// Override to allow orientations other than the default portrait orientation.
// This method is deprecated on ios6
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     return UIInterfaceOrientationIsPortrait( interfaceOrientation );
}
 
// For ios6, use supportedInterfaceOrientations & shouldAutorotate instead
- (NSUInteger) supportedInterfaceOrientations{
#ifdef __IPHONE_6_0
     return UIInterfaceOrientationMaskPortrait;
#endif
}
 
- (BOOL) shouldAutorotate {
     return YES;
}

好咯,主要的代码都已经贴出来了。

(5)下面再具体的看看其中关键的部分:

RootViewController

①我们创键了EAGLView的实例,作为subview添加到当前的view。而且设置它的rect为(0,0,320,320)

那么我们可以在HelloWorld 场景中:

1
2
3
//输出当前cocos2dx的size
     CCSize winSize = CCDirector::sharedDirector()->getWinSize();
     CCLog( "width = %f;height = %f" ,winSize.width,winSize.height);
可以发现:输出的和所设置的是一致的。

② 创建EAGLView实例的代码可以直接从项目初始的AppController.mm中直接超过了,然后,注意要:

cocos2d::CCApplication::sharedApplication()->run(); 让cocos2dx跑起来。

③注意其中的屏幕方向也要设置一下(为竖向)。

④现在看看,如何从这个view调回到原来的view呢?在button的回调方法中:

1
2
3
4
5
-(void)buttonPressed:(id)sender
{
     CCDirector::sharedDirector()->end();
     [self.navigationController popViewControllerAnimated:YES];
}

很重要的是第一个语句,先结束掉当前的cocos2dx,然后再调回到原来的view。

好咯,大概的过程就是这个样子了,哥我为了这个过程,浪费了半天的时间,尤其是在cocos2dx场景如何跳转回到UIView的问题上。

原来我是想在cocos2dx的场景中的一个menu item 的回调方法中执行跳回view的功能,但是始终不能实现;

最后我想到不要cocos2dx覆盖整个视图,而是作为一个subview,然后添加一个button,直接让这个对应的controller去处理视图的跳转就可以了。

上面的跳转使用到navigation,如果不想添加这个容器的话,直接在controller之间跳转也是可以的。

下面也给出实现的代码,区别只是在于跳转的代码,其他都一样。

AppController.mm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
     // Override point for customization after application launch.
 
     // Add the view controller's view to the window and display.
     window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
     
     myController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
     
     // Set RootViewController to window
     if ( [[UIDevice currentDevice].systemVersion floatValue] < 6.0)
     {
         // warning: addSubView doesn't work on iOS6
         [window addSubview: myController.view];
     }
     else
     {
         // use this method on ios6
         [window setRootViewController:myController];
     }
     
     [window makeKeyAndVisible];
 
     [[UIApplication sharedApplication] setStatusBarHidden: YES];
 
//    cocos2d::CCApplication::sharedApplication()->run();
     return YES;
}

RootViewController.mm

1
2
3
4
5
-(void)buttonPressed:(id)sender
{
     CCDirector::sharedDirector()->end();
     [self dismissViewControllerAnimated:YES completion:nil];
}

MyViewController

1
2
3
4
5
-(void)buttonPressed:(id)sender
{
     RootViewController* rootController = [[RootViewController alloc]init];
     [self presentViewController:rootController animated:YES completion:nil];
}
下面为了有需要的同志,给出navigation实现的代码下载链接: 点击打开链接
(内容只包括ios文件夹)
来自:cnblogs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值