本人准备分析cocos2dx的引擎·实现一个2d引擎名字叫gl02
git地址:https://github.com/1179432578/gl02.git
下面是引擎一些基本类,后面会根据需要进行修改。
CCNode:引擎节点基类,它的代码如下,它的核心方法visit是渲染节点的入口,它会先处理zorder小的子节点,然后调用自身的draw方法渲染自己,在处理zorder大的节点,这样子zorder大的就会后渲染,并且可以覆盖zorder小的节点。它的主要代码有计算节点的变化矩阵,后面会有章节专门分析变换矩阵。
class CCNode{
public:
CCNode();
virtual ~CCNode();
// 遍历子节点并且call draw()
virtual void visit();
// 计算变化矩阵
void transform();
// 渲染节点
virtual void draw();
};visit()代码如下,没有实现的功能后面补充
void CCNode::visit(){
// 不可见返回
// 复制栈顶矩阵kmGLPushMatrix
// 计算变换矩阵
transform();
// 遍历zorder<0的节点visit
// draw
draw();
// 遍历zorder>0的节点visit
// 弹出栈顶矩阵kmGLPopMatrix
}CCSprite:精灵节点,可以用指定纹理进行渲染,它的代码主要是创建纹理与设置着色器,后面章节分析。
CCDirector:导演类,主要负责进入游戏循环入口、场景切换、绘制场景的每一帧,代码如下,后面会逐步扩展。
class CCDirector {
public:
//获得CCDirector实例
static CCDirector* sharedDirector();
//循环入口
void mainLoop();
//绘制场景 每帧被调用
void drawScene();
void runWithScene(CCSprite *pScene);
private:
CCSprite *m_pRunningScene;
};
main.cpp如下
void mouse(int button, int state, int x, int y){
if (state == GLUT_DOWN) {
if (button == GLUT_LEFT_BUTTON) {
}
}
}
void keyboard(unsigned char keyValue, int x, int y){
switch (keyValue) {
case 'q':
printf("EXIT\n");
exit(-1);
break;
default:
break;
}
}
void redraw(){}
// 空闲回调
void idleCallback(){
static clock_t pre = clock();
//每帧间隔t=0.016进行一次重绘
if (clock() - pre > 0.016 * CLOCKS_PER_SEC) {
pre = clock();
// 主循环,场景每帧的调用由mainLoop检查,若游戏没结束,就会调用drawScene
CCDirector::sharedDirector()->mainLoop();
glFlush();
}
}
int main(int argc, const char * argv[]) {
// insert code here...
glutInit(&argc, (char **)argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGBA);
glutInitWindowSize (640, 480);
glutInitWindowPosition (1000, 100);
glutCreateWindow ("GLO2 2D Game Enginer");
glEnable(GL_TEXTURE_2D); // 启用纹理映射
CCSprite *scene = CCSprite::create("/Users/lewis/Desktop/gl02/asset/Icon-72@2x.png");
CCDirector::sharedDirector()->runWithScene(scene);
//窗口重绘函数,这里直接提供了一个空函数。创建窗口后、改变窗口大小都会触发重绘。重绘函数为空函数会导致出现白色窗口,
//我们可以指定绘制一张背景图来消除这个问题。
glutDisplayFunc(redraw);
//空闲回调,程序空闲时就会调用idleCallback函数,它会进行游戏循环
glutIdleFunc(idleCallback);
//指定鼠标回调
glutMouseFunc(mouse);
//指定键盘回调
glutKeyboardFunc(keyboard);
//开启opengl事件循环,如果不调用,程序就会直接结束了
glutMainLoop();
return 0;
}
本文将介绍作者基于cocos2dx分析并动手实现2D游戏引擎的过程,名为gl02。主要内容涉及引擎的基础类CCNode和CCDirector。CCNode作为引擎节点基类,其visit方法是渲染的关键,通过处理zorder来控制渲染顺序。而CCDirector作为导演类,负责游戏循环、场景切换和每一帧的绘制。更多内容将在后续更新中展开。

1653

被折叠的 条评论
为什么被折叠?



