您的位置:首页 > 其它

动手实现2d游戏引擎(一)

2016-04-17 23:28 543 查看
本人准备分析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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: