Java游戏程序设计教程第13章 游戏设计案例详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第13章 游戏设计案例详解
0011 0010 1010 1101 0001 0100 1011
4
1
2
• 模拟钢琴游戏
0011 0010 1010 1101 0001 0100 1011
• 太空射击游戏 • 点灯游戏
4
1
2
案例一:模拟钢琴游戏
0011 0010 1010 1101 0001 0100 1011
4
1
2
用循环添加多个琴键
• 实现了通用的琴键Key构造器,就可实现多个 琴键了
int i = 0; while (i < 12) { Key key = new Key( “g”, “3a.wav); addObject(key, 54 + (i*63), 140); i = i + 1; } //每隔63个像素绘制一个琴键
• 通常人们将这种记录某个对象的状态值的变量称为标记 变量,大多数情况下,标记变量是个boolean类型的变量, 它只有true或false两种状态。
4
1
2
编写多个琴键
– 钢琴有几十个键,需要在Key类的act()方法里面用几十组if语句来为每 个琴键对象指定其电脑按键和声音文件,势必act()方法的代码会很长 很复杂,有很多的代码重复。
为什么?
4
1
2
实现琴键的动画效果
0011 0010 1010 1101 0001 0100 1011
4
打开Key类的act()方法,在 其中添加相应的琴键动画 效果代码。
1
2
给琴键添加声音效果 • 按下G键,发出“哆”的声音
–准备声音文件“3a.wav” –在key类的act()方法中添加如下代码:
• 与白色键一样,黑色键也有两张图像
–在生成琴键对象的时候,就将琴键所对应的 0011 0010 1010 1101 0001 0100 1011 效果图片传入到其构造器中 –不用担心要在Key类的act()方法中使用麻烦 的if语句来区分是黑色还是白色琴键 –使得Key类的act()方法更具通用性,使得程 序更加易于扩展,如容易继续添加其它类型 的按键
:Explosion
0011 0010 1010 1101 0001 0100 1011
:Enemy :Space
new Ship() scoreNum new Enemy() new Stars() scoreField new Explosion() new Laser()
:Stars
:Score
0011 0010 1010 1101 0001 0100 1011
• 每个琴键对象对应一个电脑键盘按键和一个声音文件。
• 能不能在实例化生成每个琴键对象时,就指定这个琴 键对象的电脑按键和声音文件呢?
– 即编写一个通用的Key()构造器,使它能够将电脑按键和声音文件作为 参数传入到构造器中,如Key(String keyName,String soundFile), 这样在创建每个琴键对象时就为其指定了电脑按键和声音文件。
运动控制方法:act() 键盘控制方法:checkKeys() 飞船与敌人的碰撞检测: hitEnemy()
//如果按下g键 //演奏声音文件“3a.wav” //显示键被按下的效果图片
//显示键被松开的效果图片
}
4
1
2
完善琴键的声音效果
• 如果一直按住G键,琴键对应的声音文件连续播放 –现实中的钢琴演奏是按下一个琴键,钢琴奏出一个 音符,这个音符的长度不受琴键被按下的时间长短 所控制。 0011 0010 1010 1101 0001 0100 1011 –解决办法是先声明一个变量,用这个变量记录下某 个琴键是否被按下的状态,然后在if条件判断时考 虑这个状态变量的情况。
4
1
2
Biblioteka Baidu
案例二:太空射击游戏
0011 0010 1010 1101 0001 0100 1011
4
1
2
太空射击游戏中的类
0011 0010 1010 1101 0001 0100 1011
4
1
2
太空射击游戏对象关系图
:Laser :Ship
new Laser() new Explosion() new Enemy()
4
1
2
太空射击游戏类关系图
Space
Score_field 场景构建方法:Space() 星空背景制作方法: createStarts(int number) scoreNum count = 0
Stars
Enemy
Ship
0011 0010 1010 1101 0001 0100 1011 gunHeat = 0
0011 0010 1010 1101 0001 0100 1011
• 最好的办法是数组
–循环中需要每次循环传入不同的值,最好的办法 是数组 –因为把数组的下标作为循环变量,就使得数组和 循环二者结合起来了
4
1
2
绘制黑色琴键
• 黑色琴键是对应白色琴键的升半调音符
–设计一个黑色键名数组和一个黑色键音符文 件名数组
0011 0010 1010 1101 0001 0100 1011
4
1
2
用数组来完善钢琴游戏
• 目前为止,所有的琴键都是G键 • 如何生成每个都不一样的琴键呢?
–即前面的循环语句中,如何向Key构造器中传入不 同的键名和声音文件
• Key key = new Key( “键名”, “声音文件);
public void act() { 0001 0100 1011 0011 0010 1010 1101
if( Greenfoot.isKeyDown("g")){ Greenfoot.playSound("3a.wav"); setImage("white-key-down.png"); } else{ setImage("white-key.png"); }
4
1
2
钢琴游戏的类结构
0011 0010 1010 1101 0001 0100 1011
接下来要做的是:在木纹 图像上画出一个个的琴键; 然后给每个琴键编写一个 演奏的play()方法。
4
1
2
实例化一个琴键对象
0011 0010 1010 1101 0001 0100 1011
在Piano类的构造方法Piano()中 添加: Key key_g=new Key(); addObject(key_g ,300,180);
0011 0010 1010 1101 0001 0100 1011
4
1
2
• 模拟钢琴游戏
0011 0010 1010 1101 0001 0100 1011
• 太空射击游戏 • 点灯游戏
4
1
2
案例一:模拟钢琴游戏
0011 0010 1010 1101 0001 0100 1011
4
1
2
用循环添加多个琴键
• 实现了通用的琴键Key构造器,就可实现多个 琴键了
int i = 0; while (i < 12) { Key key = new Key( “g”, “3a.wav); addObject(key, 54 + (i*63), 140); i = i + 1; } //每隔63个像素绘制一个琴键
• 通常人们将这种记录某个对象的状态值的变量称为标记 变量,大多数情况下,标记变量是个boolean类型的变量, 它只有true或false两种状态。
4
1
2
编写多个琴键
– 钢琴有几十个键,需要在Key类的act()方法里面用几十组if语句来为每 个琴键对象指定其电脑按键和声音文件,势必act()方法的代码会很长 很复杂,有很多的代码重复。
为什么?
4
1
2
实现琴键的动画效果
0011 0010 1010 1101 0001 0100 1011
4
打开Key类的act()方法,在 其中添加相应的琴键动画 效果代码。
1
2
给琴键添加声音效果 • 按下G键,发出“哆”的声音
–准备声音文件“3a.wav” –在key类的act()方法中添加如下代码:
• 与白色键一样,黑色键也有两张图像
–在生成琴键对象的时候,就将琴键所对应的 0011 0010 1010 1101 0001 0100 1011 效果图片传入到其构造器中 –不用担心要在Key类的act()方法中使用麻烦 的if语句来区分是黑色还是白色琴键 –使得Key类的act()方法更具通用性,使得程 序更加易于扩展,如容易继续添加其它类型 的按键
:Explosion
0011 0010 1010 1101 0001 0100 1011
:Enemy :Space
new Ship() scoreNum new Enemy() new Stars() scoreField new Explosion() new Laser()
:Stars
:Score
0011 0010 1010 1101 0001 0100 1011
• 每个琴键对象对应一个电脑键盘按键和一个声音文件。
• 能不能在实例化生成每个琴键对象时,就指定这个琴 键对象的电脑按键和声音文件呢?
– 即编写一个通用的Key()构造器,使它能够将电脑按键和声音文件作为 参数传入到构造器中,如Key(String keyName,String soundFile), 这样在创建每个琴键对象时就为其指定了电脑按键和声音文件。
运动控制方法:act() 键盘控制方法:checkKeys() 飞船与敌人的碰撞检测: hitEnemy()
//如果按下g键 //演奏声音文件“3a.wav” //显示键被按下的效果图片
//显示键被松开的效果图片
}
4
1
2
完善琴键的声音效果
• 如果一直按住G键,琴键对应的声音文件连续播放 –现实中的钢琴演奏是按下一个琴键,钢琴奏出一个 音符,这个音符的长度不受琴键被按下的时间长短 所控制。 0011 0010 1010 1101 0001 0100 1011 –解决办法是先声明一个变量,用这个变量记录下某 个琴键是否被按下的状态,然后在if条件判断时考 虑这个状态变量的情况。
4
1
2
Biblioteka Baidu
案例二:太空射击游戏
0011 0010 1010 1101 0001 0100 1011
4
1
2
太空射击游戏中的类
0011 0010 1010 1101 0001 0100 1011
4
1
2
太空射击游戏对象关系图
:Laser :Ship
new Laser() new Explosion() new Enemy()
4
1
2
太空射击游戏类关系图
Space
Score_field 场景构建方法:Space() 星空背景制作方法: createStarts(int number) scoreNum count = 0
Stars
Enemy
Ship
0011 0010 1010 1101 0001 0100 1011 gunHeat = 0
0011 0010 1010 1101 0001 0100 1011
• 最好的办法是数组
–循环中需要每次循环传入不同的值,最好的办法 是数组 –因为把数组的下标作为循环变量,就使得数组和 循环二者结合起来了
4
1
2
绘制黑色琴键
• 黑色琴键是对应白色琴键的升半调音符
–设计一个黑色键名数组和一个黑色键音符文 件名数组
0011 0010 1010 1101 0001 0100 1011
4
1
2
用数组来完善钢琴游戏
• 目前为止,所有的琴键都是G键 • 如何生成每个都不一样的琴键呢?
–即前面的循环语句中,如何向Key构造器中传入不 同的键名和声音文件
• Key key = new Key( “键名”, “声音文件);
public void act() { 0001 0100 1011 0011 0010 1010 1101
if( Greenfoot.isKeyDown("g")){ Greenfoot.playSound("3a.wav"); setImage("white-key-down.png"); } else{ setImage("white-key.png"); }
4
1
2
钢琴游戏的类结构
0011 0010 1010 1101 0001 0100 1011
接下来要做的是:在木纹 图像上画出一个个的琴键; 然后给每个琴键编写一个 演奏的play()方法。
4
1
2
实例化一个琴键对象
0011 0010 1010 1101 0001 0100 1011
在Piano类的构造方法Piano()中 添加: Key key_g=new Key(); addObject(key_g ,300,180);