cocos2d初始化

首先,winmain创建AppDelegate,AppDelegate继承于CCApplication,其构造函数获取应用程序句柄,以及设置动画。紧接着,创建单例CCApplication,接着cocos2d::CCApplication::sharedApplication().run();。
    在里面,执行PVRFrameEnableControlWindow,这儿是设置与获取注册表里的值,具体没怎么细看,但把参数设为true,出现一个对话框,暂且不管。接着QueryPerformanceFrequency(&nFreq);QueryPerformanceCounte r (&nLast);查询cpu频率及其计数。
    然后initInstance(),根据平台创建窗口,win32是创建了一个CCEGLView,其构造函数初始化cctouch,ccset,以及设备摆放位置,设置了空的视口矩阵列,,CCEGLView是个基类,没有继承任何东西,且 里面有个全局的静态对象单例s_pMainWindow,用于处理消息,构造完后,开始create,这儿就是win32的WNDCLASS的创建,接着创建CreateWindowEx()都是windows的,存储横屏或竖屏,接着,resize()计算视口。

创建egl<这儿是openGL es>的内容,得到窗口并拿到dc,从dc里获取EGLDisplay eglDisplay;CC_BREAK_IF(EGL_NO_DISPLAY == (eglDisplay = eglGetDisplay(pEGL-> m_eglNativeDisplay)));。eglInitialize(eglDisplay, &nMajor, &nMinor),初始化egl,并判断主版本是否为1,指定configList,直接看配置信息,

const EGLint aConfigAttribs[] =

                     {

                            EGL_LEVEL,                      0,

                            EGL_SURFACE_TYPE,             EGL_WINDOW_BIT,

                            EGL_RENDERABLE_TYPE,      EGL_OPENGL_ES2_BIT,

                            EGL_NATIVE_RENDERABLE,  EGL_FALSE,

                            EGL_DEPTH_SIZE,                   16,

                            EGL_NONE,

                     };

直接使用eglChooseConfig配置,得到eglContext = eglCreateContext(eglDisplay, eglConfig, NULL, NULL);设备上下文,得到eglSurface = eglCreateWindowSurface(eglDisplay, eglConfig, pEGL->m_eglNativeWindow, NULL);,激活context,eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext));从此就有了egl与系统无关的中间层对象了。

好了,终于,我们总算拥有了一个与设备无关与系统无关的eglWnd对象了,总之跨平台是个艰难的过程。整个系统初始化告一段落,接着调用用户接口,applicationDidFinishLaunc hing(),这玩意就是用户要去弄的初始化,一般用于操纵单例CCDirector。

上面一直没说CCDirector这个单例,早在create时,因为窗口需要判断是否横竖屏,而横竖屏是CCDirector中创建,它负责scene的管理及时间,以及内存自动管理。以后专门用一节分析其垃圾回收,内存管理是必不可少的,否则怎么内存泄漏都不清楚。

扯了半天,先把这一帧弄完,回到正题,CCDirector首先设置了eglView。

在里面设置一些默认参数,开启Alpha,开启深度缓存,设置3d透视矩阵,里面全是熟悉的opengl函数,这玩意看着亲切glEnable(GL_BLEND);glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);,还有这东东:glClearDepth(1.0f); glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);,设置矩阵时有一个魔数,估计是经验值, m_obWinSizeInPixels.height / 1.1566f,这个1.1566f不知怎么来的,反正后面是glLookAt设置相机Z坐标的东东,glViewport之类设置视口,直接上代码

    glMatrixMode(GL_PROJECTION);

              glLoadIdentity();

              gluPerspective(60, (GLfloat)size.width/size.height, 0.5f, 1500.0f);

                   

              glMatrixMode(GL_MODELVIEW);   

              glLoadIdentity();

              gluLookAt( size.width/2, size.height/2, zeye,

                             size.width/2, size.height/2, 0,

                             0.0f, 1.0f, 0.0f);

接着清颜色glClearColor(0.0f, 0.0f, 0.0f, 1.0f);,显示帧率,用到了CCLabelTTF,这个继承于CCSprite,这个源码以后重点解析,我猜测是CCLabelTTF里存储了文字,并用FreeType库光栅化文字为图片变成精灵贴上去的。

继续往下,更新缩放因子,接着事件分发器构造,又一个单例,初始化事件分发器,事件处理源码分析时再解析,把事件分发器交给创建的主窗口,设置接收事件。好了setOpenGLView结束。

设置显示帧率,设置帧间隔<以前没注意CCDirector的单例是其CCDisplayLinkDirector子类>,设置帧间隔这儿停止动画,动画开始,获取时间,获得时钟频率,设置。



创建用户Scene的Layer,(这儿调Scene的Init(),以及用户Layer的init——例如放ccsprite进去),接下Run的工作是把Scene压入栈中,并再次设置动画开始,获取更新时间,初始化结束。

你可能感兴趣的:(cocos2d)