Shooters in GameMaker J Parker Scrolling Shooter In a scrolling shooter the player controls an object, for example a plane, spaceship, or car, which moves over a scrolling background. Obstacles appear on the background that must be avoided and enemies appear that must be shot. Often bonus objects appear that can be picked up for addition benefits. Examples: Space invaders, Galaxian 1945 The player flies in a plane over a sea and enemy planes try to destroy the player. Variable A new concept in GameMaker, a variable is a property of an object that can be changed. - The position of an object has an X and Y value - The speed of an object has a horizontal and a vertical part - The score is a variable - The height and width of the room are variables Etc etc etc Variable A variable can be used to save an important value for later use (EG position of an enemy) A variable can represent a property of an object that is important and needs to be used by the game. A variable can be modified by the game, thus modifying how the corresponding object looks and behaves (EG change object’s speed) Variable Changing a variable’s value is done as follows: On the CONTROL tab find Testing a value uses the button. Setting a variable Testing a variable 1945 Design • Description • In this game you control a plane flying over a sea. You encounter an increasing number of enemy planes that try to destroy you. You should avoid these or shoot them. The goal is to stay alive as long as you can and to destroy as many enemy planes as you can. Game objects The background is formed by a scrolling sea with some islands. The player’s plane flies over this 1945 Game objects The background is formed by a scrolling sea with some islands. The player’s plane flies over this sea. You can shoot bullets that destroy enemy planes. There are four types of enemy planes: a plane that you encounter and should be destroyed, a plane that fires bullets downwards, a plane that fires bullets towards the player’s plane, and a fast enemy plane that comes from behind rather than from the front. 1945 Sounds There are some explosion sounds and there is some background music. Controls The player controls the game with the arrow keys. With the space key you fire a bullet. Only one bullet can be fired every five steps. 1945 Game flow The player immediately jumps into the game. The player has three lives. When all lives are gone a high-score table is shown. Pressing the <F1> (help) key will give a brief explanation. Pressing the <Esc> key will end the game. Levels There is just one level, but more and more enemy planes will arrive: first only the easy type but later the more difficult types. Motion – An Illusion There are two possibilities for creating the motion illusion: • use a tiling background image that moves downwards through the room. • build a much larger room but only show part of the room using a so-called view. This view slowly moves upwards over the room. We will use a moving background. Water We need a background image that looks like a sea viewed from above. We add the following small image as a background resource to the game and give it the name back_water: Filling the background with it will give a nice looking sea. Water In a scroller, the background image should move. To create a room with a moving background, add a room to the game in the familiar way. At the left click on the tab labeled backgrounds. We need to change three settings here. 1. First of all, because we are going to fill the whole room with the background image, so uncheck the box labeled Draw background color. Water Second, in the middle click on the menu icon and select the back_water background image. The default setting is to tile the whole room with it so this is what we want. Finally, we need to make the background move. To this end, at the bottom, set the Vert. speed to 2. Now try it. Motion, water, islands, ... • To enhance the feeling of motion we are going to add a few islands to the sea. • An easy way would be to create a larger background image and add the island to this background. Iislands will appear in a regular pattern, which the player soon notices. (Bug Bunny) So we choose a slightly more complicated approach and add the islands as objects. Motion, water, islands, ... Create three sprites with the following images We will never use them for collision checking so uncheck the box Precise collision checking. For each of the islands we create an object. In the creation event we give the object a vertical speed that is the same as the scrolling speed of the background. Motion, water, islands, ... • To make sure that all other objects will stay above the islands we give the island objects a Depth of 10000. • (You must run Game Maker in advanced mode to be able to do this!) Instances of objects are drawn in the order of the depth. The instances with highest depth are drawn first. Instances with lower depth are drawn on top of them. So by giving the islands a high depth they will always be drawn first and lie below the other objects. Now – a trick! When the island disappears below the bottom of the room we want to make it reappear at the top. In the Step event of the island we test whether the island disappeared below the screen and, if so, let it reappear at the top. Note that the variable y indicates the vertical position of the instance. ...... a trick! A value of 0 corresponds to the top of the room. The variable room_height indicates the height of the room. So the island disappears below the bottom of the room when y is larger than room_height. We can use the action to test variable values to see whether the island lies below the room... ...... a trick! So: When the island moves off of the screen at the bottom, and can not be seen any longer, it causes a copy of itself to be made above the screen (where it can not be seen) and at a random horizontal position. It will then move down, onto the screen (becoming visible) and off again, repeating... Only one instance will be seen at a time. This is actually computer programming! ...... a trick! Motion Motion ...... a trick! You can use a variable name, and can actually type full expressions here. So the process is: In Island object select a STEP event and choose the ‘If a variable has a value’ action. The room (what you can see) has a vertical size (in pixels) of room_height, and starts at a value of 0. This is the ‘y-axis’ as they told us in high school. The position of the island is the variable y. So if y > room_height then we want to move the island. Where to move to? Negative values of y are above the screen (room). Move islands to y = -65 Moving to the same x position is dull. Select a random x within the room random (room_width) This is in a jump to a given position box in the same STEP event. The player’s airplane Is controlled by keys. The sprite we’ll use is a small GIF animation. Makes it look like the propellers are moving. Can shoot – space key. Should look like the shooting comes from the centre of the plane. Sprite is 65 pixels, centre is 32,32 Player Motion events (initially) are the arrow keys. Plane must not leave the room, so check! <left> if X is larger than 40 Jump to given position -4, 0 relative to current. Player Similar for the other 3 directions: <right> <up> <down> if X is smaller than room_width-40 Jump to 4, 0 relative to current. if Y is larger than 40 Jump to 0, -3 relative to current. if Y is smaller than room_height-120 Jump to 0, 3 relative to current. The player’s cannon We need a bullet sprite. We put its origin in the centre as we did for the main plane. To make it a bit spectacular we use a rather large bullet. Exaggerating things is often important in games. Create an object with this sprite. Creation even: give it a vertical speed of –8 to make it move upwards. Destroy it once it leaves the room - in the step event we test whether the variable x is smaller than –16. The player’s cannon In the plane’s object box, make an event for pressing the <space> key. This event creates a new bullet instance. An idea: only create one if there are no others. Use the TEST INSTANCE COUNT as we did with diamonds before. The player’s cannon We don't want too many bullets too fast. How about two bullets every second? This is one bullet every 15 steps. Use a variable can_shoot This is created in a create event for the plane by using a set variable command box. We initially set can shoot to 1 (true) CAN SHOOT Now in the event, keyboard, space key event: – Is CAN SHOOT equal to 1? If so, create a new bullet in front of the plane (0,16) set CAN SHOOT to 0. Set alarm0 to 15. alarm0 ??? Alarms An alarm is an ‘automatic’ event that happens when a specified number of game steps have taken place. It is like a timer. If we set alarm0 to 15, then it becomes 0 in 15 steps. At that time and alarm0 event happens, and we can use that to set the CAN SHOOT variable back to 1 again. Thus we can shoot every 15 steps. Blocks We also need to group actions in the <space> event. Enemy Planes Type 1: It is a small plane that simply flies downwards. It does not shoot but when it hits the main plane the game is lost. 1. Create sprite, read it in. 2. Create object, assign sprite, vertical speed=4 3. When plane hits the botton it redraws at randome above the room. Needs: collision with bullet, with player. Enemy 1 Collision with bullet: it explodes and vanishes Use ADD SOUND and load an explosion noise. These are WAV files, prerecorded. Need a sprite for the explosion, origin 16,16. It is a small animation. Once it finishes playing there is an event called ANIMATION END that we use to destroy the sprite (actually, we’ll MOVE it) Bullet action,collision with plane1: delete self Enemy 1 Collision with player: it explodes and vanishes Use an explosion noise. Game is over: print message and stop. High Score The Game should get harder... We start with one enely plane, and spawn more and more, and different kinds. How do we do that? Using a game agent. We create one more object: controller_enemy. It will control the creation of enemy planes. We make the object invisible during the game by unchecking the box labeled Visible. A sprite is not required for it. The Game should get harder In its creation event we create an enemy place at a random location just above the room. (the first enemy) We also set the alarm clock to 200. In the event for this alarm clock we create another enemy plane and set the alarm clock again, but this time to 500. The effect is that at the beginning of the game there is one enemy plane. After 200 steps, that is, about seven seconds, a second • enemy plane appears. After about 15 seconds, a third plane appears, etc. High Score