资源描述
河北农业大学
本科毕业论文(设计)
题 目: 超级玛丽小游戏设计
摘要
《超级玛丽》全名《超级马里奥兄弟》,是任天堂公司出品的著名横版过关游戏,最早在红白机上推出,有多款后续作品,迄今多个版本合共销量已突破4000万套。其中的主角马里奥、路易、桃子公主、蘑菇王子等等已成为任天堂的招牌人物。该课题主要是模仿经典的《超级玛丽》完成相应的游戏功能。本游戏以java为主要技术核心,通过各种核心类实现了游戏中的主要人物和角色,并通过各类函数实现了地图的绘制、碰撞检测、键控、滚屏等核心功能,并对游戏进行了一系列优化,例如产生新对象,收集垃圾,对时间、空间的权衡,实现了电脑版的超级玛丽。
关键字: 超级玛丽;Java;碰撞检测;滚屏
Abstract
"Super Marie" full name "super Mario Bros." version of the cross, is a famous Nintendo Co produced the pass of the game, the first introduced in red and white machine, there are a variety of subsequent works, so multiple versions of total sales have exceeded 40000000 sets. One of the main characters Mario, Louis, Princess Peach, mushroom Prince has become Nintendo sign characters. The main issue is to imitate the classic "super Marie" to complete the corresponding game function. This game is the main core technology in Java, through a variety of core class implements the main characters and the characters in the game, and implements map rendering, collision detection, key control, scrolling and other core functions through various kinds of function, and the Games were a series of optimization, such as creating a new object, garbage collection, to balance time, space, achieve 1 computer version of super Marie.
Key words: Super Marie ,Java, Collision detection ,Roller screen
目录
1. 绪论 1
1.1 java介绍 1
1.2 超级玛丽游戏的历史 1
2. 基本概要 2
2.1 游戏应用环境的构建 2
2.1.1游戏需要的硬件环境 2
2.1.2游戏需要的软件环境 2
2.2 操作 2
2.3 游戏界面 2
3. 系统分析 4
3.1 本程序需要解决的主要技术问题 4
3.2 游戏的总体构架 4
3.3 程序的类结构以及流程图 5
3.3.1 类结构 5
3.3.2 流程图 6
4. 详细设计及实现 7
4.1 地图的实现 7
4.1.1地图的结构 7
4.1.2约定规则 7
4.1.3地图的产生 8
4.2 滚屏的实现 9
4.2.1原理 9
4.2.2地图内部对象的移动 9
4.2.3小结 9
4.3 地图切换的实现 9
4.4 碰撞检测 10
4.4.1原理 10
4.4.2碰撞检测在游戏中的应用 10
4.5 玛丽以及键控处理的实现 10
4.5.1 Mario类的实现 11
4.5.2键控处理 12
4.6 砖头的实现 12
4.6.1分类 12
4.6.2结构 13
4.7 敌人的实现 13
4.7.1分类 13
4.7.2结构 14
4.8 重力模拟 15
5. 游戏的优化及注意点 16
5.1 游戏中屏幕绘制技术的优化 16
5.2 游戏中新对象的产生和垃圾收集 16
5.3 游戏对系统资源占用的优化 17
6. 总结 18
参考文献 20
致谢 21
附录 22
1. 绪论
1.1 java介绍
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java 平台是基于 Java 语言的平台。这样的平台非常流行。因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。
Java是功能完善的通用程序设计语言,可以用来开发可靠的、要求严格的应用程序。
1.2 超级玛丽游戏的历史
1985年9月,让全球无数玩家深深着迷,同时也开启了电玩业界崭新时代的动作游戏《超级玛丽兄弟( Super Mario Bros.)》在日本当红的电视游乐器“Family Computer(FC,俗称红白机)”上 闪耀登场,至今已25 个年头。
马里奥的出道可以追溯到1981年的街机游戏《大金刚》,那时还没有马里奥这个名字,只是单纯地将他设定为一个意大利人角色。当时对马里奥有 “Mr.电子游戏”、“跳跃人”等非正式的称呼。关于正式命名还有一段典故。当游戏《大金刚》被拿到美国任天堂分部的时候,公司员工发现在有一个在仓库中工作的工人Mario,相貌和动作酷似游戏中的“跳跃人”,于是“马里奥”也就成了这个明星角色的正式名字。1953年有一部法国电影《恐怖的报酬》,主人公名叫马里奥,搭档名叫路易基。
帽子加背带工作服、大鼻子和胡子等特征,离英雄的形象相差甚远。再加上少许肥胖的身材,稍不留神可能就会把我们的英雄马里奥当成在便利店打工的中年大叔。但是形象上所带来的个性和亲切感,却在玩家的心中根深蒂固。马里奥的诞生之父宫本茂的设计理念就是“像记号一般让人一目了然的外貌,容易表现动作的配色”。当时限于硬件的机能,无法表现精密的画面。为了清楚表现人物的动作,就把马里奥的服装设计成了背带工作服,这样可以很好地表现出手臂的动作。关于脸部的设计,当时的考虑是,就算设计得很仔细,在电视上也无法表现出来。有特点、容易辨认,才是设计的重点。所以就有了大鼻子、留胡子、戴帽子的设计。
2. 基本概要
2.1 游戏应用环境的构建
2.1.1游戏需要的硬件环境
普通PC
CPU :1GHz及以上
内存 : 256MB及以上
分辨率 :推荐1024*768像素
2.1.2游戏需要的软件环境
操作系统 :Windows xp/7
开发环境 :eclipse
开发工具包 :JDK
2.2 操作
本游戏为全键盘操作。进入主界面后,按P键可以选择关卡,Enter键进入游戏。A键和D键分别控制玛丽左右移动。J键为加速键。K键控制玛丽跳跃。
2.3 游戏界面
进入游戏后,按P键选择关卡,按Enter键开始游戏。游戏开始界面如图(图2-1)所示:
图2-1 开始界面
游戏进行中的画面如图(图2-2、图2-3)所示:
图(2-2)为游戏刚开始的画面:
图2-2 游戏画面-1
图(2-3)为第二关刚开始的画面:
图2-3 游戏画面-2
3. 系统分析
3.1 本程序需要解决的主要技术问题
1.如何实现地图:如何实现地图的绘制,如何实现滚屏(即当玛丽移动时,地图同时向后移动)。
2.地图上建筑物的实现。
3.碰撞检测。
4.玛丽的实现与控制。
3.2 游戏的总体构架
根据以上分析,我们把整个游戏分为四个模块:
1.地图模块:主要为一个Map类,此类包含了地图的所有信息,包括地图背景,建筑物,敌人等。建筑物分为两类:一类是不能产生变化的普通建筑物,另一类是可以被玛丽顶的砖头,可以产生金币、蘑菇或花朵的砖头。
2.玛丽与主线程模块:Mario为主角玛丽的类,在此类中定义了玛丽的各种属性和动作,并加入了键盘控制。Check类为游戏主线程类,一些主要的功能,包括玛丽动作的实现,与建筑物和敌人的碰撞检测等都在此类中实现。
3.绘制模块:MyJPanel类。游戏中的所有事物,包括主人公玛丽,建筑物,敌人等等,都通过调用其本身的draw()方法在此类中画出。
4.垃圾回收模块:Rubbish类。此类为一个线程类,游戏启动时随主线程Check的启动而启动,实时检测游戏中产生的垃圾并回收,减少对系统资源的占用,优化游戏的运行。
系统结构图如下图(图3-1)所示:
超级玛丽
地图模块
玛丽与主线程模块
绘制模块
垃圾回收模块
图3-1 系统结构
3.3 程序的类结构以及流程图
3.3.1 类结构
图3-2 类结构
如上图(图3-2)所示,本游戏的主要类结构为:
⑴ Mario类。本类为主角玛丽的实现类,玛丽的动作与控制,以及绘制等方法都在本类中定义。
⑵ Check类。本类为主要线程类,玛丽的动作,与建筑物、砖头以及敌人的碰撞检测,发子弹,地图的滚屏等等都在本线程类中实现。
⑶ Map类。本类为地图类。地图上所有的对象,包括建筑物,砖头,敌人等都为此类的属性。
⑷ Creature类。本类为所有敌人,蘑菇,花朵和金币的父类,本类为线程类,在其具体的子类中定义了相应动作。
⑸ Brick类。本类为所有砖头类的父类,为线程类。在其具体的子类中定义了相应的动作。
⑹ CrashCheck类。本类定义了碰撞检测的方法。
⑺ MyJPanel类。游戏中所有的对象都在此类中绘制。
⑻ Music类。本类为游戏的背景音乐类。
⑼ Rubbish类。本类为垃圾检测和回收类。
文件夹结构为:
⑴ audio文件夹。本文件夹存储游戏的所有声音文件。
⑵ image文件夹。本文件夹存储游戏的所有图片文件。
⑶ maps文件夹。本文件夹包含游戏的地图文件。
3.3.2 流程图
游戏流程图如下图(图3-3)所示:
开始
选择关卡
默认
加载地图
进入游戏
通关
否
是
游戏结束
图3-3 流程图
4. 详细设计及实现
4.1 地图的实现
地图的实现是本游戏的一个主要难点。设计思路为把地图信息记录在一个文本文件map.txt中,当游戏启动时,由一个专门类CreateMap的静态方法loadMap()来实现加载地图功能。这样做的好处是,当改变文本文件的内容时,就可以改变地图布局,从而可以很方便地设计地图。
4.1.1地图的结构
地图信息在一个Map类中保存,此类的主要结构为:
1.属性
⑴ 数组tile。此数组用来保存普通建筑物对象。
⑵ 集合brickList。此集合用来保存可以被顶,可以顶出蘑菇和花朵和金币的砖头或问号对象。
⑶ 集合creatureList。此集合用来保存敌人,蘑菇,花朵和金币对象。
⑷ 对象background。此对象为地图的背景对象。
2.方法
⑴ moveLeft()。此方法的功能是将地图向左移动,滚屏时使用。
⑵ draw()。此方法为地图的绘制方法,包含地图中所有对象(背景,建筑物,砖头,敌人)的绘制方法。因此只需要在MyJPanel类的paint()方法中调用此方法,便可将地图上的所有对象画出。
4.1.2约定规则
图4-1 地图文件
地图文件如上图(图4-1)所示。约定的对应规则为:
⑴ 大写字母A~I 分别对应相应的普通建筑物。
⑵ 大写字母J~L分别对应相应的砖头。其中字母J对应可以顶碎的砖头(当为小玛丽时砖头仅上下移动一下,为大玛丽时可以顶碎),字母K对应可以顶出蘑菇或花朵的砖头(当为小玛丽时顶出可以变大的蘑菇,当为大玛丽时则顶出可以发子弹的花朵)。字母L对应可以顶出多个金币的砖头(固定为8个金币)。
⑶ 大写字母R和S分别对应可以顶出蘑菇或花朵的砖头(当为小玛丽时顶出可以变大的蘑菇,当为大玛丽时则顶出可以发子弹的花朵)和可以顶出一个金币的砖头。
⑷ 大写字母O对应金币。
⑸ 大写字母Z对应地图的出口。即到达此处地图结束,进入下一关地图。
⑹ 数字代表敌人。数字1代表毛毛虫,2代表乌龟。
⑺ 地图左上角符号#后边的三个字符,分别表示:第一个表示地图的背景类型,第二个表示玛丽在此地图的初始位置,第三个数字表示此地图结束后下一个衔接的地图编号。
按上述地图文件产生的对应的游戏画面如图(图4-2)所示:
图4-2 对应的游戏地图画面
4.1.3地图的产生
产生地图时,调用CreateMap类中的静态方法loadMap(),调用时将要加载的地图文件以参数的形式传入。此方法的工作流程为:
⑴ 产生一个Map对象map。
⑵ 读取地图文件,依据上述对应规则,在相应位置产生相对应的对象(位置通过对象本身的坐标属性x和y体现)。并将产生的对象加入地图相应属性:建筑物对象加入数组map.tile,砖头对象加入集合map.brickList,敌人,蘑菇,花朵和金币对象加入集合map.creatureList。
⑶ 返回 map对象。
map对象即为产生的地图类。在MyJPanel中调用map.draw(),即可将地图画出。
4.2 滚屏的实现
4.2.1原理
在主人公玛丽向右移动,并到达一定位置时,让其横坐标不再变化,同时调用map.moveLeft()方法,使地图向左移动,实现滚屏效果。由于玛丽的移动速度不是固定的,因此在map.moveLeft()方法中也不能使用固定数值。将玛丽的移动速度保存在玛丽的一个整型数值属性speed中,并通过一个中间数值将其传入到map.moveLeft()方法中,使玛丽的移动速度和地图的移动速度始终同步。
4.2.2地图内部对象的移动
地图的移动体现在地图属性map.X的数值变化上,刚开始,map.X为零,表明在地图的最开始。随着玛丽向右移动,地图向左移动,map.X的值逐渐变小。
在地图内部的所有固定对象(即相对于地图位置不变的对象),都有X,Y和想x,y这两对坐标属性,其中X,Y表示此对象相对于地图的位置,这一对数值在对象生成那一刻起就不会再变化。x,y表示此对象的实际位置,即在屏幕上画出时的坐标。在画出此对象前,先执行代码:this.x=this.X+map.X;即可保证随着地图的移动,此对象相对于地图的位置不变。
在地图内部的所有非固定对象(即相对于地图的位置会发生变化的对象,例如敌人对象会自己移动),除了具有X,Y、x,y这两对坐标属性外,还具有另外一对属性xm,ym。其中前两对属性的意义与固定对象中的意义相同,而后者xm,ym这一对代表对象自身移动产生的位移。在画出此对象前,执行代码:this.x=this.X+map.X+this.xm;即可保证随着地图的移动,此对象跟着移动,并且由于自身的移动,其相对于地图的位置也会变化。
4.2.3小结
综上,当玛丽移动时地图向左移动,地图内部对象通过计算产生新的坐标,跟着地图一起移动,实现了地图的滚屏。
4.3 地图切换的实现
当进入下一关或者玛丽进入可以换场景的水管时,需要切换到相应的地图。
1. 进入下一关时。这种情况比较简单。在每一关的map地图类里用一个字符串属性nextMap记录下一关的地图文件的路径,当满足某种条件需要进入下一关时,调用CreateMap类里构造地图的方法loadMap(),把nextMap里的路径内容当做参数传入,构造出下一关的地图,并替换当前地图即可。
2. 进入换场景水管时。这种情况稍微复杂一些,因为还要从水管出来,所以必须要先将当前地图map对象保存在一个Map类型的数组mapRecord中,然后再根据水管中记录的地图信息构建地图场景,然后替换当前地图。当从水管中出来时,将mapRecord中保存的地图对象替换掉当前地图对象即可。
4.4 碰撞检测
4.4.1原理
碰撞检测为本游戏的基础。玛丽,敌人等对象在建筑物上移动而不下落,遇到障碍物时不能继续移动或向相反方向移动,以及子弹和敌人的碰撞都需要用到碰撞检测。
碰撞检测的方法为CrashCheck类中的一系列静态方法,共有四类:
⑴ upCheck(a,b)检测b对象是否在a对象的上方,如果是,返回true;否返回false;
⑵ downCheck(a,b)检测b对象是否在a对象的下方,如果是,返回true;否返回false;
⑶ leftCheck(a,b)检测b对象是否在a对象的左方,如果是,返回true;否返回false;
⑷ rightCheck(a,b)检测b对象是否在a对象的右方,如果是,返回true;否返回false;
根据检测对象的不同又具体分为不同的方法,但同一类的方法(即检测同一方向的方法)是同名的,即运用了方法的重载。例如要检测b对象是够在a对象的上方,不管a,b是哪一种类的对象,都可以运用静态方法CrashCheck. upCheck(a,b)来检测,大大地简化了碰撞检测方法的调用。
4.4.2碰撞检测在游戏中的应用
碰撞检测在游戏中的应用分为以下几种情况:
⑴ 玛丽与建筑物的碰撞检测:当玛丽下方有建筑物时,纵向速度v置零。当玛丽左右方向碰到建筑物时,令其横向位置变为紧贴建筑物,避免其进入建筑物。当玛丽跳跃头顶到建筑物时,令玛丽的纵向速度v置零,让其自由下落。如果被顶的建筑物时线程砖头,则启动砖头线程,并执行相应的动作。
⑵ 玛丽与敌人的碰撞检测:当玛丽跳跃踩到敌人时,令玛丽向上弹起。并让敌人执行相应动作。当玛丽在左右或上方碰到敌人时,令玛丽变小或死亡。
⑶ 子弹与建筑物的碰撞检测:当子弹下方有建筑物时,令子弹以一固定的速度向上弹起。当子弹在左右方向碰到建筑物时,结束子弹线程,并将其标识为垃圾对象。
⑷ 子弹与敌人的碰撞检测:当子弹无论在哪个方向碰到敌人时,结束子弹线程,并标识为垃圾对象,结束敌人线程,并标识为垃圾对象,敌人死亡。
⑸敌人与建筑物的碰撞检测:当敌人下方有建筑物时,纵向速度v置零。当敌人左右方向碰到建筑物时,改变其移动方向。
4.5 玛丽以及键控处理的实现
玛丽为本游戏的主人公,我们可以通过键盘控制玛丽的行走,加速,跳跃和攻击等行为,来通过关卡。
4.5.1 Mario类的实现
主人公mario对象为Mario类的一个对象。此类的主要结构为:
1.属性
⑴ 布尔值属性alive。此属性代表玛丽的死活,当alive为false时玛丽死掉,游戏结束。
⑵ 整型属性blood。此属性代表玛丽的状态。blood等于1时为小玛丽(初始状态),等于2时为大玛丽(吃蘑菇后达到),等于3时可以发子弹(吃花朵后达到)。
⑶ 布尔值属性speedUp。speedUp为true时玛丽为加速状态,为false时玛丽为普通状态
⑷ 整型属性speed。代表玛丽的移动速度。
⑸ 布尔值属性fireOn。fireOn为true时代表玛丽为发子弹的状态。
2.方法
⑴ moveLeft()。此方法可以实现玛丽向左移动。
⑵ moveRight()。此方法可以实现玛丽向右移动。
⑶ moveUp()。此方法可以实现玛丽的跳跃。
⑷ draw()。此方法将玛丽画出来。通过多个图片快速切换来实现玛丽运动的效果。
玛丽的形象如图(图4-3,图4-4)所示:
图4-3 小玛丽
图4-4 大玛丽
4.5.2键控处理
通过让Mario类继承KeyListener接口,并在KeyListener接口的默认方法中添加代码来实现键盘对玛丽行为的控制。
⑴ 当按下A键时调用mario.moveLeft()方法,玛丽向左移动。
⑵ 按下D键时,调用mario.moveRight()方法,玛丽向右移动。
⑶ 按下J键时,speedUp置true,玛丽处于加速状态。
⑷ 按下K键时,调用mario.moveUp()方法,玛丽跳跃。
玛丽跳跃的画面如图(图4-5)所示:
图4-5 玛丽跳跃画面
4.6 砖头的实现
4.6.1分类
砖头共分为5类:
⑴ 普通砖头。即能被顶碎的砖头(如果是小玛丽顶,则上下移动一下,如果是大玛丽,则被顶碎)。
⑵ 能够顶出蘑菇或花朵的砖头(如果是小玛丽顶,则会出现能够变大的蘑菇,如果是大玛丽顶,则会出现花朵)。
⑶ 能够顶出金币的砖头(固定为8个金币)。
⑷ 能够顶出蘑菇或花朵的问号(如果是小玛丽顶,则会出现能够变大的蘑菇,如果是大玛丽顶,则会出现花朵)。
⑸ 能够顶出金币的问号(能顶出一个)。
4.6.2结构
这五个砖头类都为线程类,它们继承同一个父类Brick。它们的主要结构为:
1.属性
⑴ 整型变量X,Y。这一对变量代表此对象相对于地图的位置坐标(对象产生后不会再变化)。
⑵ 整型变量x,y。这一对变量代表此对象的实际位置坐标(即画出时的坐标)。
⑶ 字符型变量type。此变量代表砖头的种类。
⑷ 布尔型变量start。此变量表示线程是否启动。
⑸ 布尔型变量alive。此变量表示线程是否还存活。
2.方法
⑴ draw()。此方法将对象画出。
⑵ run()。为线程方法。此方法定义了不同类型砖头在被玛丽顶后的不同行为。
游戏启动时,在地图相应的位置产生对应的砖头,并将其加入map.brickList,但此时并不启动砖头线程,而是当被玛丽顶后相应的砖头线程才会启动,这样大大节省了系统资源,避免了浪费。
4.7 敌人的实现
4.7.1分类
敌人共分为2类:
⑴ 毛毛虫。只能左右爬动,遇到障碍物或其它敌人后改变方向。当脚下没有建筑物时,受到重力作用下落。被玛丽踩到或被子弹打到时死亡。从其他地方碰到玛丽后,玛丽变小或死亡。毛毛虫如图(图4-6)所示:
图4-6 毛毛虫
毛毛虫死亡如图(图4-7)所示:
图4-7 毛毛虫死亡
⑵ 乌龟。只能左右爬动,遇到障碍物或其它敌人后改变方向。当脚下没有建筑物时,受到重力作用下落。不能被玛丽踩死,只能被子弹打死。从其他地方碰到玛丽后,玛丽变小或死亡。乌龟如图(图4-8)所示:
图4-8 乌龟
乌龟死亡如图(图4-9)所示:
图4-9 乌龟死亡
4.7.2结构
这两个敌人类都为线程类,继承同一个父类Creature。它们的主要结构为:
1.属性
⑴ 整型变量X,Y。这一对变量代表此对象相对于地图的位置坐标(对象产生后不会再变化)。
⑵ 整型变量x,y。这一对变量代表此对象的实际位置坐标(即画出时的坐标)。
⑶ 整型变量xm,ym。这一对变量代表对象本身移动产生的位移。
⑷ 字符型变量type。此变量代表敌人的种类。
⑸ 布尔型变量start。此变量代表线程是否启动。
⑹ 布尔型变量alive。此变量代表对象是否存活。
2.方法
⑴ draw()。此方法将对象画出。
⑵ moveLeft()。此方法可以让对象向左移动。
⑶ moveRight()。此方法可以让对象向右移动。
⑷ run()。为线程方法。此方法定义了不同类型敌人的不同行为。
游戏启动时,在地图相应的位置产生对应的敌人,并将其加入map.enemyList,但此时敌人线程并不启动,而是当其实际位置移动到窗口附近时才会启动。这样大大节省了系统资源,避免了浪费。
4.8 重力模拟
为了让游戏更加逼真,我们对游戏中的每个自由对象(玛丽、敌人以及子弹)施加重力,让其模拟现实中的物体,在其下方没有物体支撑时,作自由落体运动。
具体实现方法:
在每个生物线程里,加入如下重力实现代码。
this.y+=v;
v+=G;
其中v代表对象的纵向速度,正值为朝下,负值为朝上。初始值为零。G为一个整型常量,代表重力加速度,值恒为1。
线程运行过程中,先检测对象下方有无建筑物支撑,如果有,则v置零,如果没有,则运行上述重力实现代码。重复上述过程,令其模拟物体受到重力作用。
5. 游戏的优化及注意点
5.1 游戏中屏幕绘制技术的优化
在屏幕绘制模块中,包括两个部分:玛丽的绘制与地图的绘制。它们的绘制方法是在MyJPanel类中的paint()方法中调用绘制方法mario.draw()和map.draw()。
在其具体的实现方法中,玛丽的情况很简单,只需要在mario类中添加多个玛丽动作的分解图片属性,然后在其draw()方法中按一定规律交替画出这些图片即可实现玛丽的绘制与运动。地图的绘制就较为复杂,因为在其draw()方法中,包含了多个不同类型对象的绘制方法,包括背景,建筑物,砖头,敌人等等。在这些对象的绘制过程中,必须要注意其绘制的先后顺序,例如背景必须最先绘制,否则就会盖住其它内容。然后再是建筑物,砖头,敌人等。
在滚屏的实现一章中,我们提到过在地图绘制前,要对其内部的所有对象进行坐标计算,即对所有对象执行代码:this.x=this.X+map.X或this.x=this.X+map.X+this.xm,然后再执行绘制代码。
现在有两个方案:
⑴ 对地图内的某个对象,先执行坐标计算代码,然后执行绘制代码,然后再计算和绘制下一个对象。
⑵ 先对地图内所有对象执行坐标计算代码,然后再对所有对象执行绘制代码。
经过分析可知,第一种方案中每个对象绘制之间的时差较大(中间隔了坐标计算代码),因此在地图滚屏时可能会造成建筑物变形的现象(接口处错开)。而第二种方案,每个对象的绘制是接连进行的,中间没有太多时差,所以大大减少第一种方案中造成的建筑物变形现象。经过实验,确实如此。因此采用第二种方案。
5.2 游戏中新对象的产生和垃圾收集
1.新对象的产生
在本游戏中,对象的产生大部分是在游戏刚启动时,比如,建筑物、砖头、敌人等等。有一小部分是在游戏中产生的,如玛丽发出的子弹,蘑菇,花朵和顶出的金币等。
2.垃圾收集
在游戏运行过程中,要实时进行垃圾收集,否则占用系统资源过多,会造成游戏卡顿,运行不畅。
收集垃圾前,要先鉴定一个对象是否为垃圾对象,将垃圾对象进行标识。具体为:
⑴ 子弹对象的鉴定:当子弹移出屏幕之外,或者打中敌人,或者碰到建筑物后,标识为垃圾对象。
⑵ 砖头对象的鉴定:当砖头被顶碎后标识为垃圾对象。
⑶ 敌人对象的鉴定:当敌人被杀死或掉到窗口下方后标识为垃圾对象。
⑷ 其他对象的鉴定:当蘑菇,花朵,金币对象被玛丽吃掉后,标识为垃圾对象。
本游戏中用一个独立的线程Rubbish来时刻检测和收集垃圾对象,此线程随游戏主线程的启动而启动,将标识为垃圾的对象线程停止,然后移出数组或集合,保证程序的流畅运行,减少对系统资源的占用。
5.3 游戏对系统资源占用的优化
1.线程的优化
游戏启动时,加载地图上所有对象,但是并不启动所有线程。各类线程的启动时间为:
⑴ 砖头线程。砖头线程只有在被玛丽顶到时才会启动。
⑵ 敌人线程。只有当敌人的实际坐标位置快要进入窗口时,才会启动线程。
2.绘制的优化
在对地图内所有对象绘制之前,先对对象的坐标进行检测,只有当对象处在窗口之内时才会执行绘制代码。
通过以上优化,减少了不必要的线程和绘制,大大节省了系统资源,提高了游戏运行效率。
6. 总结
做事要积极主动,态度决定一切,不得不说,同样的事,同一水平线,不同人做的时候,态度和积极性就决定着一切,所以一个人只要工作态度好,我相信这个人的工作绝对不会差。
就为解决一个问题,我们可能连续十几甚至几十小时的坐在计算机前不停的工作。一个问题解决了,可能又有其它的问题出现。而你要是不能坚持下来,可能从前的一切努力都流失了。轻易言败的人请不要做程序员,你不可能成功。执着是最可贵的。
整个程序设计的过程就是一个研究学习,应用,再研究学习,再应用的过程。一名优秀的程序员决不会认为自己足够好了,不需要再提高了。自满自足的人不会是好程序员,会很快落后以致落伍。所以越是优秀的程序员越是感觉自己懂得少,不会在人前故意卖弄,这并不是故作谦虚,而是实实在在的感受,亲自体会才能明白。
虚心请教不懂就要问,如果是单纯技术上的问题,如果可以百度到的,我认为就可以自己消化掉!问的问题一定要先百度,然后带着自己的想法,去问一些有经验的人,收获会更大!
浮华的程序员会不懂装懂,不停的强调语言的优劣,平台的好坏。追求所谓最新最时尚的技术,停留在表面问题上。
优秀的程序员是充满激情和活力的程序员。求知欲和创造欲是原动力。有求知欲你才能不停的学习,有创造欲你才能不停的超越自己。
很多程序员都是在失败的时候强调客观因素,而优秀的程序员的程序员都是先反省自己。要明白自己缺陷,再努力去学习。没有人事事都做的成功,也没有人生来就什么会做。所以失败了,多想想自身的原因,这样你才会不停的进步,而不是留在原地抱怨。
要想飞的更高,我需要一双有力的翅膀,一双有力的翅膀,是飞行的最基本的支撑和前提。
那什么是程序开发的最基本的支撑呢,个人感觉是构建一个完整的关于开发的知识体系和程序员应该具备的最基本能力。
对技术迷茫过?动摇过?很正常,每个人都有过这样的困惑,审慎的对待自己的性格、能力,并作出合理的选择是我们这代人需要面对的问题之一,我们没有可以参考的目标(对于软件行业而言,在国内从无到有也才那么10几年时间,自然没有什么参考对象),也不像我们的父辈一样无法选择,展现在我们面前的是一条更加宽广的路,也是一条充满了荆棘的路,所以,选择也就更加的重要了。
我越来越意识到写程序不是仅仅把程序写出来,而是要让你写的程序可读,可维护,并且高效。优化正确的程序要比改正已优化(但是有错)的程序要容易。
此次的毕业实习为我深入社会,体验生活提供了难得的机会,让我在实际的社会活动中感受生活。了解社会中生存所应具备的各种能力在工作中严格要求自己,虚心向他人请教,学到更多的知识,掌握一些基本的会计技能,为以后的工作和生活积累更多的知识和宝贵经验。
通过本次毕业设计,让我们掌握如何制作一个游戏软件,以及制作游戏软件的整个流程,制作游戏软件的步骤,让学生熟悉项目开发的完整过程,为即将到来的就业工作打下基础。另外也通过本次设计将三年来所学的专业知识和其他方面的知识融入到实际应用中,在实际运用中学习和掌握Java程序开发的全过程,进一步熟悉掌握Java程序设计语言的基础内容、基本技能和方法,同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
参考文献
[1] 图书作者: [美]David Wallace Croft 著 彭晖 译 图书名称:Java游戏高级编程——游戏开发经典丛书 出版社: 清华大学出版社 出版时间: 2005-8第1版
[2] 图书作者:(美)韦尔斯 等著,陈宗斌 等译 图书名称:JAVA ME 游戏编程(第2版) 图书出版社:机械工业出版社
[3] 图书作者:荣钦科技 编著 图书名称:《JAVA2游戏程序设计》 出版时间:2003.06出版
[4] 图书作者:David Brackeen编著 邱仲潘 翻译 图书名称:《JAVA游戏编程》 出版时间: 2004.06出版
[5] 图书作者:Bruce Eckel著 陈昊鹏 译. 图书名称:Java编程思想. [M] 图书出版社:北京:机械工业出版社 出版时间: 第4版.2007年
[6] 图书作者:王克宏主编 图书名称:《JAVA技术及其应用(第二版)》 出版社:高等教育出版社
致谢
首先,衷心地感谢高媛教师。我很想自己做一个游戏,于是在论文题目制定时,我毫不犹豫地选择了这个题目,感谢老师能给我这样一个实现自己的机会,感谢老师在这段时间对我无私的指导和帮助。
最后,感谢大学四年间热情帮助过我的每一位老师和同学。感谢亲爱的农大对我的栽培。
附录
超级玛丽游戏源代码:
1. Mario类:
package com.day01;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.util.LinkedList;
import java.util.List;
import javax.swing.ImageIcon;
public class Mario implements KeyListener, ImageObserver{
public int x;
public int y;
public int width=34;
public int height=50;
public Imag
展开阅读全文