liangzhimy

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 
 
1 启动
 
在iOS系统中,由main函数启动默认调用了AppController
main.m
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
[pool release];
return retVal;
 
2 AppController 
iOS的ViewController都熟悉吧,iOS程序的基础Controller 。 
 
1. 初始化Application 
 
   
   cocos2d::Application *app = cocos2d::Application::getInstance();
    app->initGLContextAttrs();
    cocos2d::GLViewImpl::convertAttrs();

 

 
2. 初始化OpenGLView, 在iOS下使用OpenGL必须实现一个EAGLLayer 的View 我们这里就叫它EAGView吧,
这个View是OpenGL 最终显示的画布, 在这里我们以初始化了与OpenGL相关的工作。  
 
如:
1>初始化EAGLContext
2> RenderBuffer 
3> FrameBuffer 
4> 关联RenderBuffer 与FrameBuffer 
5> 在这个View里有一个swapBuffer 其实就是  [context RenderBuffer:GL_RenderBuffer],  这个函数在每个渲染循环都要调用, 主要是在Director::drawScene 里调用。 drawScene 是在下面要说到的run 里调用了iOS自更新函数displayLinker:mainLoop来实现的。 
 
// 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]];

    // Init the CCEAGLView
    CCEAGLView *eaglView = [CCEAGLView viewWithFrame: [window bounds]
                                         pixelFormat: (NSString*)cocos2d::GLViewImpl::_pixelFormat
                                         depthFormat: cocos2d::GLViewImpl::_depthFormat
                                  preserveBackbuffer: NO
                                          sharegroup: nil
                                       multiSampling: NO
                                     numberOfSamples: 0 ];

    // Use RootViewController manage CCEAGLView 
    _viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    _viewController.wantsFullScreenLayout = YES;
    _viewController.view = eaglView;
 
3. cocos:GLView 代理模式,代理了之前我们创建的CCEAGLView对象, 这样我们就可以转到使用统一的cocos的GLView了, 后面又把这个GLView给了director。 这样我们director及GLView就都算是初始化了。 
 
// IMPORTANT: Setting the GLView should be done after creating the RootViewController
    cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView(eaglView);
    cocos2d::Director::getInstance()->setOpenGLView(glview);
 
4. 最主要的程序主循环mainLoop() 
 
这里调用的是Application->run。 这个run最后用调用 到director的mainLoop, 从这里开始程序的控制权正式归入到director手中。 
 
   
 app->run();
 
int Application::run()
{
    if (applicationDidFinishLaunching())
    {
        [[CCDirectorCaller sharedDirectorCaller] startMainLoop];
    }
    return 0;
}
 

-(void) startMainLoop
{
        // Director::setAnimationInterval() is called, we should invalidate it first
    [self stopMainLoop];
   
    displayLink = [NSClassFromString(@"CADisplayLink") displayLinkWithTarget:selfselector:@selector(doCaller:)];
    [displayLink setFrameInterval: self.interval];
    [displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
 
                
-(void) doCaller: (id) sender
{
    cocos2d::Director* director = cocos2d::Director::getInstance();
    [EAGLContext setCurrentContext: [(CCEAGLView*)director->getOpenGLView()->getEAGLView()context]];
    director->mainLoop();
}

 

posted on 2015-04-13 13:50  liangzhimy  阅读(4475)  评论(1编辑  收藏  举报