2.1. 游戏介绍
这是原书介绍的第一个游戏,适合4 岁以上的小朋友玩。下图所示是这个游戏在不同状态时的画面截图。启动这个游戏程序,就进人游戏的欢迎画面。这时按下链盘上的回车键就可以开始游戏。
游戏欢迎画 | 游戏进行画面 | 游戏结束画面 |
在游戏进行中,从天空中会不断地随机掉下雪花、礼物和剪刀。玩家使用键盘上的左、右方向键控制公主角色往左、右两个方向移动,让公主躲避剪刀、接住礼物和雪花。接到雪花可获得10分,接到礼物可获得50分。游戏开始时,玩家有3颗爱心宝石。如果玩家让公主碰到剪刀,就要扣掉1颗爱心宝石;如果爱心宝石用光了,那么碰到剪刀就会结束游戏。这个游戏的时间限定为5分钟。游戏开始后就开始倒计时,时间到,则游戏结束。
在游戏结束画面,按下链盘上的回车键可以重新开始游戏。如果要退出游戏程序,可以单击窗口中的“关闭”按钮。
2.2. 编程思路
这个游戏要实现的功能并不复杂,整个游戏分为3个状态,即等待、进行和结束。在各个状态下需要实现的功能见下表:
原书表 29-1 游戏状态及功能
状态 |
功能 |
等待状 |
l 显示游戏欢迎背景图 l 等待状态 按下回车开始玩 |
进行状态 |
l 显示游戏进行背景图 l 循环播放《铃儿响叮当》伴奏曲 l 用左、右方向键控制公主左、右移动 l 礼物、雪花和剪刀随机地从天空中掉下 l 公主接到礼物加50分,接到雪花加10分 l 公主碰到剪刀减掉1课爱心宝石 |
结束状态 |
l 显示游戏结束背景图 l 按下回车键重新玩游戏 |
这个游戏的3个状态在不同的条件下被触发和转换,其变化情况如原书 图29-2 所示。
在游戏进行中,从天空中会随机掉落物体,可能是雪花、礼物或剪刀中的一个。 使用随机函数决定掉落物体的类型,将雪花、礼物和剪刀三者的比例控制为为5:3:2。 也就是在1到10之间随机生成一个数n 。如果1≤n≤5,则掉落物体是雪花。如果6≤n≤8,则掉落物体是礼物。如果9≤n≤10,则掉落物体是剪刀。
在游戏时需要判断公主是否碰到雪花、礼物或刀剪,专业的说法叫作“碰撞检测 ”。在Pyglet 中并没有提供碰撞检测的功能,需要编程者自己实现。不过好在GameZero很贴心地提供了碰撞检测的函数collide(a,b)。
function collide (a,b)
参数a,b是两个actor对象
function collide (a, x::Integer, y::Integer)
参数a是一个actor对象,x,y是某个坐标点
function collide (a, pos::Tuple)
这是上一个函数的变体:
collide(a, pos::Tuple) = collide(a, pos[1], pos[2])
事实上,所谓碰撞检测,就是使用数学上的两点之间距离公式算出计两个角色之间的距离,当这个距离小于某个数值时,就认为两个精灵碰撞在一起。这个距离通常以角色的中心点起始计算。如果各位读者需要自行检测碰撞,GameZero还提供距离距离检测函数:
function distance (a::Actor, target::Actor)
function distance(a::Actor, tx, ty)
为了实现这个游戏,需要准备一些图片素材和音乐素材,原书提供的资源包中包含了这些素材。对各种素材的简单介绍如下:
(1) 在游戏处于3个不同状态时分别显示不同的背景图像。每个状态的背景图像上已经写上相应的提示信息,这样可以减少编程的工作量。
(2) 游戏开始时,玩家有3 颗爱心宝石,每次碰到剪刀就会被扣掉 1 颗。为简化编程,在爱心宝石数量变化时,将显示不同的图像。
(3) 游戏进行中使用的公主、雪花、礼物、剪刀的造型图像采用 PNG 格式。
(4) 在游戏进行中循环播放一首名为《铃儿响叮当》的伴奏曲。(原书资源包提供的是w4a格式的文件,GameZero不支持播放此类格式的音乐,笔者将其转变为MP3格式)
(5) 在公主碰到雪花、礼物或剪刀时播放一个 pop 音效声。
提示:在进入这个游戏的编程介绍之前,希望大家先试玩一下,以便更好地了解这个游戏需要实现的各项功能。所以这里先放出完整的代码供大家下载试玩。