3.1. 游戏介绍
这是一个考验玩家反应能力的竞速类小游戏-疯狂摩托。如原书图 30-1 所示,游戏的背景画面由高速公路、沙漠、仙人掌等构成,驾驶摩托车(车头朝右)的伊文居于画面左侧,在画面的左上方显示摩托车的行驶速度和里程o 在游戏中,玩家使用键盘的 4 个方向键来操控摩托车。游戏开始时,麾托车速度为 0,经过连续加速,最高速度接近 l40km/h。在摩托车前进的道路上,每隔一段距离就会出现一个作为障碍物的大箱子。当摩托车接近大箱子时,系统会响起报警声提醒玩家注意躲避。在高速行驶时,人的反应能力将变得不可靠,如果玩家不小心碰到障碍物,则摩托车速度降为0。这也提醒我们,在现实生活中千万不要超速行驶,否则后果不堪设想。
这个游戏没有胜负之分,主要用于测试玩家的反应能力。如果要退出游戏程序,可以单击窗口中的“关闭”按钮。
在编写这个游戏之前,先进行试玩,以便更好地了解这个游戏需要实现的各个功能。
源码下载:https://files.cnblogs.com/files/zjzkiss/fkmt.rar
3.2. 编程思路
这是一个精简版本的赛车竞速类小游戏,被设计用于教学目的,主要实现了模拟动画、横屏滚动、 盘操控等技术,现将其编程思路介绍如下。
- 模拟动画
本游戏的骑手和摩托是有动态效果的,让玩家感觉摩托车在开动。原书是通过加载并播放一幅gif动图来实现。但是GameZero不支持播放gif动图,即使加载了gif图,也只能显示一帧静态图片。
所谓gif动图,是一个可以将多幅图像数据存于一起,并逐帧显示到屏幕上,形成简单动画的图像文件。根据这个原理,我们也可以将角色的图片循环更换的方式来模拟动画。
笔者将原书资源包中的摩托动图拆解得到六张图片:
利用Actor的image属性,循环显示这六张图片,即可达到模拟动画的效果。
2.横屏滚动技术
运动和静止都是相对的。在现实世界中,人坐在行驶的汽车里,如果以汽车作为参照物,那么人是静止的;如果以大地作为参照物,那么人是运动的。 这个原理可以被用来设计游戏。 在这个游戏中以一辆车头朝右的摩托车作为参照物,使其在游戏窗口中不移动;另控制一幅沙漠公路的背景图像以摩托车的行驶速度向游戏窗口左侧移动。那么,从玩家的视角来看,就产生了摩托车在沙漠公路上向前行驶的效果。
通过移动背景图像使玩家角色产生运动效果的技术,在游戏设计中被称为屏幕滚动技术。根据需要,可以横向滚动、垂直滚动或者向任意方向滚动,可以向前或向后滚动,等等。在这个游戏中,采用向左横向滚动的方式,并且只能前进,不能后退。
如原书图 30-2 所示,(a)和(b)是完全相同的图像,且图像能够实现无缝拼接。当玩家控制摩托车加速时,(a)的起始位置将向窗口左侧移动,而(b)的起始位置紧跟着(a)结束的位置,这样(a)和(b)就被无缝拼接在一起。 从玩家的视角来看,超出窗口的部分是看不见的,在窗口中呈现的是一幅内容不断变化的背景图像,并且图像向左移动的速度与摩托车的前进速度一致,这样就产生了摩托车向前运动的效果。
在这个游戏中实现背景图像的横屏滚动,需要计算出图30-2(a) 和 (b) 的起始位置。虽然摩托车不动,但是仍然需记录摩托车在X 轴方向的位置变化,并用这个位置计算出图30_2(a)和(b)的起始位置。假设摩托车的X坐标用 motor_x 表示,那么图 30_2(a)和(b)起始位置的X坐标的计算公式如下:
(a)的X坐标: 0-int(motor_x)% 600;
(b)的X坐标: 600-int(motor_x)% 600。
其中,公式中的数字 600 是背景图像的宽度(单位为像素),且窗口的宽度也被设置为600像素。
3.摩托车移动
在这个游戏中,使用键盘上的4个方向键控制摩托车移动,这4个方向键的作用如原书的表 30_1。
表 30-1 用于控制摩托车运动的 4 个方向键的作用
按键名称 |
作用 |
按键名称 |
作用 |
向上键 |
控制摩托车向游戏窗口上方移动 |
向左键 |
控制摩托车减 |
向下键 |
控制摩托车向游戏窗口下方移动 |
向右键 |
控制摩托加减 |
默认情况下,图像的锚点(造型中心)位于左上角位置,但原书是左下角,因此我们可以利用Actor的bottom属性,将锚点设定为左下角。
如原书图30-3当摩托车没有碰到箱子时,摩托车允许在 0~50像素垂直移动,这个距离略小于游戏背景图像中公路的高度。如图 30-3 所示,当摩托车(motor)碰到箱子(box)时,分3种情况进行处理。
第 1 种情况:当摩托车位于箱子的y坐标开始的12像素之内(即 box.y < motor.y <box.y+12)时,摩托车的速度将被降为0,此时摩托车位于箱子左侧,不能前进,但可以向窗口上方或下方移动。
第 2 种情况:当摩托车位于箱子的 y 坐标+l2像索之上(即motor.y >= box.y +12)时,摩托车在垂直方向上只能在box.y+12 到 50 之间移动,此时摩托车会被箱子遮挡,可以继续前进。
第 3 种情况:当摩托车位于箱子的 y 坐标之下(motor.y < box.y)时,摩托车在垂直方向上只能在 0 到 box.y 之间移动,此时箱子会披摩托车遮挡,可以继续前进。
按照上述方法进行处理,使得采用平面图像的游戏能够增加一些立体感,让玩家获得更好的游戏体验。
4.计算摩托车速度和里程
这个游戏采用宽度为 600像素的图像作为背景,摩托车图像的宽度84像素。同时,假设摩托车的长度为2m最高车速为140km/h,从0加速到140km/h 需要10s(即加速度为3.89m/s)。
根据以上数据,先计算出真实摩托车的长度(单位:m)与游戏中麾托车图像宽度(单位:像素)的比值 2/84≈0.24,再利用这一比值计算出游戏中摩托车的最高速度为140/0.024/3.6≈1620(像索/S),加速度为3.89/0.024≈162(像素/S)。这样就实现了按照真实数据模拟麾托车的行驶。
反之,可以将游戏中以像素为单位的麾托车速度和里程换算成现实中以 km 为单位的数据。 假设用变量 motor_speed 表示游戏中摩托车的速度 ,则 motor_speed*0.024*3.6可换算成以 km/h 为单位的行驶速度;假设用 motor_x 表示游戏中摩托车行驶ns秒后的x坐标,则 motor_x * 0.024/1000 可换算成以 km 为单位的行驶里程。 这样可以使玩家更好地感受游戏中摩托车的运动速度。
5.准备游戏素材
为了实现这个游戏,需要准备一些图片素材和音乐素材
原创文章,作者:506227337,如若转载,请注明出处:https://blog.ytso.com/tech/python/278055.html