游戏引擎教学版软件的开发研究

2018-05-28 11:10谢景明钟闰禄
电脑知识与技术 2018年9期

谢景明 钟闰禄

摘要: 游戏成为了信息娱乐市场的热门,越来越多的技术人员从事游戏开发行业。本文首先对游戏引擎技术进行了概述,然后选择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