GD50 Lecture 06 - Angry Birds
This is part of a series where I talk about how I approach the assignment portion of the GD50 lecture. These are written so that I can review them in the future without going through the code! Since this is an assignment, I won’t be posting the code unless it is not related to the assignment. If you are stuck at one of these assignments, these posts should contain enough information to help you progress. Feel free to let me know if there is an error. :)
Split the alien into three
The one and only task in the assignment is to spilt the alien into three when ‘spacebar’ is pressed, mimicking the ability of the blue birds in the original game.
TIL that each blue bird has a name: Jay, Jake, and Jim
I started off by creating two flags:
hasSplit. The first flag is used to prevent the player from splitting the alien once it has collided with something, while the second one is to ensure that the player can only split the alien once.
hasCollided flag will be set to true whenever a collision happens (the collision callback function).
If the alien has not collided/split and the space bar is pressed, we can split the alien by creating two more aliens above and below the original alien. The position of these new aliens is the position of the original alien with some Y offset. After the aliens are created, we have to set their velocity by calling
setLinearVelocity() on their body in the Box2D’s world. Instead of using the same velocity as the original alien, I adjusted the Y velocity by increasing the Y velocity for the alien above and decreasing the Y velocity for the alien below. This way, the aliens will look like they originated from one point.
Similar to the original alien, we also have to set the new alien’s restitution (bounciness) and angular damping (to slow down the rotation) using
body:setAngularDamping(). At this point, the splitting process is done and we are ready to set the
hasSplit flag to true.
On every game loop, the game will remove the aliens and destroy their body in the Box2D’s world if their velocity is low enough. When all of the aliens on the field are removed, we reset the slingshot by creating another
AlienLaunchMarker to replace the previous one. At the same time, we reset both of the flags (
hasSplit) back to false.
Bugs & Changes
Alien spawning below the ground
If the alien is close to the ground when it splits, one of the aliens might spawn beneath the ground:
This happens because the ground is just a horizontal line. When we split the alien, the game simply creates another alien below the original alien, and this process can place it below the ground. To fix this bug,
math.min is used to set the minimum height of the alien to just above the ground.
-- Added math.min to make sure the alien spawns above the ground when it splits -- ((VIRTUAL_HEIGHT - 35) - 35) is the ground height minus the alien's height -- Previous code: Alien(self.world, 'round', xPos, yPos + 30), 'Player') Alien(self.world, 'round', xPos, math.min((VIRTUAL_HEIGHT - 35) - 35, yPos + 30), 'Player')
A relatively short post as the assignment only has one task in it. For the upcoming post, we will have a look at the infamous Pokemon!