我们知道,在 Scratch中,舞台总是固定的,我们的游戏总是局限在小小的舞台中。
为了扩大玩家的活动范围,我们希望制作滚动大型地图,即背景可移动的大型地图。
简单办法:
一种最简单的办法就是,让玩家固定在中心,然后按下移动键时,让地图朝反方向移动(比如按下右移键,地图左移,这样看起来是玩家往右走,实际上玩家没有动,是地图往左走)。
玩家始终固定在中心,实际上是在移动地图
这样看起来效果也不错,但是如果要添加敌人,敌人该怎么运动呢?敌人在自己运动的同时,还要考虑跟随背景的移动,这个时候问题会变得比较复杂。
变量的力量:
为了解决这个问题,我们需要借助变量的力量:
- 首先,对于地图上的所有物体,比如玩家、敌人、子弹,我们为他们新建私有变量“位置x”、“位置y”,用来记录自己在地图上的位置。
- 然后,需要两个公共变量,“整体偏移x”、“整体偏移y”,用于保存地图的整体移动。
- 最后,对所有玩家、敌人、子弹等实体,使用下面的代码移到对应的位置:
(注:本教程中,名字前带 * 号的变量,表示这是一个私有变量(作者命名习惯))
这样,角色自身的移动、视野整体的移动就实现了分离:
- 当需要角色移动时,通过修改变量“位置x”、“位置y”来改变角色在地图的位置。
- 当需要整体移动时,则修改整体偏移x,整体偏移y。通过整体偏移,实现视野移动。例如“整体偏移x”增加 10,则整体右移 10(相当于视野左移了 10)
动手尝试:
接下来,我们动手尝试一下:
- 首先新建玩家角色、背景角色,并给他们添加造型(这里直接使用素材包中的造型)
- 为玩家新建私有变量“位置x”,“位置y”(记得选择“仅适用于当前角色”)
- 创建两个公有变量“整体偏移x”、“整体偏移y”(创建时选择“适用于所有角色”)
- 为玩家编写如下的移动代码:
- 初始时移到位置(0,0);
- 通过 WASD 移动;
- 给“背景”角色(注意是角色,不是舞台背景)添加下面的代码:
对比玩家的代码,背景角色由于一直固定在中心不变,所以直接填 0,0 而不需要额外变量记录背景的坐标。
运行结果:
看起来好像没什么特别的,对吧。
这只是玩家移动的部分,接下来,我们编写代码,控制整体的移动:
这样,当按下 ↑↓←→ 键,可以进行整体的移动;而当按下 WASD 键,可以控制玩家移动。
然后,我们就可以分别控制玩家,以及整体的移动:
那么,实现整体的移动有什么用呢?
实际上,整体的移动可以看成视野的反向移动:例如下面的整体往左移动,实际上也就是视野往右移动。
所以我们可以将代码作如下修改:
- 将变量“整体偏移x”和“整体偏移y”重命名为“视野x”“视野y”(在积木栏右键变量,可以重命名);
- 将 “+”号 改成 “-”号:
这样,我们通过下面的代码,实际上就实现了视野移动:例如,视野y增加,就是上移视野,其他同理。
运行效果:通过上下左右可以控制视野的移动
(虽然效果和刚刚是一样的,但是理解上,之前是控制整体移动,现在是控制视野移动)
实际上,“视野x”和“视野y”还有个更“专业”的名字:“摄像头x”、“摄像头y”。我们可以再将他们改名为“摄像头x”“摄像头y”。
最终代码:
最终,代码看起来应该是这样:
- 通过改变摄像头坐标,来移动视野(增减“摄像头y”来上下移动,增减“摄像头x”来左右移动);
- 改变角色的“位置x”“位置y”来移动自身位置;
- 通过每帧让角色移到 (位置x - 摄像头x, 位置y - 摄像头y),来移到正确的位置。
运行效果:WASD 移动玩家,上下左右移动摄像头
<iframe
width="100%"
height="800px"
scrolling="no"
src="https://www.ccw.site/embed?id=STG202/Arkos/Lec1/01&type=comment"
title="{射击1-让地图动起来}"
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen
scrolling="0"
></iframe>