谢景明 钟闰禄
摘要: 游戏成为了信息娱乐市场的热门,越来越多的技术人员从事游戏开发行业。本文首先对游戏引擎技术进行了概述,然后选择3个代表性的游戏引擎进行对比分析,最后讨论了游戏引擎教学版软件的实现思路。
关键词:游戏引擎;游戏开发;Unity3D;Cocos2d;Libgdx
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)09-0216-02
1 游戏引擎技术概述
游戏技术已经成为信息技术的主流分支之一,越来越多的人员投入了游戏开发行业。由于游戏市场的激烈竞争,对游戏开发的周期越来越高,当前主要的手段是通过游戏引擎来进行游戏开发。游戏引擎技术对复杂的底层技术进行了封装,为程序员提供了各种功能强大的调用接口,甚至可视化的开发工具,大大降低了游戏开发的难度和時间,使开发人员能够快速地进行游戏开发。
目前市场上有众多的游戏引擎,它们当中有商用收费的,也有免费开源的;架构上有重量级的,也有轻量级的,其中Unity3D、Cocos2d、Libgdx等游戏引擎较为常见。在日常的教学中,使用教学用途的游戏引擎十分有必要,这样能够让学员系统地掌握游戏开发的有关理论知识。
2 游戏引擎技术比较
游戏技术涉及的技术领域较多,例如资源管理、网络引擎、I/O库、图形数学库、物理引擎、渲染器、声音引擎、实体模块、动画系统、场景管理、特效支持、控制逻辑框架、游戏GUI和游戏开发工具等,因此不同类型的游戏引擎所提供的功能、性能也是不尽相同的,表1选取了三个典型的游戏引擎进行对比。
3 系统实现
3.1功能介绍
游戏引擎教学版软件主要提供了12个功能模块,分别为几何体构造、颜色、视图、纹理、场景、线性代数、动画、碰撞检测、OpenGL、物理引擎、游戏演示、帮助(见图1),这些功能模块通过不同的角度,以可视化的方式展示游戏开发所需要的相关技术以及技术原理。
3.2实现代码示例
公共基础代码(配置上相关的注释):
public void reshape(GLAutoDrawable drawable, int x, int y, int width,int height) {
/*
* OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库,gl是核心,glu是对gl的部分封装,glut是OpenGL的跨平台
* 工具库, gl中包含了最基本的3D函数,而glu似乎对gl的辅助,如果算数好,不用glu的情况下,也是可以做出同样的效果。
* glut是基本的窗口界 面,是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,
* 这就保证了我们编出的程序是跨平台的, 如果用MFC或者Win32只能在windows操作系统上使用。
* 选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们可以尽量地使用glut 库
*/
final GL2 gl = drawable.getGL().getGL2();
final GLU glu = GLU.createGLU(gl);
if (height <= 0) // avoid a divide by zero error!
height = 1;
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 20.0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity(); }
//清除屏幕
public static void glClear(GL2 gl) {
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);}
特定功能代码,以绘制带有纹理的六面体为例:
public void display(GLAutoDrawable drawable) {
//采用纹理贴图
int texture = Picture.showTexture(gl, "data/WenLi.png");
final GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
//创建点,正六面体,8个顶点
float R = 1.2f;
float points[][] =new float[8][3];
points[0][0] = 0;
points[0][1] = R;
points[0][2] = 0;
points[1][0] = 0;
points[1][1] = R / 3;
points[1][2] = (float) (R * 2 * sq2 / 3);
points[2][0] = (float) (R * sq2 / sq3);
points[2][1] = R / 3;
points[2][2] = (float) (-R * sq2 / 3);
points[3][0] = (float) (-R * sq2 / sq3);
points[3][1] = R / 3;
points[3][2] = (float) (-R * sq2 / 3);
for (int i = 0; i <4; i++) {
points[4 + i][0] = -points[i][0];
points[4 + i][1] = -points[i][1];
points[4 + i][2] = -points[i][2];}
//创建对称的三维多面体顶点的索引
int[][] V_INDEX = { { 0, 1, 7, 2 }, { 0, 2, 5, 3 }, { 0, 3, 6, 1 },
{ 4, 6, 3, 5 }, { 4, 7, 1, 6 }, { 4, 5, 2, 7 } };
gl.glLoadIdentity();
gl.glTranslatef(0.0f, 0.0f,-6.0f);
//绘制六面体和纹理
float x=0.0f,y=0.0f;
for (int i = 0; i < V_INDEX.length; i++) {
for (int j = 0; j < V_INDEX[i].length; j++) {
if(j%4==0){
x=0.0f;
y=0.0f;}
if(j%4==1){
x=1.0f;
y=0.0f; }
if(j%4==2){
x=1.0f;
y=1.0f; }
if(j%4==3){
x=0.0f;
y=1.0f; }
//gl.glColor3f(red, green, blue);
gl.glTexCoord2f(x, y);
gl.glVertex3f(points[V_INDEX[i][j]][0],
points[V_INDEX[i][j]][1], points[V_INDEX[i][j]][2]); }}
gl.glEnd(); // Finished Drawing The Triangle
gl.glFlush();}
游戲引擎案例的运行结果如图2,3所示:
下面以几何体菜单为例,演示各个子模块的功能,点击子菜单项“基本三角形”,显示下图:
参考文献:
[1] 谢景明. 3D游戏引擎技术开发的研究[J].广州番禺职业技术学院学报,2009(4).
[2] Unity. 基本概况. https://unity3d.com/cn/public-relations [ EB/OL]. 2017.12.1