动手实现2d游戏引擎(一)
2016-04-17 23:28
543 查看
本人准备分析cocos2dx的引擎·实现一个2d引擎名字叫gl02
git地址:https://github.com/1179432578/gl02.git
下面是引擎一些基本类,后面会根据需要进行修改。
CCNode:引擎节点基类,它的代码如下,它的核心方法visit是渲染节点的入口,它会先处理zorder小的子节点,然后调用自身的draw方法渲染自己,在处理zorder大的节点,这样子zorder大的就会后渲染,并且可以覆盖zorder小的节点。它的主要代码有计算节点的变化矩阵,后面会有章节专门分析变换矩阵。
CCDirector:导演类,主要负责进入游戏循环入口、场景切换、绘制场景的每一帧,代码如下,后面会逐步扩展。
main.cpp如下
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; }
相关文章推荐
- php中数组模拟队列、栈的函数以及数组指针操作
- 如何新建Quartus工程—FPGA入门教程
- 1001—Can you solve this equation?
- 威佐夫博弈
- 介绍一个性能飞快的移动端滑屏组件iSlider.js
- NSOprationQueue 与 GCD 的区别与选用
- 20159315网络攻防实践第七周总结
- IOS开发中重写init方法使用需谨慎
- CSS中margin和padding的区别
- Winform图片拖拽与缩放
- androidpn(安卓信息推送工具)
- Sql server存储过程中常见游标循环用法
- .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow
- 20145101 第二次实验报告
- 20145101 《Java程序设计》第7周学习总结
- iOS函数式编程的实现 & 响应式编程
- openGL编程模板
- 搭建Modelsim SE仿真环境-使用do文件仿真
- 周活动总结表 4/16
- PCL--pcl_openni_viewer打开xtion失败