通过api文档得知,在phaser3框架中存在一个world类型。经过我的观察,在实际的网页小游戏的开发中,其实并没有大量的使用到world这个类型。换句话说,我们只是在初始化phaser时,phaser自动将world类初始化为默认的状态和配置,没有去手动的修改它的配置。所以下面来讨论一下phaser3中world的作用到底是什么。

根据官方api文档的描述:The Arcade Physics World. The World is responsible for creating, managing, colliding and updating all of the bodies within it. An instance of the World belongs to a Phaser.Scene and is accessed via the property physics.world.(Arcade物理引擎中的world。world是负责创建、管理、碰撞和更新其中的所有实体。world的一个实例是属于一个phaser.Scene的。并且可以通过属性physical.world来访问。)

由此可知,world是属于phaser中的物理引擎的,比如在arcade或者matter引擎中。它是一个抽象的空间,该物理引擎中的游戏对象都生存于这个World中。我们可以通过camera来看到world里的内容。在phaser的默认情况下,world的尺寸大小与scene是完全相同的。我们知道,要新建一个游戏,需要先确定游戏的区域,例如我们建立一个1800x1600分辨率尺寸大小的游戏区域。但是在Phaser中,我们除了设置游戏区域的大小之外,还可以设置world的大小,world的大小一般大于等于游戏区域大小,默认情况下就是等于游戏区域的大小。world提供了更大的范围,我们可以利用照相机在世界中移动,从而看到不同的地方。

上面说到了camera照相机,照相机也是有大小的,它的大小默认是等于游戏区域大小。照相机区域内的东西会被渲染到游戏区域中,而照相机在world中移动,就能够在游戏区域中看到world的不同部分了。

因此world有点像我们所谓的超大世界地图的概念了,我们可以缩放游戏区域的显示范围,因而从游戏窗口区域看到更多或者更少的内容。 下面是一个演示phaser中world功能的代码。效果如图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
var config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
parent: 'phaser-example',
pixelArt: true,
physics: {
default: 'arcade',
arcade: {
useTree: false,
gravity: { y: 100 }
}
},
scene: {
preload: preload,
create: create,
update: update
}
};

var spriteBounds;
var blitter;
var controls;

var game = new Phaser.Game(config);

function preload ()
{
this.load.atlas('atlas', 'assets/tests/fruit/veg.png', 'assets/tests/fruit/veg.json');
}

function release ()
{
for (var i = 0; i < 100; i++)
{
var pos = Phaser.Geom.Rectangle.Random(spriteBounds);

var frame = 'veg0' + Phaser.Math.Between(1, 9).toString();

var bob = blitter.create(pos.x, pos.y, frame);

bob.angle = 0;
bob.scaleX = 1;
bob.scaleY = 1;
bob.displayOriginX = 0;
bob.displayOriginY = 0;

this.physics.add.existing(bob);

bob.body.setVelocity(Phaser.Math.Between(200, 400), Phaser.Math.Between(200, 400));
bob.body.setBounce(1);
bob.body.setCollideWorldBounds(true);

if (Math.random() > 0.5)
{
bob.body.velocity.x *= -1;
}

if (Math.random() > 0.5)
{
bob.body.velocity.y *= -1;
}
}
}

function create ()
{
this.physics.world.setBounds(0, 0, 800 * 8, 600 * 8);

blitter = this.add.blitter(0, 0, 'atlas');

spriteBounds = Phaser.Geom.Rectangle.Inflate(Phaser.Geom.Rectangle.Clone(this.physics.world.bounds), -100, -100);

// Create 40,000 bodies at a rate of 100 bodies per 100ms
this.time.addEvent({ delay: 100, callback: release, callbackScope: this, repeat: (40000 / 100) - 1 });

var cursors = this.input.keyboard.createCursorKeys();

var controlConfig = {
camera: this.cameras.main,
left: cursors.left,
right: cursors.right,
up: cursors.up,
down: cursors.down,
zoomIn: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.Q),
zoomOut: this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.E),
acceleration: 0.06,
drag: 0.0005,
maxSpeed: 1.0
};

controls = new Phaser.Cameras.Controls.SmoothedKeyControl(controlConfig);

this.cameras.main.scrollX = 2770;
this.cameras.main.scrollY = 2036;
this.cameras.main.zoom = 0.12;
}

function update (time, delta)
{
controls.update(delta);
}

上面这段代码首先将游戏区域设置为800x600,在这个区域中设置了很多乱飞的小型游戏对象,然后将world设置为(800x8)x(600x8),相当于world的宽高都是游戏区域的8倍,并且设置了照相机缩放的功能。这样我们就可以通过Q和E按键,实现了对world显示视野的缩放。所以world中有乱飞游戏对象的区域就是那一小块,world中其他区域是黑色的没有内容的抽象空间。