通过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中其他区域是黑色的没有内容的抽象空间。