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压入栈中,并再次设置动画开始,获取更新时间,初始化结束。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值