毕业设计(论文)基于j2me技术的手机游戏开发_第1页
毕业设计(论文)基于j2me技术的手机游戏开发_第2页
毕业设计(论文)基于j2me技术的手机游戏开发_第3页
毕业设计(论文)基于j2me技术的手机游戏开发_第4页
毕业设计(论文)基于j2me技术的手机游戏开发_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

中山大学南方学院2010届本科生毕业设计PAGEI中山大学南方学院2010届本科生毕业设计中山大学南方学院装订中山大学南方学院装订线本科生毕业论文(设计)题目:基于J2ME技术的游戏开发系名:电子通信与软件工程系专业:06级计算机科学与技术专业学号:姓名:指导教师:二○一○年五月摘要三号黑体加粗三号黑体加粗随着移动通信技术的发展和无线数据业务的进步,已被赋予了除通话以外的其它许多功能。全新的游戏领域已逐渐聚焦了众多软件开发商的目光,游戏开发者和游戏玩家将共同面临这个振奋人心的游戏新境界。J2ME(Java2MicroEdition)作为Java技术专为消费嵌入式系统定制的版本,目前已经成为移动通讯设备的主流开发平台。基于J2ME平台能够方便地利用各种Java技术在上实现许多复杂的功能。但是开发游戏由于受到设备的制约,需要解决许多关键问题:1.在设备这样受限的环境中,如何让背景图像以及每个角色动作显示的形象逼真,用普通的台式机的处理方法显然是不行的。2.移动设备固有的资源都非常宝贵,但游戏常常会用到很多的图片、动画、场景、声音等数据文件,如何有效使用有限的资源、如何组织游戏本身资源,提高系统的整体性能,是游戏开发中需要解决的关键问题。本系统基于J2ME平台开发,实现了一款操作简单并有一定可玩性的完整2D(二维)版A-RPG(ActionRolePlayingGame)游戏。本文的主要工作集中在:1.阐述了游戏的背景和发展趋势,详细分析了开发应用软件所需的关键技术—MIDP(MobileInformationDeviceProfile)的体系结构和此架构中的关键技术。2.在分析游戏开发特点的基础上,总结了游戏开发及部署的一般流程,设计并实现了一款A-RPG游戏—枫际神话。3.分析研究了游戏开发中的关键问题:在J2ME技术基础上,应用卡马克算法,实现对地图模块的优化处理,使背景图像形象逼真,提高了游戏的质量。4.分析了现有的移植解决方案,总结出了一套有效的移植方法,提高了游戏质量和开发的效率。关键词:J2ME;卡马克算法;MIDP;A-RPGIIABSTRACTAsmobilecommunicationtechnologyandadvancesinwirelessdataservices,mobilephonecallhasbeengivenotherthanthanmanyofthefeatures.Thenewmobilegaminghasgraduallyfocusedtheattentionofmanysoftwaredevelopers,gamedevelopersandgameplayerswillbefacingthegameinthisexcitingnewrealm.

J2ME(Java2MicroEdition)Javatechnologyasanembeddedsystemforconsumerversionsofcustomized,mobilecommunicationdeviceshasbecomeamainstreamdevelopmentplatform.BasedonJ2MEplatformcaneasilyuseavarietyofJavatechnologyonmobilephones,manycomplexfunctions.However,inmobilegamedevelopmentconstraintsduetomobiledevices,needtoaddressmanykeyissues:

1.Mobiledevicessucharestrictedenvironment,howtomakethebackgroundimage,andeachroleisshowninvivid,withacommondesktopapproachisclearlynotacceptable.

2.Mobiledevicesareveryvaluablenaturalresources,butthegamewilloftenusealotofpictures,animation,scene,sound,anddatafiles,howtoeffectivelyusethelimitedphoneresources,howtoorganizethegameoftheirresourcestoimprovetheoverallperformanceofthemobilephonesystem,isthegamedevelopersneedtoresolvekeyissues.

ThesystemisbasedonJ2MEplatform,achieveasimpleandcompletecertainplayability2D(twodimensional)versionofA-RPG(ActionRolePlayingGame)MobileGame.Mainfocusofthisarticle:

1.Describesthebackgroundanddevelopmentofmobilegamingtrends,detailedanalysisofthedevelopmentofmobileapplicationsoftwarekeytechnologiesneeded-MIDP2.0(MobileInformationDeviceProfile)architectureandkeytechnologiesinthisframework.

2.IntheanalysisofthecharacteristicsofmobilegamedevelopmentbasedonthesumofthemobilegamedevelopmentanddeploymentofageneralprocessdesignandimplementationofanA-RPGGames-MapleInternationalmyth.

3.Analysisofthemobilegamedevelopmentakeyquestion:basedonJ2MEtechnology,applicationCarmackalgorithm,toachieveoptimizationofthemapmodule,sovividbackgroundimagesimprovethequalityofmobilegames.

4.Analysisofthemigrationofexistingsolutions,Keyword:J2ME;Carmackalgorithm;MIDP;A-RPGIII目录摘要 IABSTRACT II第1章绪论 11.1研究背景 11.2游戏国内外发展现状 11.3研究内容 31.4论文内容及安排 31.5本章小结 4第2章应用开发环境的选择和相关技术 52.1开发的主流技术 52.2选择J2ME的原因 5开发环境的介绍及配置 6开发环境 62.3.2WTK的介绍和配置方法 62.3.3Eclipse和EclipseME的介绍和配置方法 9使用Eclipse搭建J2ME开发平台 92.4本章小结 12第3章枫际神话游戏方案设计 133.1设计需要考虑的因素 133.2设计目标 143.3游戏介绍 153.4游戏背景 15游戏模块 153.5.1游戏的主要模块 153.5.2游戏的总体框架 16游戏的基本流程 17本章小结 17第4章枫际神话游戏程序设计与具体实现 19本程序需要解决的主要技术问题 19程序的结构以及流程 19游戏的架构 21本程序中用到的相关技术 214.4.1低级用户界面 214.4.2卡马克算法 23IV4.5优化程序设计 264.5.1对象的生成和大小调整 274.5.2优化内存的使用 274.645度角A-RPG游戏的实现 284.6.1地图模块的实现 284.6.2游戏动画模块的实现 294.6.3游戏碰撞检测模块的实现 304.6.4键控模块的实现 314.6.5主角模块的实现 334.6.6敌人模块的实现 334.6.7游戏主绘制模块的实现 344.7本章小结 36第5章测试 375.1测试方案 37混淆打包 37关于混淆器 37混淆器的配置 37打包 385.3发现的BUG 405.4寻找问题来源 405.4.1设备的差异 405.4.2引发的问题 415.4.3解决方案 415.5未完善的功能 425.6本章小结 42第6章总结 43致谢 44参考文献 45PAGE45第1章绪论研究背景在信息社会中,及其他无线设备越来越多的走进普通百姓的工作和生活,随着信息网络化的不断进展,及其他无线设备上网络势在必行。但是传统存在以下弊端:1.传统出厂时均由硬件厂商固化程序,程序不能增加、删除,有了错误也不能更新、修改,若要增加新功能必须另换一部。2.传统访问互联网是通过WAP(WirelessApplicationProtocal),所有网络资源必须接通网络才能在线访问,非常耗时、费用亦很高。而Java技术在无线应用方面的优势非常明显:1.应用程序可按需下载,而不是购买由硬件商提供的套件,可升级空间大。2.Java技术提供了一个类库,它使的应用开发商可以创建更为直觉、丰富的用户界面(GUI)。3.Java技术使网络带宽的应用更为有效,因为应用程序可以下载到器件上,并在本地运行,仅仅是在连接到服务器时才会占用网络带宽。基于以上分析,Java将是未来的发展方向,是业界的热点。1.2游戏国内外发展现状[1]。在欧洲,已经初步形成了一个规模庞大的行业市场。与欧美相比,日韩游戏市场已逐步走向成熟。以2002年为分界,全球游戏业务发展可分为两个阶段,之前移动游戏处于起步阶段,之后步入了大发展阶段[2]。其实游戏业务最早发端于欧洲,但是欧洲运营商却没有把握好游戏市场发展的大好时机。日韩运营商较早认识到了游戏的价值,并借助国内信息产业飞速发展的机会,铺设了高速的移动数据传输网络并开始提供高性能的终端,并创造了运营商与游戏提供商之间良好的合作模式,日韩的游戏市场因此迅速发展起来。日韩还涌现了众多实力强劲的游戏内容提供商,如日本CYBIRD和韩国ComZUs,而传统的游戏厂商如世嘉和索尼在一开始就加入了游戏内容提供商的行列。2002年以后,欧洲的运营商意识到了游戏市场的广阔前景及其自身与日韩运营商之间的差距,开始急起直追,游戏市场日渐活跃[2]。◆日本日本在游戏领域占据了绝对的领导地位。1999年,包括北美在内的很多国家和地区对游戏还一无所知时,日本就已拥有超过30万的游戏用户,占全球游戏用户的70%以上[3]。日本在游戏领域走在世界前列的主要的原因是:其一,日本拥有庞大的移动数据业务用户群。经过近年来的不断发展,到2004年6月底,日本移动用户数已经达到8270万,其中7000万以上的用户使页用移动数据业务[3]。NTTDoCoMo的i-mode(它代表着information-mode,是一种移动服务)业务是世界公认的经营最成功的移动数据业务。而游戏作为其中的一项业务,拥有广泛的用户群。其二,日本是传统的电子游戏大国。世界传统游戏市场的巨头索尼、世嘉和任天堂都在日本,他们手中掌握了丰富的视频游戏和PC游戏资源,都可以转化为游戏产品。2004年,NTTDo2CoMo推出了新一代FOMA,具有更强大的“i-appli”(Java)游戏功能。新一代FOMA,把软件存储区域和数据保存区域(高速缓存)的总容量提高到230k的2倍以上,从性能上看已经超过了任天堂GBA掌机[3]。随即日本著名的PC游戏厂商SQUARE-ENIX宣布面向新一代FOMA,开发《勇者斗恶龙》和《最终幻想》游戏的移植版。这说明,随着日本功能的升级和无线宽带网络数据承载能力的提高,游戏已经对高端的游戏厂商产生了强大的吸引力,游戏已不再是简单游戏的代名词。◆欧洲欧洲很早就推出了游戏业务,但在2003年以前,欧洲游戏市场还主要停留在SMS和WAP游戏时代[3]。与日本相比,欧洲的游戏市场相对滞后。欧洲游戏产业发展滞后的原因主要表现在以下三个方面。第一,移动终端的问题。由于欧洲运营商和厂商之间没有深层次的合作,他们并没有采用类似日本NTTDoCoMo那样的定制生产模式,而是普通的采购关系。这就导致在新业务推出的时候,相应的终端生产往往会滞后一段时间,从而成为制约瓶颈。第二,运营商封闭的数据业务模式阻碍了游戏提供商进入市场。在欧洲传统的移动数据业务模式中,游戏提供商必须向运营商支付租用网络的费用。这一费用对于刚刚出现的实力还很薄弱的游戏提供商来说难以承受。第三,欧洲国家众多、文化多元,游戏在传播上存在语言等方面的障碍。随着移动数据业务的不断发展和市场压力的不断加大,欧洲移动运营商已认识到改善游戏市场环境的必要性和紧迫性。在终端问题上,欧洲的运营商开始直接引入日韩的高端,打破了传统欧洲市场为欧洲厂商垄断局面;在经营模式上,他们也采取了开放的数据业务经营模式。比如Vodafone公司就推出了VodafoneLive!,通过合作分成的模式鼓励游戏开发商的积极参与。也有公司直接引入日本imode的运作模式和游戏内容。这些举措大大推动了欧洲游戏业务的发展。到2003年年底,欧洲游戏市场的环境已基本成熟,Java在欧洲已经十分普及,还出现了像N-Gage这样的专用游戏终端[3]。◆中国根据国内最大的移动服务提供商中国移动通信公司网站日前公布的一组数据显示,目前中国移动的用户数量已经超出了美国全国总人口数量。中国移动通信公司的用户数量达到了已经超过美国的总人口数量。中国现在有着3亿多的用户,即使只有10%的用户每月只下载一款游戏,也足以使其形成一个规模庞大的产业。但是日前仅有不足1%的用户下载过游戏,这使得这块被无数人看好的市场并没有达到和人们预期相吻合的水平。可以说,游戏目前在中国只能算是初期阶段。1.3研究内容随着的普及和无线网络的发展,在上的应用程序也越来越多,需要为人做的事情也就越来越多,怎么样才能真正方便快捷地让为我们服务,那就需要对进行深入的研究,解决在应用开发中所需要解决的问题。本文研究的主要内容有:1.资源受限设备和无线数据应用平台的特点解释了资源受限设备和无线数据应用平台的一些基本概念和特点;研究了目前比较流行的无线应用开发技术J2ME,充分说明了J2ME技术的美好前景。2.MIDP技术的特点包括MIDP的体系结构和MIDP的描述与配置,并运用MIDP技术对枫际神话游戏的架构进行了分析。3.卡马克算法的研究与实现研究卡马克算法的原理用以寻找枫际神话游戏中所面临的问题的突破口,并运用卡马克算法对该游戏的地图模块进行优化,以突破资源受限的限制,提高游戏质量。4.游戏的移植研究游戏移植中所要需要面临的问题,并归纳总结出一套移植方法,对解决各种不同平台的移植问题提出解决方案。1.4论文内容及安排本论文是在研究分析国内外游戏发展状况的基础上,通过使用J2ME语言,采用Eclipse作为开发平台,WTK作为开发工具,实现各子系统,保证系统的正常运行。包括友好的界面设计、提示信息的显示、有一定的机器智慧和可玩性、游戏过程的正常运行、游戏的正常退出等主要功能。本论文结构安排如下:第1章绪论。主要介绍本课题的研究背景、国内外的研究现状、简要阐述了游戏的特征及作者所要研究的内容和主要做工作。第2章应用开发环境的选择和相关技术。主要介绍游戏开发的主流技术,根据需求确认并配置本项目的开发环境。第3章枫际神话游戏方案设计。首先说明枫际神话游戏背景、游戏模块,然后介绍其流程得设计。第4章枫际神话游戏程序设计与具体实现。主要介绍MIDP的体系结构和关键算法—卡马克算法以及各关键模块设计与具体实现。第5章游戏测试。介绍如何进行混淆打包,并且介绍在测试游戏中出现的各种BUG及解决方案和未完善的功能。最后是总结,总结全文并指出自己将来的研究方向,进行研究工作的展望与设想。1.5本章小结第1章中介绍了在无线应用方向的背景和国内外当今概况,提出了本文将要研究的主要内容,最后对本文的章节安排进行了简要的阐述。第2章应用开发环境的选择和相关技术下面将对开发中用到的主流技术J2ME进行介绍,解释为什么选择J2ME这门技术,以及对开发环境和开发环境中所用到的工具进行介绍和配置,对所用到的相关技术进行说明。2.1开发的主流技术随着无线应用与嵌入式系统愈来愈受到人们的重视,Sun公司推出了J2ME平台(Java2PlatformMicroEdition,Java2微型版)来迎合这一未来的发展趋势。J2ME是在1999年6月的JavaOne大会上正式被提出的,是Sun公司专门为小型的、资源受限的消费性电子设备的应用程序开发所提供的Java版本[4]。目前J2ME还没有能够全面地渗透到各种嵌入式设备中,而且目前最大的用途就是一些游戏。在游戏方面,J2ME平台被认为是主流的游戏开发平台之一,它被开发者、设备制造商、网络通信公司和消费者广泛接受。但是J2ME的用途绝对不止这些,J2ME应用的发展有赖于各种硬件厂商提供的支持。2.2选择J2ME的原因到目前为止,上的应用软件开发几乎都是基于J2ME平台的。这是因为,首先,随着无线Internet新应用的出现,软件的需求越来越大,但是如果使用C语言和专有的实时操作系统,不仅开发速度慢,而且没有动态加载应用程序的能力,导致上的应用程序开发很困难。一方面,单纯依靠厂商自身的软件开发能力难以满足市场的需求,另一方面广大的软件开发商却又无法参与进来,这无疑极大地制约了新应用的推广与普及。其次,目前的访问Internet只能通过WAP(WirelessApplicationProtocol)方式,而且只能访问WML(WirelessMarkupLanguage)网页,而不是主流的HTML网页,也不能显示复杂的图形格式,此外,WAP采用的Brower/Server方式访问Internet,能提供的功能很有限,并且,因为现有的WAP解决方案不够智能化,又不能访问本地存储区,如果进行在线交易会增加服务器负荷,使服务器的反应速度变慢,使无线Internet的应用受到很大的限制。J2ME的出现则使上述问题迎刃而解。因为J2ME是基于Java语言的,所以它天生就具有以下优点:1.动态内容传输。新的应用、服务和内容可以通过不同类型的网络动态下载。2.安全。类文件校验、明确定义的应用程序编程接口和安全组件确保了第三方应用程序的行为是可靠的,不会对设备或者网络造成损害。3.交叉平台的兼容性。标准化语言组件和库意味着由于支持J2ME配置和描述所带来的约束使应用和内容可以在不同设备之间灵活地传输。4.离线获取。不用激活网络连接,应用就可以被使用。这种特点降低了传输费用,减轻了可能的网络故障带来的影响。基于J2ME的游戏设计与开发5.一种功能强大的现代面向对象的编程语言。Java相对于当前用于无线软件开发的编程语言和工具来说具有更加完善的抽象机制和更高级的程序构造,这使得应用开发更加有效。6.巨大的开发者团队。据估计,在全球有超过300万的Java软件开发者[5]。这些特性使第三方软件开发商可以很容易地介入应用程序的开发过程中,并且可以很方便地将应用程序安装到上。开发周期大大缩短,而且还能支持应用程序的动态下载和升级。J2ME提供了协议支持,使能以PC机使用的Client/Server方式直接访问Internet上的全部信息,此外还能访问本地存储区,提供最高效率的在线交易。将J2ME技术应用到上绝不是强制的,最重要的一点是这种应用是通过补充现有的技术和标准循序渐进地完成的,而不是同这些现有的技术和标准竞争。J2ME并没有为无线设备定义一个新的操作系统或者一个完整的系统软件集合,它只是定义和标准化了一种可移植的无线应用开发环境,主要是针对第三方软件开发商,将设备软件开发向第三方开放,这个环境可以灵活地附加到设备制造商开发的已经存在的软件和硬件之上,并且不会对已经存在的系统软件造成影响。开发环境的介绍及配置开发环境根据以上的分析,本小组决定使用如下环境进行开发:操作系统:MicrosoftWindowsXPSP3程序语言:Java开发包:Java(TM)2StandardEdition(1.6)SunMicro.J2MEWirelessToolKit(WirelessToolKit)IDE:EclipseSDK2.3.2WTK的介绍和配置方法Sun公司为J2ME标准的制定和发展作了大量的工作,其中WTK(无线通信工具包)是Sun公司提供的一个MIDP应用程序开发包,它是最常用的J2ME开发工具之一。下面将介绍J2MEWTK的安装,配置和使用方法,我们选用的是WTK2.5.2版本。由于J2MEWTK只是一个编译和模拟工具,而不是一个完整的IDE(集成开发环境),所以在后面会介绍在安装WTK2.之前,先尽量卸载这个软件的其他任何版本。我们将从上下载WTK2.,然后双击安装程序图标,按照下面几个步骤正式开始安装:1.首先经过解包和准备阶段,安装软件进入WTK2.的安装向导起始界面,如图2-1所示,单击“下一步”按钮开始安装。图2-1WTK安装起始界面2.接下来安装软件会提示许可证协议,如图2-2所示,单击“接受”按钮,接受所有条款。图2-2sun公司条款3.选择Java虚拟机的位置(当然事先已经安装了JDK),安装程序会自动寻找,然后显示出当前虚拟机所在路径,如图2-3所示,如果没有找到则提示推出安装程序。如果装有多个虚拟机,单击“浏览”按钮可手动选择需要的虚拟机。WTK2.的版本需要J2SDK或更高版本才行。图2-3选择JDK路径4.选择好虚拟机后,单击“下一步”按钮,进入WTK安装位置的选择屏幕,单击“浏览”按钮更改默认的安装位置,这里把它安装在C:\WKT2目录下,如图2-4所示。图2-4WTK安装路径5.确认所作的安装设置,单击“下一步”按钮,安装程序开始复制文件,直到安装成功,这样安装WTK就完成了。2.3.3Eclipse和EclipseME的介绍和配置方法Eclipse是一个开发源代码的、基于java的可扩展开发平台。Eclipse相关的许可证是大多数基于CommonPublicLicense(CPL),CPL是一个为OpenSourceInitiative(OSI)所认可的许可证。由于EclipseFoundation的建立,Eclipse的许可证将逐渐趋向于使用EclipsePublicLicense(EPL),EPL是一个与CPL相类似的许可证,正在进行OSI的认证工作。作为当今最流行的java开发IDE之一,java社群使用Eclipse以及基于Eclipse技术而来的IBMWebsphere的开发者已经超过了半数。Eclipse本身只是一个框架和一组响应的服务,并不能够开发什么程序。在Eclipse中几乎每样东西都是插件。同时各个领域的开发人员通过开发插件,可以构建与Eclipse环境无缝集成的工具。eclipse的发行版都已经带有最基本的插件,方便了开发人员。因此,除了搭建移动开发环境之外,也可以下载Jsp插件、Tomcat插件、Jboss插件来进行整合,以用于JSP、J2EE的开发。EclipseME作为Eclipse一个插件,致力于帮助开发者开发J2ME应用程序。EclipseME并不为开发者提供无线设备仿真器,而将各厂商的实用仿真器紧密连接到Eclipse开发环境中,为开发者提供一种无缝统一的集成开发环境。在上可以免费下载到EclipseME。下面我们将不介绍Eclipse的安装过程,我们直接介绍怎么部署Eclipse来开发J2ME。2.3.4使用Eclipse搭建J2ME开发平台1.启动Eclipse,再选择Help->SoftwareUpdates>FindandInstall命令,将会出现如图2-5所示的对话框,我们在这里选择Searchfornewfeaturestoinstall,然后单击Next按钮。图2-5添加插件界面2.选择NewArchivedSite将EcilpseME插件导入其中,出现如图2-6所示对话框,选中eclipsemefeaturesite.zip,然后单击Finish按钮。图2-6选择添加EclipseMe3.进入选择安装协议如图2-7,选择接受所给的条款,然后单击Next按钮,直到出现InstallAll,单击该按钮,正式安装。图2-7安装协议4.接着进入安装完成界面,点击Finish完成安装,根据提示重启Ecilpse,打开Windows->Preferences,可以发现有J2ME的选项,如图2-8所示,则EclipseME插件安装成功。图2-8插件安装检查5.接着选择J2ME->DeviceManagement,点击Import按钮,进入到ImportDevice选择界面,然后选择WTK的安装目录,单击Refresh按钮,出现如图2-9所示的图片。图2-9选择模拟器界面6.点击Finish按钮,返回到DeviceManagement的界面如图2-10所示,点击OK按钮,完成WTK的配置。图2-10WTK配置界面2.4本章小结第2章介绍了游戏开发的主流技术—J2ME及选择该技术进行开发的原因,最后介绍本程序使用的开发环境及其相关工具的原理和使用方法。第3章枫际神话游戏方案设计下面主要讲枫际神话游戏设计中需要考虑的问题,并根据该问题提出设计目标,然后对整个游戏的故事背景、游戏模式和游戏模块进行介绍,最后将解释游戏的整个流程。3.1设计需要考虑的因素移动的发展日新月异,如果试图跟上每款新式的移动的技术规范,那是不切实际的。做如此的设计与开发,只能使开发和维护的成本大大的增加。因此,我们所作的工作应该是在广泛的通用的平台上构建游戏。J2ME平台为游戏的开发提供了一个广泛而通用的平台,但是在开发时仍然有很多因素值得去考虑。1.移动的有限处理能力现在绝大多数的都支持J2ME平台,但是基本上只能提供非常有限的处理能力。移动的处理能力不足,这一点在很大程度上限制了游戏开发者所能提供的游戏类型。在目前,大多数都采用德州仪器(TI)、英特尔(Intel)或者三星(Samsung)所生产的CPU,且芯片大多数为TIOMAP850、IntelPXA272或者SamsungS3C2442,其中TIOMAP850被运用得最为广泛,这三大处理器的工作频率分别为195MHz、416MHz以及400MHz(工作频率指的是1秒内发生的同步脉冲数,用来表示CPU的运算速度)[5]。从上面的数据可以看出,虽然在移动的不断更新中,其处理能力也得到了加强,但是相对于台式机芯片的处理能力还是有很大差距。所以从移动的硬件来看,其处理能力还远远不能够满足处理复杂的游戏应用程序的要求。2.受限的存储器移动等使用嵌入式技术的设备的存储能力一般有限,存储区分为ROM和RAM,其中ROM主要是装载的操作系统和常用的软件,对程序设计来说没有多大意义。通常是在RAM中运行实际的操作系统和软件,对于运行J2ME平台的,即使可用的RAM可能有几个MB,但是提供给J2ME运行的可能就几十至上百KB而已。比如说支持的,大部分仅支持JAR不超过64K的程序;而大部分支持MIDP的,所支持的应用程序一般也不超过256KB。正因为如此,对于J2ME程序的运行,需要特别注意的存储空间问题。3.数据传输速度基于J2ME的游戏设计与开发对于单机版的游戏来说基本不会存在这个问题,只要从服务商那里下载到里后运行即可。可对于网络游戏来说,网络上的数据传输速度是游戏成功的关键之一。现在支持J2ME的,除了3G以外,有CDMA和GSM两种规格。在中国目前的运营商中,CDMA才有了接近于3G的CDMA1X技术,峰值传输速率可以达到[6],而GSM采用GPRS技术,可以达到的峰值速率[6],一般来说只要支持上述两种技术的,都可以使用Internet。而传输带宽在一般情况下,CDMA1X可以达到120Kbps左右,而GPRS只有40Kbps左右。这给通过网络进行传输数据的网络游戏的开发带来了很大的制约。4.移动的可视屏幕尺寸有限移动的可视屏幕都不是很大。除此之外,对于开发者来说,还有一点比较头痛的事情就是没有一个“标准”的可视屏幕的大小,全都依赖于所开发游戏的目标移动的可视屏幕大小。型号的不同,往往意味着可视屏幕大小的不同,也意味着处理的增加。对于特殊型号的移动所定制的图像和代码在适应性和可移植性上就显得很差了。5.颜色对于屏幕的色彩来说,同一个色彩在不同的上表现也不相同,这个依赖于硬件的颜色表。为了达到最大的视觉冲击力和表现效果,应尽量使用基本的颜色而不使用各种渐进色。由于移动的内存比较有限,所以在表现颜色方面必须小心,才能用较少的内存来完成工作,资源文件的大小也要小心控制。6.音效问题移动的音效在逐步的提高,但其表现力还是不能令人满意。在游戏中音效的表现及控制也是要注意的。尤其是对于当前的J2ME平台上的游戏应用来说,声音的表现力是一个软肋。在控制方面的代码编写上,也时常令人头疼。7.移植性问题对于不同的移动所提供的能力,移植问题也是要多加考虑的。对不同标准、不同协议的支持,可视屏幕的大小不同,诸如此类的问题都是要在开发中注意的。8.按键问题对于移动的使用者来说,同时按键和连续按键都是习惯的操作手法。当前的移动对于同时按键是不提供支持的,对连续按键的支持也要游戏的开发者特殊处理。3.2设计目标基于移动的硬件条件(尤其是其处理能力和物理内存)以及J2ME平台的枫际神话设计与实现特性,需要实现以下目标:1.可用性2.模块化设计3.可移植性4.易测试性5.性能良好3.3游戏介绍此游戏为A-RPG动作角色扮演类游戏。游戏实现的主要功能:主人翁可以用手上的武器去砍杀敌人,可以和NPC对话了解任务,怪物死亡得经验并且有一定几率掉落物品,有很简单的故事情节。由于这里展示的是游戏的制作技术,游戏的策划并不是重点,本游戏内容不是很丰富,但是A-RPG游戏的简单基本元素都包含有了。3.4游戏背景中华文化源远流长。在历史长河中,梅州有过这样的一段文化史:广东古八贤之一程旼有个门徒叫韩枫,此人擅长于剑术、开锁、五行之术(金木水火土)及御风术,为了救一个叫玲珑的姑娘,他运用自己所学的武功,冲破了一道道难关,最后救出了玲珑,而他的传奇也一直成为佳话。玲珑:一个令韩枫相中,且相貌出众、擅于歌舞、琴棋书画样样精通的女子。姜欲,据说是一个蚩尤的后代,他千里迢迢从黄河边赶到了岭南,并在一次意外知道了玲珑此人,便把玲珑抓了去,并在藏玲珑的去处的地方埋伏了许多刀斧手,其中各个都是身怀绝技的高手。3.5游戏模块3.5.1游戏的主要模块本游戏主要包括以下几个模块:1.地图模块地图是供主角、NPC、敌人活动的场所,是游戏正常进行必不可少的要素之一。地图模块可以细分为地图的生成和绘制。地图绘制将对应着地图资源的图片,根据主角在地图中的位置将地图的一部分绘制在屏幕上,供主角、NPC、敌人在上面活动。2.主角模块主角模块主要包含主角的各种动作例如行走、跑步、攻击等各种不同的动作,还包含有主角对各种动作的响应机制如攻击范围、碰撞范围等。3.敌人模块敌人模块主要包含敌人所处的方位,攻击方式以及主角跟踪等不同的元素,使敌人实现智能化跟踪并攻击主角。4.系统菜单模块系统菜单模块主要包括查看主角状态、装备等信息,关闭音乐和退出游戏等功能。5.键控模块键控模块主要包括对按键事件进行处理,控制主角进行移动和下一步需要进行的动作。6.游戏主绘制模块游戏主绘制模块主要控制界面的切换和对事件进行相应的处理,调整游戏的状态并将其显示出来。3.5.2游戏的总体框架各模块之间的关系如3-1图所示:图3-1模块结构框架主角模块、敌人模块、地图模块分别处理各种的主角信息、敌人信息、地图信息,将处理好的内容交给游戏主绘制模块,主绘制模块根据当前的状态进行选择性地选择需要的数据进行显示,当游戏有变化时,主绘制模块会根据游戏的变化来进行相应的状态处理,将状态调整为当前玩家通过按键所选择的,玩家想要看到的画面,各个模块之间相互配合,完成对整个游戏的绘制和显示。3.6游戏的基本流程游戏的基本流程如图3-2所示图3-2基本流程图游戏的基本行为与电影的行为相似。首先回想一下电影,电影由一幅幅连续记录的画面组成,“一帧”代表了一副画面。在电影播放时,一帧帧画面按照一定的速度放映到屏幕上,就形成了流动的画面。如同电影一样,游戏也是视觉艺术,同样要表现运动的画面。不同的是,游戏同时也是交互艺术,游戏中的世界要根据玩家的不同选择给予不同的响应。因此,游戏在初始化后,大体上就是一个一边处理用户输入,一边按照一定的规则绘制画面的过程。同电影一样,游戏也要保持一定的渲染速度,使游戏的画面运动起来。3.7本章小结第3章主要介绍了设计中需要注意的问题并确定设计目标,以及本游戏的剧情背景,游戏的模块和各个模块之间的关系,最后简要说明本游戏的基本流程。第4章枫际神话游戏程序设计与具体实现下面将详细介绍枫际神话游戏程序设计和实现中所需要解决的技术问题,对MIDP技术进行深入详细地研究,然后整体介绍整个游戏的架构,对关键算法—卡马克算法进行深入的研究,最后对游戏的主角模块、敌人模块、键控模块、主绘制模块等模块的实现进行系统地讲解。1.因为受限制的内存,游戏程序是对程序设计思想要求很严密,往往“内存泄露”是每个程序员的噩梦。因此,其逻辑设计应当相当严谨,资源以及对象的管理与释放要考虑到非常完善,将所有可能发生的事件及意外情况考虑在设计中。2.游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,使用游戏编辑器与MIDP1.0中的API以及相关算法的结合,使得解决静态或动态、画面背景、等都有较好的解决方案,我们也使用MIDP2.0的API来为游戏加入声音,使得游戏更加有乐趣。3.游戏中地图的更新不可能用重绘整张地图来解决。那样会因为消耗太多内存而使程序挂掉,我门将使用卡马克算法来更新地图。4.Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。以上相关技术细节和整体流程将分别在以下小节阐述。MIDletsuite是MIDP应用程序的最小单位,JAM负责将内的MIDletsuite以图形化的方式呈现,让用户能够选取欲执行的MIDletsuite,一旦选取了某个MIDletsuite,操作系统就会激活KVM执行里面的MIDlet。MIDlet及相关的支持类组成了MIDP应用程序的实际内容。而每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。在MIDP规范中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。这三种状态的转换关系如图4-1所示:消减状态消减状态(Destroyed)停止状态(Paused)运行状态(Active)StartApp()DestroyApp()呼叫MIDlet的构造函数DestroyApp()PauseApp()图4-1MIDlet的流程MIDlet有三个状态,分别是pause、active和destroyed。在启动一个MIDlet的时候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(booleanunconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(booleanunconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。游戏开始后先绘制地图,并将各个对象实例化。在主程序运行的线程中,游戏中所有的对象都应该运行在同一个线程下。在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。如:主角的HP,敌人的HP,物品的掉落,与NPC对话,任务等屏幕上相关信息的绘制等。程序为需要完成独立功能的模块设置了单独的类。GMIDlet类继承自Midlet,G类继承自Canvas。载入程序后将调用G类,然后根据玩家的选择调用G中的GameState变量来切换游戏状态的来达到各种功能。的架构游戏的架构如下图4-2所示:GMIDlet-MIDlet子类GMIDlet-MIDlet子类ConstanceConstance接口GameCanvas-Canvas子类keyContral自定义键值GameCanvas-Canvas子类keyContral自定义键值Game_Hero主角类Game_Enemy敌人类Game_Hero主角类Game_Enemy敌人类Game_Action动画类Game_Action动画类图4-2游戏架构图逻辑主要在GameCanvas类中实现。GameCanvas类实现了Runnable接口和Constance接口,作为游戏主线程的执行类。此类派生自Canvas,此类还处理资源的载入,屏幕的绘制等工作。4.4本程序中用到的相关技术4.4.1低级用户界面为什么要使用低级用户界面

?MIDPUI包括了“高级API”和“低级API”[7]。“高级API”强调可移植性,它使用高度抽象的方法从而将开发者的实现细节都掩盖了。所以应用程序无法控制如何在屏幕上显示相应内容以及屏幕上的显示位置,它只能访问高级事件。“低级API”却为应用程序提供了这方面充分的控制权,并且应用程序还可以访问低级事件。如果使用设备特定的一些性能,那么低级用户API开发的应用程序就无法实现跨设备移植。低级API包括两个部分一个是Canvas(画布)类,在Canvas类上,可以进行图形操作,同时它也是低级事件的接受者;另一个是Graphics类,它可以用来提供文本和图像,并且能够实现绘制和填充图形。所以本程序主要使用的是低级API-低级用户界面。Canvas类是实现低级API的Displayable类的子类,它提供了绘制方法以及应用程序所忽略的一些低级事件处理方法。由于Canvas类的paint方法被声明为抽象方法,所以Canvas类也是一个抽象类。应用程序如果要使用,必须扩展Canvas类。在建立Canvas类的子类时,要求程序提供paint方法的实现。低级事件处理方法未声明为抽象方法,其默认实现为空,也就是说可以什么都不作。因而,应用程序无需提供每个事件处理的方法,应用程序只需要重载其感兴趣的事件处理方法即可。为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进行绘图。从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。Canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。本程序中K类就是将键代码转换位自己定义的游戏键来使用。Graphics可以提供简单的二位的二维几何绘图功能,它与J2SE中的java.awt.Graphics类非常相似。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制,GameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给Canvas的paint()函数,以便最终显示。在没有MIDP2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内将所想要画的图形画在一张预先准备好的背景上,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上。Image类提供了一个建立背景的静态方法createImage(intwidth,intheight),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用drawImage()方法将背景的数据复制到实际显示的屏幕上。这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。不过在某些MIDP的实现上已经加上了双重缓冲的支持,因此在处理前应先利用Canvas类的isDoubleBuffer()方法来判断。现在大多数都支持双缓冲。4.4.2卡马克算法卡马克算法是约翰·卡马克在1979年的时候提出的,其核心思想是把地图卷动过程中移出屏幕(不需要显示的部分)所占的区域,绘制上新的需要图块,从而实现降低内存,提高效率的目的,卡马克算法的提出不单只影响了游戏开发的进度,而且大大地提高了游戏的质量[8]。地图是在进行游戏中展现给玩家最主要的画面。移动地图的时候,就会进行重绘制地图,因为绘制地图量比较大,我们不可能重绘整张地图,画图片是很耗时的操作,能尽量的少那就尽量的少。这样能使我们的游戏流畅度很大的提高。根据这些弊端,本游戏决定用卡马克的地图算法。但也不是说这个算法就是最好的,这个要根据项目的要求和情况来确定。下面主要介绍其原理。看看如图4-3:图4-3卡马克算法原理图在讲解之前,我们先来重新看看我们拉画地图的方法。其实在我们在向右运动的时候,实际上我们是在让buffer_x向左。但是这样很消耗内存,这些都是我们很清楚的了。但是仔细观察上面这副图。如果我们把横方向的tile分为A、B、D、C、E、F这些区域的话,会发现一个规律!那就是不论我们怎样移动,能显示在屏幕上的区域只有固定的这么多。这样,也就是使我们改进了我们的方法,就是把显示的区域直接画到屏幕上。但是再看看这些区域,我们会发现一个问题。就是说不论怎样更新,我们能看见的地方最多就比我们的屏幕大一个Tile的宽度!反过来说,就是我们只需要比屏幕大一个Tile的图片就能在上面展示我们所有的地图场景了。但问题是怎样做才能更省事呢?再来看看下面图4-4:图4-4卡马克算法原理图到2的情况的时候你会怎样来更新呢?!整张buffer重新画一次?那样做在buffer上作画的次数还是太多了。其实从上面我们可以看出,当我们的地图从1移动到2的情况时,我们的屏幕显示的地图是B~F这一段,可是我们预留下的A部分却没有用了,所以我们现在要把这个部分利用起来。把将要更新的G部分画到A去,在画到屏幕上的时候,把A这个部分放到我们的屏幕右边。那这个就是我们这种算法的思想。在这里我们自己把他区分为更新区域和不更新的区域,把没有看见的区域更新为即将展示的区域,过程参看图4-5和图4-6。图4-5卡马克算法原理图图4-6卡马克算法原理图图4-7卡马克算法原理图在初始化之后,我们的buffer虽然只显示了屏幕大小,但是实际上是比屏幕大的,没有显示出来的部分就是我们移动后将要显示的部分。我们纪录屏幕位置的变量view_x,view_y加上屏幕宽度src_width大于我们的buffer_x+buffer_width的时候,我们左边就会有一个tile_w宽度的部分显示不了,就把这部分更新为即将显示的部分并把他画到右边,详见图4-7。这就是卡马克算法的主要思想,这样可以很大节约内存开销,绘制时间也充裕。此算法在本游戏中的具体做法我们再后面来详细解释。4.5优化程序设计J2ME程序的优化,一般来说与大多数JAVA程序的优化方式是相同的,但是由于支持J2ME的设备的限制,需要做出特别的优化。程序员的经典法则告诉我们:程序员往往用80%的时间去运行20%的代码。因此,与其努力提高所有代码的效率,不如找出代码中的瓶颈部分,使之更高效,这样会得到更高的效益。所谓优化就是优化程序的性能和执行效率。所以程序的性能,主要包括:1.运算的性能,那一个算法的执行性能最好。2.内存的分配,程序需要分配多少内存,运行时的效率和性能最高。3.启动的时间,程序启动需要多少时间。4.程序的大小,程序占据多少的存储空间。4.5.1对象的生成和大小调整充分利用J2ME提供的库函数优化程序,对J2ME程序的性能是非常重要的,关键点如下:1.尽可能地使用静态变量。如:staticWorldw=newWorld();2.不要对已生成的对象作过多的改变。对于一些类(如String类)来讲,另可重新生成一个新的对象实例二步因该修改已经生成的对象。3.生成对象时,要分配给它合理的时间和大小。J2ME中的很多类都有它的默认的空间分配大小。对于StringBuffer类来讲,默认的分配空间大小是16个字符。如果在程序中使用StringBuffer的空间大小不是16个字符,那么就必须进行正确的初始化。4.避免生成不常使用或声明周期短的对象或变量。对于这种情况,应该定一个对象缓冲池。因为管理一个对象缓冲池的“开销”要比平繁地生成和回收对象的“开销”小得多。5.只在对象作用范围内进行初始化。JAVA允许在代码的任何地方定义和初始化对象。这样就可以只在对象作用的范围内进行初始化。从而节约系统的开销。4.5.2优化内存的使用内存优化主要是为了防止内存溢出导致程序崩溃,内存优化的主要目的是减小程序运行时的内存。内存优化主要包括:代码优化和图片优化。1.代码优化在游戏中经常有不同场景的切换,如从游戏逻辑退到主菜单逻辑,对游戏逻辑对象的态度很多人会选择忘记等待垃圾回收器进行垃圾回收。实际上垃圾回收器并非是实时的。从某种角度上讲在J2ME上所有的垃圾必须由手工释放,因为除了单类型外所有对象都必须显示置空。2.程序用到的基本类型的优化对于程序中用到的基本类型来说,尽量减小类型所占用的内存,比如说能用byte的就不用int,能用char的地方,就不要用int。3.图片优化J2ME的内内存杀手无疑非图片莫属,一张3KB的PNG图片可以占用20多KB的内存。所以防止内存溢出最直接的办法就是从图片入手:(1)图片压缩。这个方法是最有效果,用Photoshop把PNG图片存储为8位色,本游戏PNG图片是16位色。再使用PngMate压缩图片。(2)图片合并。假如有多张规格一样的图片,可以把它做成一张长条图片。有两个原因:其一,这样节省存储空间和内存空间;其二,10张图片需要10个Image对象,进行10次I/O操作,浪费时间和内存。(3)图片分拆。对于单张的大图片,可能单独加载时,会发生内存溢出,这时可以把图片拆开分别加载。4.645度角A-RPG游戏的实现4.6.1地图模块的实现游戏中的效果的最直接表现就是地图,由了地图,游戏的效果就出来了一半了。因为考虑到游戏地图很大,绘制整个地图很耗时,所以我们使用卡马克算法来绘制地图,算法的基本思想在上章已说明下面是地图的绘制程序,关于程序的说明已在注释中说明。首先World类中的Init()读入HotEdit制作出来的*.map二进制文件,然后再根据*.map中数据的顺序依次读出来。如代码4-1publicvoidinit()publicvoidinit(){DataInputStreamdata=newDataInputStream("".getClass().getResourceAsStream("/hedy/tmp.map"));//载入流,再读取流}代码4-1从HotEdit中读取数据然后写出更新地图的方法,下面是向右滚动时,其他方向滚动原理一样。如代码4-2:privatestaticvoidmoveRight(){//地图向右滚动for(inti=0;i<bufferH/tileH;i++)//在缓冲绘制出更新的那部分}代码4-2更新地图然后是World中的updatamap()方法。我们把主角放在屏幕中间,根据主角的移动来更新地图。如代码4-3:publicstaticvoidupdatamap(){//根据主角的移动来更新地图publicstaticvoidupdatamap(){//根据主角的移动来更新地图if(viewX+G.screenW>bufferX+bufferW){//向右更新}}代码4-3根据主角更新地图根据卡马克算法原理,做4个方向绘制,只绘制需要更新的地方,把在缓冲画出来的4部分图拼画在屏幕上。G类中的paint()调用World类里的drawMap()来实现地图的绘制。效果如图4-7,代码4-4所示:图4-7绘制地图效果publicvoiddrawMap(Graphicsgr){//画地图,平滑移动intmX=mapX+bufferW/tileW;//绘制屏幕中显示地图在缓冲的X位置publicvoiddrawMap(Graphicsgr){//画地图,平滑移动intmX=mapX+bufferW/tileW;//绘制屏幕中显示地图在缓冲的X位置intmX=i<px?mapX+i+bufferH/tileH-px:mapX+i-px;//缓冲中的地图X位置更新。}}代码4-4绘制地图4.6.2游戏动画模块的实现除了地图,给玩家最直观的就是游戏中主角已经敌人走动和攻击的动画,效果如图4-8所示。图4-8主角攻击效果Game_Action类封装了所有动画的绘制。首先我们用HotEdit制作动画,生成*.ani二进制文件,前面我们已经讲到过。然后在Game_Action类中,将*.ani以流的形式读入,再读取出来,再绘制。主角Game_Hero类和敌人Game_Enemy类都是Game_Action的子类。如代码4-5所示:publicclassGame_Action{publicclassGame_Action{loadAnimation(StringDpng,StringDani){//读入动画流,读出数据}}publicbooleancurrentAnimation(byteNum){//用来控制当前动画}代码4-5读取并绘制动画4.6.3游戏碰撞检测模块的实现游戏中很重要的一个地方式碰撞检测,包括主角与地图的碰撞判断,主角与NPC的碰撞,以及主角与任务触发点的碰撞。可以归纳为两类判断,矩形碰撞和主角与地图碰撞。首先是主角与NPC的矩形碰撞。比如说,主角与NPC碰撞后对话,与任务触发点碰撞。这些都是矩形碰撞来判断。效果如图4-9,代码4-6:图4-9与NPC碰撞效果voidGameLoop(){voidGameLoop(){if(colliding(npcaX-4,npcaY+20,h.hX,h.hY)){//是否主角和NPC碰撞}}代码4-6判断是否与NPC碰撞矩形碰撞是计算矩形大小。都是使用到GameCanvs类中的矩形碰撞方法。此方法是用极限思想来判断的,把两个矩形不碰撞的结果取反。如代码4-7:publicstaticbooleancolliding(intaX,intaY,intaW,intaH,intbX,intbY,intbW,intbH){//结果取反}代码4-7取反下面介绍主角与地图碰撞的判断。我们在Game_Canvas类中用booleanunWalkableTiles(intri,intle)来存储地图中不可通过的地图块索引。如代码4-8所示:staticbooleanunWalkableTiles(intri,intle){//地图中不可能通过的tile}staticbooleanunWalkableTiles(intri,intle){//地图中不可能通过的tile}代码4-8设置tile然后在booleanunwalkable(intri,intle,intx,inty)中判断主角下一步是否可以通过。如代码4-9所示:publicstaticbooleanunwalkable(intri

温馨提示

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

评论

0/150

提交评论