API Chains in Unofficial Help Center may help with this. Some methods are similar, but Phaser 3 often uses config arguments.
Overview
You can use game.scene.add() like Phaser 2’s game.state.add(), but it’s simpler IMO to add all scenes to the game config instead:
new Phaser.Game(
scene: [ Boot, Preloader, MainMenu, Game ]
);
In a scene you should use the scene’s own plugin, this.scene, not the Scene Manager, e.g.,
this.scene.start('Game');
Draw Enemy Animation
You can create animations globally or (as in Phaser 2) on a sprite. For animations used on multiple sprites (enemies, explosions), it would be a little more efficient to use global animations.
In Phaser 3 animation frames can come from any texture, so you have to specify a texture key.
Set Object Anchor
Phaser has originX and originY instead of anchor. Most game object types have a default origin of (0.5, 0.5) already, so you don’t need to set this.
The Game Loop
There is no scene render() callback. There is a similar event callback, but you usually don’t need it.
Apply Physics
Phaser 3 this.physics is the Arcade Physics scene plugin and this.physics.world is its simulation.
There is physics.world.enable(), but it’s usually more convenient to use the physics.add methods:
this.bullet = this.physics.add.sprite(400, 400, 'bullet');
This creates an Arcade Physics Sprite with extra methods and a physics body.
Show Body Debug
This is done with debug: true in the scene or game Arcade Physics config instead.
Collision
There’s no kill() in Phaser 3. Similar is setActive(false).setVisible(false), but for physics sprites you should use
bullet.disableBody(true, true);
Mouse/Touch Movement
There’s no moveToPointer(). Use moveToObject() instead.
Firing Bullets
There’s no keyboard.isDown(). Create a key object in create() and then check its isDown in update().
Fire Rate etc.
I find it easier to create timer events for these things.
How To Play message
There’s no game object exists, but visible would be similar here.
A timer event would be easier for this.
Convert Bullets to Sprite Group
Use
this.bulletPool = this.physics.add.group();
There’s no outOfBoundsKill or similar. You could do this in scene update():
if (
!Phaser.Geom.Rectangle.ContainsRect(
this.physics.world.bounds,
bullet.body
)
) {
bullet.disableBody(true, true);
}
Use getFirstDead() for getFirstExists(false).
There’s no general game object reset(). setActive(true).setVisible(true).setPosition(x, y) would be similar. For physics sprites, use, e.g.,
bullet.enableBody(true, this.player.x, this.player.y - 20, true, true);
Enemy Sprite Group
You could create global animations here instead.
this.anims.create({
key: 'greenEnemyFly',
frames: this.anims.generateFrameNumbers('greenEnemy', { frames: [0, 1, 2] }),
frameRate: 20,
repeat: -1
});
enemy.play('greenEnemyFly');
Randomize Enemy Spawn
this.enemyPool.countActive(false) is the dead (inactive) count.
Phaser.Math.RND is the random number generator.
Player Death
Check this.player.active or this.player.visible.
Convert Explosions to Sprite Group
You could create global animations here instead.
Refactoring create
There’s no Tile Sprite autoScroll, so keep the update code the same.
Using Relative Values
this.scale.width and this.scale.height are the game dimensions.
Enemy Health
Phaser 3 uses event emitters instead of signals. Game objects are also event emitters.
enemy.once('animationcomplete', () => {
enemy.play('fly');
});
But it would be easier to use chained animations instead of an event handler here:
enemy.anims.chain('fly');
There’s no game object health in Phaser 3. You could use the state property for this:
enemy.state = BasicGame.ENEMY_HEALTH;
Then you need to do the damage calculations yourself.
Win/Lose Conditions, Go back to Menu
There’s no need to destroy everything, because stopping the scene will do that.
this.scene.start('MainMenu');
Diagonal Movement
I think this is supposed to be
shooter.rotation = shooter.body.velocity.angle();
Boss Battle
I think you need only 1 boss sprite here.
Sound Effects
MP3 audio is well supported now.
For single audio effects, skip sound.add() and use, e.g.,
this.sound.play('explosion');
instead.
Restore original game flow
No need to destroy things. Stopping the scene will do that.
this.scene.start('MainMenu');