Navigation

第四节 - 平台

Published on 20th February 2018

我们刚加了一堆代码到create函数中,此函数应该更详尽地解释一下。首先,这一部分:

platforms = this.physics.add.staticGroup();

这一句生成一个静态物理组(Group),并把这个组赋值给局部变量platforms。在Arcade物理系统中,有动态的和静态的两类物体(body)。动态物体可以通过外力比如速度(velocity)、加速度(acceleration),得以四处移动。它可以跟其他对象发生反弹(bounce)、碰撞(collide),此类碰撞受物体质量和其他因素影响。

与此明显不同的是,静态物体只有位置和尺寸。重力对它没有影响,你不能给它设置速度,有东西跟它碰撞时,它一点都不动。名副其实,完全是静态的。所以用作地面和平台很完美,我们打算让玩家在上面来回跑动。

那么什么是组呢?如其名所示,是把近似对象组织在一起的手段,控制对象全体就像控制一个统一的个体。你也可以检查组与其他游戏对象之间的碰撞。组能够生成自己的游戏对象,这是通过便利的辅助函数如create实现的。物理组会自动生成已经开启物理系统的子项(children),省得你处理时跑腿。

平台组做好了,我们现在可以用它生成平台:

platforms.create(400, 568, 'ground').setScale(2).refreshBody();

platforms.create(600, 400, 'ground');
platforms.create(50, 250, 'ground');
platforms.create(750, 220, 'ground');

这就生成了场景,如前所见。

在预加载时,我们输入了图像'ground'。它是个简单的绿色长方形,尺寸是400 x 32像素,将用于我们的基础平台:

image

上述代码的第一行,添加一张新的地面图像到400 x 568的位置(请记住,图像定位基于中心点)——问题是,我们需要这个平台撑满游戏的宽度。否则玩家就会掉出边界。要做到这一点,我们用函数setScale(2)把它按x2(两倍)缩放。现在它的尺寸是800 x 64了,恰好符合我们的要求。要调用refreshBody(),这是因为我们缩放的是一个 静态 物体,所以必须把所作变动告诉物理世界(physics world)。

地面已经缩放、就位,现在该别的平台了:

platforms.create(600, 400, 'ground');
platforms.create(50, 250, 'ground');
platforms.create(750, 220, 'ground');

这个步骤跟前面完全相同,只是不需要缩放,因为他们的尺寸本来就正好。

3个平台已经放到画面各处,距离合适,以便玩家能蹦上去。

那么让我们添加玩家。