首页 >IOS频道 >【Cocos2D研究院之游戏开发】 > Cocos2D研究院之打开全新ViewController与返回(八)
2012
11-19

Cocos2D研究院之打开全新ViewController与返回(八)

         之前cocos2d的文章都是由魏凯同学维护,从今天开始我也会抽时间写点cocos2d的文章。最近在研究如何将IOS游戏与软件结合起来。通常游戏开发中仅仅只需要一个ViewController即可,所有的图片动画渲染、场景的切换都是在这一个ViewControlelr中完成。但是软件开发中每一个界面都会是一个ViewController,为什么游戏和软件这点上区别很大呢?原因很简单,游戏属于自定义View 而软件需要借助系统提供的高级控件,这些高级控件也就是系统封装的View。比如Label、Button、ImageView 等等。。

          大家可以仔细看一下cocos2d的源码,先找到入口函数我和大家分析一下。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

 在方法中找到下面 ,CCDirector继承于ViewController,cocos2d的OpenGlView也是添加在这个ViewController之上。

director_ = (CCDirectorIOS*) [CCDirector sharedDirector];

        接着往下走,我们可以看到这段代码,意思就是将游戏的viewcontroller加在一个带导航栏的viewController之上,然后隐藏这个导航栏。 最后把这个这个viewController加在windows中。

	navController_ = [[UINavigationController alloc] initWithRootViewController:director_];
	navController_.navigationBarHidden = YES;

        下面我们分析一下,IOS程序在切换ViewController的时候必需要用UINavigationController  ,cocos2d的UINavitionController 就是  [CCDirectorsharedDirector].navigationController

         然后我们做一个简单的例子,大家就明白了如何来使用。创建两个游戏场景,如下图所示,这是第一个游戏场景,第二个游戏场景我就不在截图。左下角是一个cocos2d的按钮,点击该按钮后将从cocos2d切换至全新的viewcontroller当中。

 

Cocos2D研究院之打开全新ViewController与返回(八) - 雨松MOMO程序研究院 - 1

 

//
//  HelloWorldLayer.m
//  Navigation
//
//  Created by 雨松MOMO on 12-11-18.
//  Copyright __MyCompanyName__ 2012年. All rights reserved.
//

// Import the interfaces
#import "HelloGameLayer.h"

// Needed to obtain the Navigation Controller
#import "AppDelegate.h"

#pragma mark - HelloWorldLayer

// HelloWorldLayer implementation
@implementation HelloGameLayer

// Helper class method that creates a Scene with the HelloWorldLayer as the only child.
+(CCScene *) scene
{
	// 'scene' is an autorelease object.
	CCScene *scene = [CCScene node];

	// 'layer' is an autorelease object.
	HelloGameLayer *layer = [HelloGameLayer node];

	// add layer as a child to scene
	[scene addChild: layer];

	// return the scene
	return scene;
}

// on "init" you need to initialize your instance
-(id) init
{
	// always call "super" init
	// Apple recommends to re-assign "self" with the "super's" return value
	if( (self=[super init]) ) {

		// create and initialize a Label
		CCLabelTTF *label = [CCLabelTTF labelWithString:@"游戏场景2" fontName:@"Marker Felt" fontSize:64];

		// ask director for the window size
		CGSize size = [[CCDirector sharedDirector] winSize];

		// position the label on the center of the screen
		label.position =  ccp( size.width /2 , size.height/2 );

		// add the label as a child to this Layer
		[self addChild: label];

        CCMenuItem *starMenuItem =  [CCMenuItemImage itemWithNormalImage:@"Icon-72.png" selectedImage:@"Icon.png" disabledImage:@"Icon.png" target:self selector:@selector(starButtonTapped:)];
        starMenuItem.position = ccp(60, 60);
        starMenuItem.tag = 0;
        CCMenu *starMenu = [CCMenu menuWithItems:starMenuItem, nil];
        starMenu.position = CGPointZero;
        [self addChild:starMenu];

        //进入返回游戏后隐藏导航栏
        [[CCDirector sharedDirector].navigationController setNavigationBarHidden:YES animated:NO];
	}
	return self;
}

- (void)starButtonTapped:(id)sender
{
     //点击按钮后在这里

     //在这里打开全新的Viewcontroller
     [[CCDirector sharedDirector].navigationController pushViewController:[[[MyViewController alloc]init]autorelease] animated:YES];
     //显示导航栏,不需要导航栏删掉该代码即可
     [[CCDirector sharedDirector].navigationController setNavigationBarHidden:NO animated:NO];
}

// on "dealloc" you need to release all your retained objects
- (void) dealloc
{
	// in case you have something to dealloc, do it in this method
	// in this particular example nothing needs to be released.
	// cocos2d will automatically release all the children (Label)

	// don't forget to call "super dealloc"
	[super dealloc];
}

#pragma mark GameKit delegate

-(void) achievementViewControllerDidFinish:(GKAchievementViewController *)viewController
{
	AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
	[[app navController] dismissModalViewControllerAnimated:YES];
}

-(void) leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{
	AppController *app = (AppController*) [[UIApplication sharedApplication] delegate];
	[[app navController] dismissModalViewControllerAnimated:YES];
}
@end

如下图所示,在cocos2d中打开的新的viewController,此时cocos2d中的动画循环事件都会自动暂停,直到从新返回cocos2d的游戏当中即可从新打开。

Cocos2D研究院之打开全新ViewController与返回(八) - 雨松MOMO程序研究院 - 2

 

代码比较简单我就不做过多的解释了,仔细看看就应该明白啦。 

//
//  MyViewController.m
//  Navigation
//
//  Created by 雨松MOMO on 12-11-18.
//
//

#import "MyViewController.h"

@interface MyViewController ()

@end

@implementation MyViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

        self.view.backgroundColor = [UIColor whiteColor];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

	UIButton *button0 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button0.frame = CGRectMake(0, 0, 100, 50);
    [button0 setTitle:@"回到场景1" forState:UIControlStateNormal];
    [button0 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    button0.tag = 0;
    [self.view addSubview:button0];

    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button1.frame = CGRectMake(0, 100, 100, 50);
    [button1 setTitle:@"回到场景2" forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    button1.tag = 1;
    [self.view addSubview:button1];

    self.title = @"雨松MOMO";

    //返回按钮
    UIBarButtonItem *leftBarItem = [[UIBarButtonItem alloc]initWithTitle:@"按钮" style:UIBarButtonItemStylePlain target:self action:@selector(backController)];

    self.navigationItem.leftBarButtonItem = leftBarItem;
    [leftBarItem release];
}

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

-(void)backController
{
    UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"标题"
                                                      message:@"这是一个按钮"
                                                     delegate:nil
                                            cancelButtonTitle:@"确认"
                                            otherButtonTitles:nil];

    [alertView show];
    [alertView release];

}

-(void)buttonPressed:(id)sender
{

    UIButton * button = (UIButton*)sender;

    //根据点击按钮切换当前游戏场景
    switch (button.tag)
    {
        case 0:

            //使用replaceScene切换场景的时候会重新调用scene方法,这样就会重新执行init方法。
            //如果不像重复初始化可以将场景存在变量中。
            [[CCDirector sharedDirector]replaceScene:[HelloWorldLayer scene]];

            break;
        case 1:
            [[CCDirector sharedDirector]replaceScene:[HelloGameLayer scene]];
            break;
        default:
            break;
    }

    //如果你紧紧只是想返回上一个场景的话,其实不用写上面replaceScene这部分代码,直接执行下面的返回操作即可。

    [self.navigationController popViewControllerAnimated:YES];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

 

切换场景的特效方式都可以以这样的方法来添加,快快把游戏和软件结合起来吧。

代码下载: http://vdisk.weibo.com/s/ioMx4

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Cocos2D研究院之打开全新ViewController与返回(八)》有 17 条评论

  1. 张雪蕊说:

    cannot specify -o when generating multiple output files 这个问题怎么解决,我是把unity岛成Xcode
    的文件放到我的Xcode project里面了,调整过arc兼容,配置,之后爆出的错误。。。要怎么解决

  2. 求转发,求拥抱….哈哈..

  3. 我爱旅游说:

    支持哈

留下一个回复

你的email不会被公开。 必填项已用 * 标注。