If you are making a space shooter game in Phaser 3 with Arcade Physics and tried to add a homing or target seeking missile then you've probably run into a problem with the physics bounding box.
It doesn't rotate with the GameObject so collisions won't work properly. This is by design
One solution is to use Matter Physics but that could mean changing a lot of existing code. And potentially breaking many things in the process.
There is another option if you can live with a missile that only registers collisions when the tip or front hits a target.
You can find the example project on Github.
Using a Container
This trick uses a Container with a circle physics body that holds a missile image.
The Container is never rotated. We rotate the child Image instead and then the parent Container is set to move based on where the child Image is facing.
Using a circle physics body means we can keep the collision area the same no matter how the missile image is rotated.
Remember! This means the missile has to hit targets head-first for a collision to register.
The Missile Container Class
First, take note of the constructor to see how the Image and circle physics body is setup.
We are using modern JavaScript in this example.
|
|
The origin of the Image is set to 0.8, 0.5 on line 10. The x value of 0.8 can be adjusted to accommodate the specific missile graphic and radius size.
A physics body is added to the Container on line 13.
Then we determine the radius on line 15 and use it to make the body a circle. The multiplier value of 0.3 can be adjusted to best fit the specific missile image.
It is important to offset the Image by whatever value the radius is as shown on lines 17 and 18.
Next, the update() method handles adjusting direction based on target position and movement based on which direction the Image is facing.
|
|
You can change how nimble and fast the missile is by adjusting the turnDegreesPerFrame and speed properties.
Bonus: GameObjectFactory Registration
We can keep our code idiomatic to Phaser by registering our Missile class with the GameObjectFactory. This is optional but our usage example will assume this was done.
Add this to the bottom of the Missile class file.
|
|
Using a Missile
The Missile class has an update(dt) method that needs to be called. We can access an update loop from the Scene.
Using the Missile class from a Scene will look like this:
|
|
The missile is created on line 27 and then mouse location tracking is enabled on the next line.
Notice the call to missile's update(dt) method from the Scene's update(t, dt) method.
And that is how you can make a homing or target seeking missile using Arcade Physics! 🎉
Next Steps
Turn on debug mode to make sure everything is working properly in your code. Make this change to your game config:
|
|
Don't miss any future Phaser 3 game development tips, tricks, and knowledge-drops by subscribing to our email list!
Just type in your email into the box below and hit the button!
Don't miss any Phaser 3 game development content
Subscribers get exclusive tips & techniques not found on the blog!
Join our newsletter. It's free. We don't spam. Spamming is for jerks.