zoukankan      html  css  js  c++  java
  • QLGame 2d Engine 搭建2d游戏原理

                        大家好,2d引擎基于opengl(es) 3d技术,是因为这样比之前的ddraw有很多好处!

                       1.坐标采用浮点数,可以进行曲线移动

                       2.如果在ddraw的对图片进行缩放和旋转的时候,是基于点像素的操作,非常的耗费性能,而采用3d的话,做这些事情是轻而易举的工作!

                       3.是基于渲染一个panel,然后把贴图贴在panel,然后对panel,进行旋转平移缩放的操作!

                       4.2d动画是基于uv进行操作的,可以将所有的动画放在一个大的贴图中,然后不断切换uv实现的动画切换!

                       今天的工作环境配置:

                              os: win7 64bit

                              tool: vs2012

                      主要有两个内容:1.渲染方块 2.渲染贴图

                      由于我们是2d游戏,我们采用glOrtho 2d视图,进行视图设置,具有以下步骤:

                      详解:

                      glViewport()进行窗口视图设定 比如800,600

                      glMatrixMode(GL_PROJECTION);设置模型视图

                      glOrtho设置2d视图,-400,400,说明宽是800,-300,300,高是600,-100是近裁面,100是远裁面

                      由于是采用2d视图,我想游戏窗口的每一个像素,占用一个单位,这样对坐标的好,很好计算!

                     glBegin开始绘制一个几何面片,这在opengles中不被支持的方法!

                     glVertex2f是绘制点,调用glVertex2f四次,就绘制了一个panel出来

                     glClear(GL_COLOR_BUFFER_BIT);

                     glViewport(0,0,800,600);

                     glMatrixMode( GL_PROJECTION ); 

                     glLoadIdentity();

                     glOrtho(-400,400,-300,300,-100,100);

                     glBegin(GL_POLYGON);

                     GLfloat w=100;

                     GLfloat h=100;

                     glVertex2f(-w, -h); 

                     glVertex2f(-w, h); 

                     glVertex2f(w, h); 

                     glVertex2f(w, -h);

                     glEnd();

                     glFlush();

                     QQ截图20150316174536

                     下面开始贴图

                    贴图使用的是开源库 FreeImage3.17.0库,下载地址为:http://sourceforge.net/projects/freeimage/files/Source%20Distribution/

                    在FreeImage3.17.0中自带了一个对于OpenGL使用的类,叫做TextureManaged.h TextureManaged.cpp

                   FreeImage有32位和64位的版本,这里的版本对应,不是说的你的电脑系统是32bit,还是64bit的!

                   是说你的编辑器是32位的还是64位的!

                   同样的设置到包含目录中,以及链接库中,还有附加依赖项中!

                   渲染图片代码如下:

                   #include "TextureManager.h"  //注意这一句要在<glut.h>之上,否则会出错
                   #include <glut.h>
                   GLuint textures[1];
                   //显示回调函数
                   void renderScreen(void){
                      //把整个窗口清理为当前清理颜色:南瓜橙
                      glClear(GL_COLOR_BUFFER_BIT);
                      glViewport(0,0,800,600);
                      glMatrixMode( GL_PROJECTION ); 
                      glLoadIdentity();
                      glOrtho(-400,400,-300,300,-100,100);
                     TextureManager::Inst()->BindTexture(textures[0]);//在这儿进行绑定贴图
                      glBegin(GL_POLYGON);
                      GLfloat w=100;
                      GLfloat h=100;
                     glTexCoord2d(0,0);glVertex2f(-w, -h); 
                     glTexCoord2d(0,1);glVertex2f(-w, h); 
                    glTexCoord2d(1,1);glVertex2f(w, h); 
                    glTexCoord2d(1,0);glVertex2f(w, -h);
                    glEnd();
                    glFlush();
                    glutSwapBuffers();
                 }

                     void Init()
                {
                           TextureManager::Inst()->LoadTexture("./1.jpg",textures[0]);//载入贴图
                          glEnable(GL_TEXTURE_2D);//启用2d纹理
                          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);    // 线性滤波
                          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);    // 线性滤波

               }

                      int main(int argc, char* argv[])
              {

                        //初始化glut
                        glutInit(&argc,argv);
                       //单缓冲区
                        glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
                       //创建窗口,窗口名字为WindowDemo
                       glutCreateWindow("QLGameEngine");
                       //设置窗口大小
                       glutReshapeWindow(800,600);
                       Init();
                       //设置显示回调函数 
                      glutDisplayFunc(renderScreen);
                      glutMainLoop();
                      return 0;
           }

                    详解:

                   1.TextureManager::Inst()->LoadTexture("./1.jpg",textures[0]);//载入贴图

                   2.启用纹理以及使用纹理属性

                          glEnable(GL_TEXTURE_2D);//启用2d纹理
                          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);    // 线性滤波
                          glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);    // 线性滤波

                   3.   绑定贴图

                         TextureManager::Inst()->BindTexture(textures[0]);//在这儿进行绑定贴图

                  4.  设置顶点以及uv进行渲染贴图

                       glBegin(GL_POLYGON);
                       GLfloat w=100;
                       GLfloat h=100;
                       glTexCoord2d(0,0);glVertex2f(-w, -h); 
                       glTexCoord2d(0,1);glVertex2f(-w, h); 
                       glTexCoord2d(1,1);glVertex2f(w, h); 
                       glTexCoord2d(1,0);glVertex2f(w, -h);
                       glEnd();

                       运行结果:QQ截图20150316202451

                        一只可爱的小乌龟,显示出来了,呵呵!

                       我遇到两个问题需要解决:

                       1.就是乌龟的颜色发生变色了,原图是这样的

                        1

                       2.我在Debug目录下,直接启动生成的exe,可以看到小乌龟图片,但是在VS中直接运行就看不到图片,我设置了工作目录为

                          Debug的,

                          有知道如何解决这两个问题的,请与我留言,真诚想交往朋友!

  • 相关阅读:
    C#学习笔记-代理模式
    SqlDbx连接oracle
    C# 连接oracle,用32位client和64位Client,可能导致结果不同
    PHP&Java 调用C#的WCF
    DevExpress GridControl 控件二表连动
    SSAS 非重复计数
    Corn 表达式
    C# 实现Tree,包含parentId和children
    jsfiddle.net上的记录
    【慕课网实战】Spark Streaming实时流处理项目实战笔记十二之铭文升级版
  • 原文地址:https://www.cnblogs.com/alongu3d/p/4342773.html
Copyright © 2011-2022 走看看