毕业设计(论文)-基于OpenGL_ES的iPhone游戏的设计与实现.doc_第1页
毕业设计(论文)-基于OpenGL_ES的iPhone游戏的设计与实现.doc_第2页
毕业设计(论文)-基于OpenGL_ES的iPhone游戏的设计与实现.doc_第3页
毕业设计(论文)-基于OpenGL_ES的iPhone游戏的设计与实现.doc_第4页
毕业设计(论文)-基于OpenGL_ES的iPhone游戏的设计与实现.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业论文(设计)题 目 基于OpenGL ES的iPhone游戏的设计与实现 学 院 专 业 年 级 学 号 姓 名 指 导 教 师 成 绩 2010年 4月 30日目录第1章 绪 论11.1 引言11.2 本论文研究内容11.3 OpenGL ES概述21.4 本论文的组织3第2章 游戏开发环境的介绍42.1 iPhone平台简介42.2 iPhone开发环境的搭建4第3章 游戏基本框架的搭建53.1 启动Xcode创建工程53.2 游戏流程框图83.3 游戏DGSprite类的实现93.4 游戏DGUInterface文件的实现93.5 游戏DiceGameApp类的实现103.6 游戏EAGLView类的实现113.7 游戏DGTexture类的实现113.8 游戏DGFont类的实现13第4章 游戏的具体实现154.1 重写DGSprite154.2 重写DiceGameApp154.3 让色子晃动起来164.4 背景音乐类DGSound的添加174.5 游戏运行效果17第5章 代码的优化18第6章 结束语19参考文献20附录21基于OpenGL ES的iPhone游戏的设计与实现摘要:随着通信技术的发展和手机的普及,手机游戏的开发技术越来越为人们所关注。本文的摇色子游戏是基于OpenGL库的运用,结合面向对象方法开发的。OpenGL ES是OpenGL的一个子集,它是专门为iPhone之类的嵌入式系统设计的。本文简述了OpenGL ES和iPhone游戏开发的相关知识,然后通过需求分析,搭建了摇色子游戏的基本框架,最后通过总体设计和详细设计论述了系统的开发和实现过程。关键词:手机游戏;摇色子;OpenGL ES;iPhoneThe Design and Development Of IPhone Game Based On OpenGL ESAbstract: Along with the development of communication and the popularization of handset, people pay more attention to the handset game technology. Based on the application of OpenGL storehouse, the development of this papers dice game is combined with the object orientation. OpenGL ES is a subset of the OpenGL. It is specially designed for the embedded system such as iPhone. This paper gives a simple review on related knowledge of the OpenGL ES and the development of iPhone game. Through the analysis of the demand, then the basic framework of dice game will be built. finally, through the design of whole system and the detailed design, the process of development and achievement will be brought forth.KeyWords: handset game; dice; OpenGL ES; iPhone第1章 绪 论1.1 引言苹果公司于2007年推出基于Mac OS X 10.5精简版的iPhone手机,iPhone自上市后就不断地创造着销售奇迹。由于iPhone是苹果公司推出的掌上通信设备,所以它有些特别,它的特别之处在于苹果公司自身的很多东西是自成一套的,是不开放,是对外界封闭的。以前iPhone只开放浏览器中程序的编写,如果自己想写一个软件在iPhone手机上运行则是不允许的,后来苹果放开了这种限制,开发人员不但可以写属于自己的程序,而且还可以将写好的程序上传到苹果的App Store中供其他人下载。开发人员可以为自己的软件定个价格,这样,其他人下载的时候就要支付开发人员一定的费用。而且基于苹果系统的原因,想要将第三方软件移植到iPhone平台上也就变得非常容易,因此越来越多的软件开发人员正加入到iPhone应用的开发热潮中。在iPhone开发中,依靠两个不同的库可以用来进行自定义绘图:Quartz 2D和 OpenGL ES。OpenGL ES是跨平台图形库OpenGL的一个子集,它是专门为iPhone之类的嵌入式系统设计的。Quartz 2D提供了很多图像绘制函数,使用起来也非常容易,但它只能用于二维的图形设计。而且尽管Quartz中的很多函数会利用硬件加速,但不能保证所有的操作都得到加速。OpenGL中则用于二维和三维的图形设计,而且它经过专门设计,与硬件的加速能力结合最为紧密,性能最好,它也非常适合用于编写游戏和其他图形密集的、复杂的程序。如果想做3D程序,就必须用OpenGL ES,如果是纯2D的游戏,使用OpenGL ES作为引擎将能获得最佳的性能,所以本论文中设计的摇色子小游戏就是基于OpenGL ES来设计和实现的。1.2 本论文研究内容本项目是根据毕业设计的要求,经过本人实践及深思熟虑后提出,是结合所学知识所作出的最终决定。本文是在了解iPhone开发流程的基础上,基于OpenGL ES搭建一个iPhone游戏平台,在这个平台之上,实现一个具体的摇色子游戏。本游戏直观易懂,使用非常方便,用户可以直接上手,而且从技术上、经济上、可操作性上都是可行的,要求也不高,所以该工程的开发是可行的。本论文主要内容包括创建OpenGL ES工程,游戏基本框架的搭建,游戏的具体实现,代码的优化等。游戏编写采用面向对象思想,将相同性质的对象抽象出来,大大降低耦合度。当应用程序启动后,按下触摸屏或晃动iPhone手机时,2个色子会快速旋转起来,色子的点数是随机变化的,色子旋转时会伴随着音乐唰唰作响。本论文设计的投掷色子游戏的功能介绍及要求如下:(1)在桌布上显示2个色子。(2)在游戏的开始界面上,有“Start”和“Help”按钮。(3)点击“Help”按钮时,要显示游戏的帮助信息。(4)点击“Start”按钮进入游戏,通过触摸屏可以操作,按下触摸屏时,色子开始摇动、旋转,松开停止旋转。(5)点击“Start”按钮进入游戏,通过摇动手机来开始投掷色子,摇动停止后,色子停止转动。(6)在色子投掷的过程中要有音乐,色子停止时,声音也停止。1.3 OpenGL ES概述OpenGL ES是OpenGL的简化版,OpenGL的英文全称是“Open Graphics Library”,顾名思义,OpenGL便是“开放的图形程序接口”。OpenGL是一种软件接口,该接口中包含大约250个函数,所以OpenGL并不能算是一种编程语言,而更类似于C语言的函数库。因为 OpenGL具有很多优点,比如体系结构简单合理、与操作平台无关、使用方便等,所以它逐渐成为目前流行的图形开发标准。但是OpenGL并没提供一些可以直接用来描述场景的高层函数,开发人员只能根据少数几个基本的图元来创建所需的模型。OpenGL ES是为满足嵌入式系统及移动平台的低功耗要求,在OpenGL的基础上进行裁剪而形成的,因此很多OpenGL方面的知识都是可以直接借鉴的。要达到在很好完成图形处理的同时降低功耗是OpenGL ES推出的主要目标。由OpenGL ES和硬件结合而实现的硬件加速性能可以用来实现非常绚丽的图像效果,目前很多高性能要求的嵌入式设备都是采用的这种方法。iPhone本身具有的图像硬件加速处理能力是很强大的,所以即便是和掌上游戏机相比,iPhone对游戏的支持也毫不逊色。iPhone手机游戏是在OpenGL ES图像处理平台之上,同时借助iPhone手机强大的图像硬件加速功能来实现游戏对画面效果以及性能的要求。1.4 本论文的组织本文共分为6章,其中:第1章 绪论;介绍了本论文研究的内容以及OpenGL ES的相关知识,主要包括OpenGL ES的发展态势及其在一些领域的应用等。第2章 游戏开发环境的介绍;介绍了iPhone平台的相关知识,搭建iPhone开发环境的方法以及采用的几种开发工具。第3章 游戏基本框架的搭建;首先介绍了用Xcode创建工程的方法,然后查看了应用程序的整个文件架构。最后通过添加一些封装或类文件来实现基于OpenGL开发的基本框架,依次实现了画图类、接口封装文件、应用程序类、子窗口类、纹理类和字体类。第4章 游戏的具体实现;基于游戏的基本框架,进一步完善代码文件,首先在画图类中添加旋转功能,然后在应用类中添加两个图片,在子窗口类中也添加了按键和加速计的响应代码,最后是背景音乐的实现。第5章 代码的优化;考虑到代码的后续调试和维护,对代码进行了优化。第6章 结束语;对论文的整个设计以及iPhone开发者从开始准备到将软件发布在App Store上所需要做的工作进行了总结,并对下一步的工作做了展望。第2章 游戏开发环境的介绍2.1 iPhone平台简介2007年,苹果公司推出基于Mac OS X 10.5精简版的iPhone手机,iPhone自上市后就不断地创造着销售奇迹。iPhone应用程序本身有着很多特殊的地方,比如:当前窗口只能有一个,只有一个主屏按键,访问受限制,有限的响应时间,有限的屏幕大小,有限的系统资源,不支持垃圾收集等等。iPhone开发所用的语言是Objective-C语言,简称OC。OC语言诞生于80年代早期,它以SmallTalk语言为基础。1988年,NeXT 公司开发出了OC语言库和开发环境。1996年12月,苹果收购NeXT,开发环境被称为Cocoa。内置对OC的支持,并结合了Xcode和Interface Builder等开发工具,成为苹果平台功能强大的开发环境。OC是C语言的一种扩展,它不仅完全支持C语言的C99标准规范,而且它还是一种面向对象的语言。Objective-C语言的源程序扩展名是.m,如果用OC写C+程序,扩展名就是.mm。写出的程序可以使用gcc编译器来编译。2.2 iPhone开发环境的搭建只有在iPhone SDK下才能进行iPhone开发,此外还有很多必不可少的条件:(1)一台运行Leopard(OS X 10.5.6或更高版本)的Mac;(2)注册成为iPhone开发人员,只有这样才可以下载iPhone SDK,注册网址为:/iphone;(3)熟悉Objective-C编程语言;(4)熟悉iPhone手机本身;(5)如果想将编写的程序下载到真机上,还需注册成为IDP会员。下载安装好iPhone SDK后,会发现其中包含了很多组件,这些组件共同构成iPhone基本的开发环境。其中有三个在开发中必备的工具:Xcode,Interface Builder和iPhone模拟器。Xcode用来写代码;Interface Builder用来设置界面;iPhone模拟器用来对程序进行调试运行。第3章 游戏基本框架的搭建3.1 启动Xcode创建工程启动Xcode,创建一个基于OpenGL ES Application模板的名字为DiceGame的新工程,出现如图3-1.1所示的工程界面,左侧主要包含工程的文件目录,Classes中存放的是类文件,为保持工程的结构清晰,创建好的类文件都存放在Classes中;Other Sources中有个.pch文件和main.m文件,.pch文件可以防止头文件的重复导入,main.m则是应用程序的入口;Resources中存放着程序运行所需要的重要资源;Frameworks文件包含了工程所用的框架库,如果需要使用新的框架库中的接口函数,就必须把框架库添加到该文件夹中;Shaders和Products都是系统有关的文件,不需要开发人员修改。右侧上部分是所选文件包含的资源列表,下部分是编辑区。从图中可看出,创建完工程的同时,系统自动创建好了一些文件,如代理类文件、子窗口文件等。图3-1.1 DiceGame的工程结构Figure 3-1.1 The engineering structure of DiceGame编译DiceGame系统工程模板,运行后会看到一个旋转着的彩色正方形,如图3-1.2所示。图3-1.2 OpenGL ES显示效果Figure 3-1.2 The effect of OpenGL ES先来看一下DiceGame的整个文件结构。首先是Window主窗口,程序运行起来后,最底层出现的就是Window窗口对象,它主要负责界面的显示与控制,通过MainWindow.xib文件来实现界面显示。程序运行开始时会先执行main函数,在main中直接跳到代理类中执行窗口显示方法,主窗口的界面控制主要在代理类文件中通过一个接口来实现。代理类文件名为:DiceGameAppDelegate.h和DiceGameAppDelegate.m。DiceGameAppDelegate.h头文件中的内容主要有:UI开发包头文件的包含,窗口类的声明,窗口指针的定义。DiceGameAppDelegate.m文件是代理类的实现文件,其中有3个方法没在头文件中声明,它们是继承父类的,被父类自动调用,这些方法要重新实现。首先在applicationDidFinishLaunching方法中设置刷屏频率为60次/秒,然后调用子窗口类函数的startAnimation方法。另外两个方法和该方法非常类似,它们会在不同的状态被调用,这样可以方便开发者对其进行特殊设置。其次就是EAGLView子窗口,子窗口一般也包括界面显示和控制,界面显示的资源文件也是xib格式,但是由于所创建的工程不是基于视图的,所以不存在xib文件。界面控制文件名为EAGLView.h和EAGLView.h,它们主要用于管理子窗口的方法和对象。EAGLView.h头文件中的内容主要有: UI和OpenGL开发包的相关头文件的包含,内部使用的缓冲区内存大小的定义,画图相关的存储区的定义,定时器变量的定义,动画的开始、停止以及刷屏的方法的声明。窗口类的实现代码中包含很多方法,比如初始化方法initWithCoder,屏幕画图方法drawView等。在开始搭建游戏框架之前,需要做一些准备。首先将两张背景图:desk0.png和desk1.png,添加到工程中的Resources文件夹内。然后将苹果公司提供的与OpenGL ES相关的参考文件OpenGL_internal.h、Texture2D.h和Texture2D.m添加到工程的Classes文件夹下。最后将图形处理用到的库CoreGraphics.frameworks添加到工程。在刚开始设计游戏时,我是直接利用这些开源的参考代码来编写游戏工程,但设计完成后发现参考文件中的接口非常复杂,很多东西都没用到,而且所建工程对平台的依赖性非常强,还存在很多冗余代码,为解决这些问题,我想到面向对象编程的思想,可以将相同性质的对象抽象出来,设计几个封装类文件,这样可以对参考文件中的接口再次进行封装,使后续的接口调用更为简洁,也可实现C、C+和OC的混合编程,减少游戏对平台的依赖性。首先创建了接口层,用来封装平台的接口,在C或C+文件中就可直接调用这些接口以实现混合编程。接下来就是添加新文件。选中Xcode左侧中的Classes,单击鼠标右键,然后添加新文件,出现图3-1.3界面,选择iPhone OS下面的Cocoa Touch Classes下的Objective-C class模板文件。图3-1.3选择模板Figure 3-1.3 Selecting template点击下一步后,输入DGUInterface.mm文件名,还需选中Also create “DGUInterface.h”选项,这样就可同时创建头文件。接下来创建画图类和应用类,画图类用来实现画图,应用类用来实现应用算法。因为这两个类选择用C+来写,所以创建时需选择Mac OS X下的C and C+,然后选C+ File。分别给这两个类取名为:DGSprite,DiceGameApp。3.2 游戏流程框图摇色子游戏的实现主要包含两个操作:游戏初始界面的显示,开始游戏时的界面显示。游戏开始时界面显示的流程图如图3-2.1所示。图3-2.1 初始界面显示流程图Figure 3-2.1 Flowchart of the initial screen开始游戏时界面显示的流程图如图3-2.2所示。图3-2.2 开始游戏时界面显示流程图Figure 3-2.2 Flowchart of the interface of the starting game3.3 游戏DGSprite类的实现DGSprite.h是画图类的头文件,因为画图类是基于OpenGL的,需要用到其中的接口函数,所以该文件中需要包含OpenGL的头文件。另外要创建一个画图类DGSprite,代码如下:class DGSpritepublic:DGSprite(GLuint textId, float textContWidth, float textContHeight, float textWidth, float textHeight); /构造函数DGSprite(); /析构函数void rend(float x, float y); /画图函数private: /定义几个私有属性值,用来存储图像参数GLuint mTextId; /用来存储图片纹理数据IDfloat mTextContWidth; /用来存储纹理图片的宽度值float mTextContHeight; /用来存储纹理图片的高度值float mTextWidth; /用来存储纹理数据的宽度值float mTextHeight; /用来存储纹理数据的高度值;DGSprite.cpp是画图类中函数实现的文件,其中头文件需包含DGSprite.h。构造函数的实现比较简单,是把创建的对象的数据存储起来为画图函数使用。析构函数则是将之前创建的纹理数据删除掉。rend画图函数则是在Texture2D中的drawAtPoint画图函数的基础上做了些简单修改,其中包括纹理的绑定,顶点坐标数组的开启,纹理坐标数组的开启,几何图元序列的构造等等,最终实现图形的绘制。3.4 游戏DGUInterface文件的实现Texture2D中有很多接口,DGUInterface文件就是用来封装其中的实现接口。设计这个文件的目的就是将通过Texture2D获得的数据参数存储在画图类中。所以在接口封装文件的头文件中要声明类DGSprite,另外还需声明一个函数DGSpriteCreate(),它是创建画图类的函数,该函数的参数是一个文件名,返回值为指向DGSprite的指针。在DGUInterface.mm中除了头文件的包含外,还有DGSpriteCreate()函数的实现方法,具体实现过程为:将接受的文件名参数转化为字符串格式,然后用Texture2D定义的一个指针指向与该字符串具有相同名称的文件,接着将该文件的数据存储到画图类的一个指针中,最后释放Texture2D指针并返回画图类指针。3.5 游戏DiceGameApp类的实现DiceGameApp类是应用程序类,主要用来实现应用程序的算法。它的头文件中除了需要包含OpenGL相关的头文件外,还需声明画图类DGSprite以及定义应用类DiceGameApp。同样的,DiceGameApp类中定义了构造函数、析构函数和一个rend画图函数,最后还要定义一个私有的画图类指针变量textBg。DiceGameApp.cpp文件则主要是对定义的三个函数进行实现,代码如下:DiceGameApp:DiceGameApp() /构造函数的实现textBg = DGSpriteCreate(desk0.png);/用desk0.png图片文件创建一个画图类,然后把返回值存储在textBg中DiceGameApp:DiceGameApp() /析构函数的实现delete textBg;void DiceGameApp:rend() /画图函数的实现textBg-rend(180.0f, 240.0f);/调用在DGSprite类中实现的rend画图函数3.6 游戏EAGLView类的实现子窗口类目前还是显示的系统默认的彩色正方形,现在要让其显示一张屏幕的背景图片desk0.png。首先在EAGLView.h声明DiceGameApp类,并定义一个应用类的指针diceApp。在EAGLView.mm文件的初始化方法中创建新的应用类,这样在后续的画图中该应用类就可以使用了。将该文件中的画图函数drawView里的绘制彩色正方形的部分代码删除,因为目前需要显示的只是一张背景图,所以代码会简化很多。在drawView函数中添加如下代码:diceApp-rend()。在drawview之前,还需要在layoutSubviews方法添加一些和Texture2D相关的设置。例如,需要在窗口设定可见区域,选择投影方式,启用颜色的混合功能,启用顶点坐标数组,启用纹理坐标数组,设置当前清除颜色等。保存文件后编译运行,会看到desk0.png图片出现在iPhone屏幕上,如图3-6.1所示。采用同样的步骤,可以显示出另一张图片。 图3-6.1 显示效果 Figure 3-6.1 Display effect3.7 游戏DGTexture类的实现本论文设计的摇色子游戏要求有动画效果,而游戏设计之初,考虑的方法是只用一个画图类来实现纹理贴图,但此方法只能实现独立图片的显示,要实现动画功能非常复杂,必须将几张图片通过不同的组合方式显示出不同的图像,才能达到预期的要求。基于此问题,想到可以创建新的纹理类文件,通过该类来获取整张图片的纹理数据,而之前的画图类的功能就可以简化,只需从纹理中获取图片数据,然后实现图形绘制。按照之前的方法与步骤,创建纹理类文件DGTexture。将DGSprint.h的代码复制到DGTexture.h中,将类名改为DGTexture,同时修改构造和析构函数,另外还需在public下添加一个bind方法及4个get方法,bind方法用来绑定当前纹理,get方法来获取纹理图片和纹理数据的宽和高。DGTexture.cpp中的bind()方法是把已命名的纹理绑定到目标纹理,代码为:void DGTexture:bind()glBindTexture(GL_TEXTURE_2D, mTextId);其他4个get方法都很简单,只是返回对应的纹理属性参数值。完成DGTexture类的代码后,原来的DGSprite类需要做些修改,现在画图类的作用只是用来画图,不必再考虑纹理数据的存储问题,所以DGSprite类中的构造函数的第一个参数修改为DGTexture类的一个指针,通过它可以直接获取所有纹理数据,构造函数中的其他参数表示所画图像在当前纹理中的起始坐标以及图片的宽和高值。DGSprite类中还增加了一个setCent()方法以及存放中心坐标的变量mCentX()和mCentY()。DGSprite类的实现文件中构造函数的实现主要包括中心坐标变量的初始化,以及纹理ID和所画图像在纹理中的起始坐标与宽高值的记录。由于纹理类的析构函数中已经删除了纹理类,所以DGSprite类中可以去掉这部分代码。rend()方法也需做相应的修改,因为用到了纹理贴图,所以需要计算纹理像素的地址坐标,同时还要调用纹理类的绑定函数,另外还需计算图片的顶点坐标,将其存放在一个二维数组中。修改完DGTexture类和DGSprite类后,还需修改DGUInterface类。只需要用DGTexture类代替之前的DGSprite类即可。接下来还需修改应用类DiceGameApp,在头文件中声明画图类和纹理类,同时定义一个DGTexture类指针textBg和一个DGSprite类指针spriteBg。在应用类的实现文件中,在构造函数中首先创建一个纹理类对象textBg,然后通过纹理类对象创建一个画图类对象spriteBg,同样在析构函数中要删除创建的纹理类和画图类的对象。DiceGameApp类中的rend方法仍然是调用DGSprite类的rend方法。3.8 游戏DGFont类的实现游戏要求需显示帮助信息,也就是需要有字体显示部分。起初的想法是将需要显示的字体做成一个图片,用贴图的方法完成显示,但这样做太麻烦,需要另外制作图片,这也不太符合本游戏的设计。后来考虑到程序中的纹理类,完全可以通过它来实现字体的显示,思路就是把每个字母看作是一个图形来处理。按照之前的方法与步骤,创建字体类文件DGFont。在编写字体类代码之前需要在Texture2D.h中添加字体处理部分,这部分代码在很多书中都可以找到,代码虽长,但功能非常单一,就是将95个常用字符做成纹理并保存起来,需要显示时便可直接调用。另外还需在DGUInterface类中添加字体的接口函数DGFontTextureCreate,它的作用就是为不同字体类型的字符创建不同的纹理类对象。字体类文件中主要有一个画字符串的方法drawString(),该方法会将所要输出的字符串中的字符在字符画图类指针数组中进行遍历查找,找到后调用画图方法来显示。字符串显示的实现方法也很简单,需要修改DiceGameApp类的代码,在其头文件中声明字体类DGFont,然后定义一个字体类指针对象mFont。接下来修改实现文件,首先要包含头文件DGFont.h,然后在构造函数中添加一个类对象,创建16号的字体,代码为:mFont = new DGFont(16);最后需要显示一行字符串,设定起始坐标为(30,100),代码为:mFont-drawString(The frameword of Iphone development,30, 100);保存文件后编译运行,会看到桌面画布上显示出了字符串“The framework of Iphone development”,如图3-8.1所示。 图3-8.1桌面画布 Figure 3-8.1 Canvas of desktop至此,游戏的基本框架就已经搭好了,接下来要做的就是游戏的具体实现,设计时会反复用到本章封装好的接口和类方法。第4章 游戏的具体实现4.1 重写DGSprite首先需要修改DGSprite,原来的画图类只是将一张图片显示在屏幕上,现在要通过OpenGL ES中的函数使图片既具有旋转功能又可以变换颜色。首先在头文件中给rend函数添加一个参数用来作为旋转角度,然后添加setColor方法,用来设置颜色,此外还需定义四个变量,用来存放颜色数据。在实现文件的构造函数中将4个颜色变量全部初始化为1.0f,此时目标图片会保持原色,setColor方法可以保存开发人员想要的颜色,而rend则会将设置好颜色的图像绘制出来。rend方法通过glColor4f函数来设置颜色,通过glRotate函数来旋转目标图像,设置成使图像沿着Z轴旋转angle角度。最后需再次调用glColor4f函数,将其参数全部设置为1.0f,用来把颜色还原。画图类修改完毕,接下来先把所需的图片都添加进来,所需图片如图4-1.1所示。图4-1.1 图片资源Figure 4-1.1 Image resources4.2 重写DiceGameApp应用类中重写的代码有些多,包括添加所有图片的纹理,添加状态等,但它们都是调用之前的接口。其中的rend方法会根据不同的状态来画图,本文设计的游戏主要是将按键和加速计的响应传递给这几个状态,进而调用画图方法来显示。目前为止已经贴好了两个图片:Start和Help,它们会被当做按钮来使用。当按键的坐标值处于所贴图片范围内时就会触发对应的事件。本论文并未采用将系统UI的按钮与OpenGL交互使用,因为那样会影响整个应用程序的效率和性能。4.3 让色子晃动起来现在点击按钮不会有任何反应,因为还没有设置触发时的状态,接下来扩展按键方法,在“点击开始”方法中的状态设置代码为:if(diceApp-getState() != 1)if (110=touchPoint.x)and(touchPoint.x =210)& (200= touchPoint.y)and (touchPoint.y updateState(1); /开始游戏的状态设置else if(110 = touchPoint.x) and (touchPoint.x =210)& (300 = touchPoint.y)and (touchPoint.y updateState(2); /显示帮助信息的状态设置elsediceApp-updateState(0);return;elsediceApp-updateState(3); /游戏正进行中的状态设置在“点击结束”方法中游戏需将状态设置为1,就是显示出摇出色子的点数。加速计中的方法和按键方法大同小异,只是判断标准不同而已。4.4 背景音乐类DGSound的添加添加背景音乐类之前,需要将AudioToolBox.framework和OpenAL.framework两个库添加到工程,同时将苹果公司已经封装好的SoundEngine文件添加到工程。新建音乐类文件DGSound,将接口文件再次封装,这样可以提供给应用类比较简洁的函数接口。音乐类文件中的很多方法都是直接调用苹果已有类的接口,函数代码基本都是用C或C+语言编写的,理解起来也比较容易。保存修改后的文件后编译运行,就可以开始游戏了。4.5 游戏运行效果可以看一下游戏的运行效果。(1) 图4-5.1为进入游戏后的画面。(2) 图4-5.2为单击Help按钮后显示的画面。(3) 触摸Start按钮进入游戏画面。此时触摸iPhone屏幕或晃动手机,游戏就开始了,会看到色子晃动画面。(4) 图4-5.3为当手指离开屏幕或手机停止晃动后,显示的色子点数。每次重新触摸iPhone屏幕或晃动手机,都会产生新的点数。 图4-5.1 初始画面 图4-5.2 说明 图4-5.3 点数显示Figure 4-5.1 Initial picture Figure 4-5.2 Help Figure 4-5.3 Points display第5章 代码的优化编写程序时,即便是有相关的文档设计,编写出的代码也难免会有很多不规范的地方,所以对代码进行优化是极其重要的。由于该工程的代码中使用数字的地方比较多,数字本身很难理解,是很抽象的概念,它会给代码的维护、后续的调试等带来诸多不便。因此需新建一个类型文件,取名为DGConst.h,该文件用来存放程序所需的常量和宏的定义。屏幕的宽和高常量的定义,代码为:#define SCR_WIDTH 320#define SCR_HEIGHT 480音乐播放状态的定义,代码为:enumSOUND_IDLE,SOUND_PLAY,SOUND_MUTE;游戏状态的定义,代码为:enumGAME_IDLE,GAME_RESULT,GAME_HELP,GAME_RUNNING;加速计使能状态枚举变量的定义,代码为:enumACCEL_ENABLE,ACCEL_DISENABLE;定义好这些常量后就可以用它们替换之前的数字,依次修改DGSprite类中使用的屏幕高度、DiceGameApp类中的数字常量、EAGLView类中触摸消息和加速计消息处理方法中的数字常量。完成代码优化后,保存并编译运行,运行结果与之前完全相同,说明代码优化并没产生其他影响,优化工作完成地很成功!第6章 结束语本论文根据游戏的需求分析,搭建游戏基本框架,编写游戏具体的代码,将运行结果与游戏功能进行对比,然后调试,最后考虑到代码的后续调试和维护,对代码进行了优化。其中第三章和第四章是游戏代码设计的关键。程序开始运行时,先执行main.m文件中的main函数,main函数非常简单,只有4行。在main中直接跳到代理类中执行application方法,对子窗口进行刷屏,刷屏显示出图像后主程序也就运行结束,后台有个守护,等待客户的操作,当客户在子窗口中产生某一操作时,对应的方法就会被调用。其实一个iPhone开发者从开始准备一直到将软件发布在手机应用商店App Store上所需要做的工作有很多,比如需要准备好相应软硬件配置,需具备面向对象编程语言的开发经验,能对软件进行设计与开发,向手机应用商店提交程序,发布后的修改与更新等等。当然,作为一个iPhone摇色子游戏,还有进一步的提升空间:1.当色子旋转将停止时,色子的旋转速度应该有个渐缓的过程。2.色子与色子发生碰撞时,应该出现碰撞的画面效果。3.色子晃动时发出的声音应该随旋转的场景,比如速度、碰撞等作相应调整。参考文献1Davidson J D.Learning Cocoa With Objective-CM.Sebastopol:OReilly,2002:43-107.2Dudney B,Adamson C.iPhone SDK Development:Building iPhone ApplicationsM.NorthCarolina Dallas:Pragmatic,1995:426-435.3Pilone D,Pilone T.Head First iPhone DevelopmentM.Sebastopol:OReilly,2002:488-501.4Piper I.Learn Xcode Tools for Mac OS X and iPhone DevelopmentM.New York: Apress, 2009: 159-205.5安杰尔.OpenGL程序设计指南M.北京:清华大学出版社,2005:45-108.6谭浩强.C+程序设计M.北京:清华大学出版社,2004:231-416.7Zdziarski J.iPhone SDK Application DevelopmentM.Sebastopol:OReilly,2009:39-113.8Mark D,Lamarche J.Beginning iPhone Development Exploring the iPhone SDKM.New York:Apress,2009:361-400.9威廉利德威尔.最佳设计100细则M.上海:上海人民美术出版社,2008:10-138.10张海藩.软件工程导论M.北京:清华大学出版社,2003:36-65.11尚游,陈岩涛.OpenGL图形程序设计指南M.北京:中国水利水电出版社,2001:215-241.12Shreiner D.OpenGL Programming Guide Seventh EditionM.USA:Person Education,2008:389-485.13孙东风.iPhone & iPad开发实战M.北京:海洋出版社,2010:35-88.附录应用类实现文件DiceGameApp.cpp中的部分代码:void DiceGameApp:drawDiceNormal(int idDice,int n)float xPos = dicePosArrayidDice.xPosDice;float yPos = dicePosArrayidDice.yPosDice;float angle = dicePosArrayidDice.angleDice;n = n%6;switch (n) case

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论