Java游戏程序设计教程第13章 游戏设计案例详课件.ppt
《Java游戏程序设计教程第13章 游戏设计案例详课件.ppt》由会员分享,可在线阅读,更多相关《Java游戏程序设计教程第13章 游戏设计案例详课件.ppt(38页珍藏版)》请在三一办公上搜索。
1、第13章 游戏设计案例详解,模拟钢琴游戏太空射击游戏点灯游戏,案例一:模拟钢琴游戏,钢琴游戏的类结构,接下来要做的是:在木纹图像上画出一个个的琴键; 然后给每个琴键编写一个演奏的play()方法。,实例化一个琴键对象,在Piano类的构造方法Piano()中添加: Key key_g=new Key(); addObject(key_g ,300,180);为什么?,实现琴键的动画效果,打开Key类的act()方法,在其中添加相应的琴键动画效果代码。,给琴键添加声音效果,按下G键,发出“哆”的声音准备声音文件“3a.wav”在key类的act()方法中添加如下代码:,ublic void ac
2、t() if( Greenfoot.isKeyDown(g)/如果按下g键 Greenfoot.playSound(3a.wav); /演奏声音文件“3a.wav” setImage(white-key-down.png);/显示键被按下的效果图片 else setImage(white-key.png);/显示键被松开的效果图片 ,完善琴键的声音效果,如果一直按住G键,琴键对应的声音文件连续播放现实中的钢琴演奏是按下一个琴键,钢琴奏出一个音符,这个音符的长度不受琴键被按下的时间长短所控制。解决办法是先声明一个变量,用这个变量记录下某个琴键是否被按下的状态,然后在if条件判断时考虑这个状态变量
3、的情况。通常人们将这种记录某个对象的状态值的变量称为标记变量,大多数情况下,标记变量是个boolean类型的变量,它只有true或false两种状态。,编写多个琴键,每个琴键对象对应一个电脑键盘按键和一个声音文件。钢琴有几十个键,需要在Key类的act()方法里面用几十组if语句来为每个琴键对象指定其电脑按键和声音文件,势必act()方法的代码会很长很复杂,有很多的代码重复。能不能在实例化生成每个琴键对象时,就指定这个琴键对象的电脑按键和声音文件呢?即编写一个通用的Key()构造器,使它能够将电脑按键和声音文件作为参数传入到构造器中,如Key(String keyName,String sou
4、ndFile),这样在创建每个琴键对象时就为其指定了电脑按键和声音文件。,用循环添加多个琴键,实现了通用的琴键Key构造器,就可实现多个琴键了,int i = 0;while (i 12) Key key = new Key( “g”, “3a.wav); addObject(key, 54 + (i*63), 140); /每隔63个像素绘制一个琴键 i = i + 1;,用数组来完善钢琴游戏,目前为止,所有的琴键都是G键如何生成每个都不一样的琴键呢?即前面的循环语句中,如何向Key构造器中传入不同的键名和声音文件Key key = new Key( “键名”, “声音文件);最好的办法是数
5、组循环中需要每次循环传入不同的值,最好的办法是数组因为把数组的下标作为循环变量,就使得数组和循环二者结合起来了,绘制黑色琴键,黑色琴键是对应白色琴键的升半调音符设计一个黑色键名数组和一个黑色键音符文件名数组与白色键一样,黑色键也有两张图像在生成琴键对象的时候,就将琴键所对应的效果图片传入到其构造器中不用担心要在Key类的act()方法中使用麻烦的if语句来区分是黑色还是白色琴键 使得Key类的act()方法更具通用性,使得程序更加易于扩展,如容易继续添加其它类型的按键,案例二:太空射击游戏,太空射击游戏中的类,太空射击游戏对象关系图,太空射击游戏类关系图,源代码比较,Ship、Enemy和La
6、ser三个类三者的代码重复部分都有用setLocation(int x,int y)实现从一个位置坐标到另一个位置坐标的匀速直线运动 Ship类和Enemy类之间,以及Enemy类与Laser之间的碰撞检测 碰撞发生后有爆炸效果和战果记分的相关代码大部分是相同的,只有少许差异 由此可能带来的问题setLocation(int x,int y)中的坐标从int型改成double型(这样就可以处理比较精确的小数了),这样的修改在三个类中都得修改 程序扩展比较困难 ,如增加一个飞碟类Saucer飞碟Saucer类的代码与Ship类和Enemy类的基本相同 哪个类中的代码有点问题,其它所有类都得同步修
7、改,代码重复问题解决,最好办法:继承 继承是一种解决重复问题的机制首先,将Ship、Enemy和Laser三个类的共同部分抽取出来,单独地做成一个Sprite类 然后,分别声明Ship、Enemy和Laser是这个Sprite类的子类最后再分别在Ship类里加上Ship自己独有的部分,在Enemy类里加上Enemy独有的部分,Laser也是如此 Ship、Enemy和Laser三个类都继承Sprite类,它们都是Sprite类的子类 三个类中共同的属性只需描述一次就够了 子类的设计变得简单了,只需考虑自己的特有部分就行了,再也不用操心如何与其它类的代码保持一致的难题,继承程序结构的类图,运用继
8、承后的游戏类图,用抽象类来优化程序结构,程序结构的进一步分析 Ship、Enemy类的act()方法,发现两个类中都有关于碰撞检测、对象重新生成和游戏记分的功能代码 与下面的伪代码是一致的,只是实现代码不同。,如何优化?,能否将它们抽象出来,归入Sprite类呢?Ship类和Enemy类中相同功能的实现代码不一样不能简单地将它们移植到超类中应该在更高的层次上将二者的雷同部分抽象出来然后归入到超类Sprite中 解决办法抽象类为两个类中的功能相同部分的代码设计一个名为处理碰撞的handleShotCollision()方法但是Ship类和Enemy类对于handleShotCollision()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java游戏程序设计教程第13章 游戏设计案例详课件 Java 游戏 程序设计 教程 13 设计 案例 课件

链接地址:https://www.31ppt.com/p-1869027.html