知:赛车游戏与相对运动原理
《极品飞车》一类的赛车游戏,你一定不陌生吧?驾驶着自己心爱的汽车飞驰在赛道上的感觉真是棒极了!不过如果让你去编写这类游戏的时候,你会产生的第一个疑问就是,我怎么实现那种“动”的感觉呢?的确,明明我的汽车角色在屏幕中央并没有怎么移动位置,为什么就感觉一直在向前行驶呢?这就是我们要说的“相对运动”原理。在物理学概念中,物体的运动就是相对于参照物体的位置变化,这个“参照物”很关键,当我们坐在火车上的时候,火车开始了,你首先发现的不是火车动了,而是站台“动”了!这就是位置的相对变化带来的错觉。那么反过来如果车没有“动”,我们让道路、道路两侧的景物“动”起来,是不是就实现了赛车游戏的那种效果呢?
基于这个原理,我们来做一款简单的公路赛车游戏,在游戏开始后倒计时的60秒种内,你的车“行驶”在公路上,不断“超过”一辆又一辆汽车(当然,你本身没有动,是那些车在移动),每超过一辆车就增加分值,如果碰到车或倒计时完成,游戏就会结束,把你的分数加入到排行榜,这个排行榜只保留前6名,所以要用到前面所学的“排序”类知识。
思:程序设计
本节我们设计一款“俯视”的赛车游戏,也就是从天空中看下去的视角。游戏中我们控制自己的车辆在公路范围内左右移动,而其它车辆的克隆体不断地从上方移过来,如果碰到它们,游戏就会结束。为了制造车辆一直在“行驶”的错觉,我们需要给道路增加一种“向后移动”的效果,这实际上是通过两个背景来回切换来实现的;道路两边还各添加一个房屋角色,在游戏过程中它们产生的克隆体也会向下移动,这样就产生了动态行驶的效果。
程序角色设计如下:
行:编程实现
1、准备好游戏的背景和角色。鉴于Scratch中没有类似可代替的资源,建议你使用随书资源中的素材。你会注意到这里的背景是一条公路,两侧是绿色的草地,而背景的两个造型几乎完全一样,只有道路中心线的位置不同,这样在切换造型的时候会有一种道路在向下方“移动”的感觉。这个舞台上的角色除了主角外还有其它车辆、房屋,开始和结束的信息显示、终点线角色。在游戏开始时它们都是隐藏的。另外建立了得分和时间两个变量,以及一个“历史得分”列表。
2、先为背景编写代码,它在游戏开始后不断更换造型实现动画效果。游戏结束时变暗以显示Game Over信息:
3、游戏启动角色就是赛车开始之前显示的3、2、1倒计时和Start指令,它在本游戏中起到了一个“导演”的角色,由它控制倒计时,当发生碰撞或游戏胜利时执行游戏结束逻辑,通过“插入得分”自制积木将得分计入排行榜。这个插入得分自制积木会将当前得分与列表中所有项比较,实现最大的项放在最前面。得分插入后,为了不让排行榜一直增长,会删除末尾的元素,只保留前6项:
4、为公路两侧的房屋1、房屋2编写代码,它们的造型有细微不同,代码也只是克隆体出现的位置不同,克隆体出现之后就一直向下移动到舞台边缘消失,这会增加游戏的动态感。为了不至于让人感觉生硬,我们让这两个角色等待一个随机的秒数之后再进行克隆,防止房屋很有规律地出现:
5、为公路上其它车辆编写代码,它们在游戏开始时不断克隆自己(也是随机的等待时间),克隆体会更换不同的造型,从舞台上方向下移动,如果与主角的距离小于一个值(这个值你可以通过试验自己确定)就广播碰撞消息,游戏结束。因为我们设定的规则是超过一辆车加10分,所以在每个克隆体删除之前会增加得分变量的值。
6、终于轮到主角了,我们控制的车辆只接受左右方向键消息,而且要判断不能让它超出公路的范围。在游戏开始后它会播放一段让人热血沸腾的背景音乐,就好像你在驾驶车辆过程中听着音乐一样:
7、显示Game Over消息的角色代码:
8、终点就是赛车游戏最后要通过的那段灰白格子,我们把它也做成了一个角色,在倒计时结束,游戏胜利时让这个角色从舞台上方向下移动到主角车辆位置,表示我们越过了终点线:
9、编程结束,本节课程各个角色之间的交互还是比较多的,如果测试过程中发现角色的逻辑不对,你可以对比文中代码仔细检查自己的程序,确保不因疏忽而让自己的游戏可玩度降低。
悟:总结与拓展
相对运动原理对开发游戏来说太重要了,如果你能通过本节课程的学习掌握了它,就可以用来实现更多好玩的游戏,比如魂斗罗、超级马利奥等横版过关游戏或者飞机大战等竖版过关游戏,仔细想一想,还有哪些你玩过的游戏用这种方式让你产生了好玩的“错觉”呢?你能“看”出游戏的创作者是怎么实现的动态游戏场景吗?