Page 1 Game Prototyping: Game Maker Tutorial 3: Galactic Mail Game Maker Tutorial #3: Galactic Mail; Copyright 2006, Mark Overmars from his book (our course textbook) Game Maker Apprentice. The important lessons from this tutorial include the use of Events and Actions to change Sprites and Objects ‘on the fly.’ You will also dig deeper into Depth to control the order in which instances of Objects are drawn so that everything looks properly on screen. You’ll be introduced to variables such as ‘x,’ ‘y,’ and ‘direction’ – Game Maker includes many such built-in variables and the power that they give you to make games is enormous. In Galactic Mail, the player is an intergalactic mail carrier who must deliver mail to a number of inhabited moons. He must safely steer a course from moon to moon while avoiding dangerous asteroids. The mail carrier is paid for each delivery made, but pay is subtracted for time spent hanging around on moons. The tricky part is orienting the rickety, old rocket as it does not steer very well in space. When your game is finished, it will look something like this. I. Building the Sprite assets In Catch the Clown and Evil Clutches you learned about adding Sprites to your game. Now we’re going to explore some of the extra abilities that Sprites can have. Before we do this, however, you must be using the Advanced Mode of Game Maker. A. If you are currently working on a game in Game Maker, save it. Then click on File in the top menu and find Advanced Mode. If there is a checkmark in front of it, then you’re already in Advanced Mode. If not, select it and you will be. You’ll know that you’re in Advanced Mode when the listing on the left includes things like Paths, Scripts, Fonts, and Time Lines. Okay, let’s start a new game! Go to File / New. B. Step one is always asset creation, and Sprites are a good place to start because video games are so visual. Because you’re an artist, you should see this through an artist’s eyes. Note that you’re working with 2D Sprites in Game Maker, not 3D Models. It is important that you acquire an understanding of old school ‘sprite work’ in game graphics, and these game prototyping classes using Game Maker will be quite instructive for that. One of the powers that using Advanced Mode affords us is defining each Sprite’s Origin Point. This is used to control its exact position on the screen. The default setting for a new Sprite is the top-left corner of the graphic image. Think of it this way, if this were an analog game piece, you’d be moving it around by its top-left corner. In Galactic Mail, however, the rocket needs to sit in the center of the moons, so we’re going to change the Origin Point of our Sprites so that they are centered. Copyright © 2006 by Alan Emrich. All rights reserved. Page 2 1. From the top menu, choose Add / Add Sprite or just click on the little red Pac-Man on the icon bar at the top. Now you’re ready to create a new Sprite asset for your game! Name it spr_moon (i.e., “sprite: moon”). Then click on the Load Sprite button and, in the Assets / Graphics folder, select Moon.gif to be the graphic image for this 2D Sprite as shown in the picture here: Note that all of the items in the Assets folder are named to match the asset that you’ll be creating in these Game Maker tutorials. You’ll find it very easy to locate the appropriate graphic or sound files. When you see these illustrations, I will circle key things that you need to do or look for. What you need to do with this Sprite, now that you’re in Advanced Mode, is to enable the Smooth edges feature of Game Maker by checking that box (as shown). This will make the Sprite look less jagged on the screen by automatically making its edge pixels slightly transparent. Next, you need to Center the Sprites’ Origin Point. Simply click on the Center button and you’ll notice that the ‘x’ and ‘y’ coordinated went from 0, 0 (the top-left corner of the Sprite) to 32, 32 (of this 64 x 64 pixel-size Sprite). You can see this in the graphic image of the moon; suddenly it has ‘cross-hairs’ in its center (showing you where its Origin Point is). Click OK to close and save this Sprite. 2. Now create the asteroid (spr_asteroid) and explosion (spr_explosion) Sprites in exactly the same manner. Use their associated graphics, enable Smooth edges, and then Center their respective Origin Points. 3. The rocket will requite two Sprites and we’ll need to dynamically change it between them during the game! We need one Sprite for the rocket flying through space, and another when it is resting on a moon. Create these two Sprites, spr_landed and spr_flying, in exactly the same manner (i.e., Smooth edges on and its Origin Point Centered). Copyright © 2006 by Alan Emrich. All rights reserved. Page 3 C. Now for a quick side-voyage of exploration. That last Sprite, spr_flying, I want you to “open it up” by pressing the Edit Sprite button and looking at the screen shown below: What you’re looking at is Game Maker’s built-in ‘operating table’ for Sprite graphics. If you scroll down this Sprite, you’ll see that it has 72 different images, each at a slightly different orientation (5°) from the one before it. You’re going to use all of these to show the correct image as the rocket smoothly turns in the game. If you want to see what the ‘animation’ of this Sprite looks like, check the Show Preview box. There’s more than one way . . . Making several images in a Sprite to show it turning is the classic, ‘old school’ way of doing beautiful 2D art as each can enjoy lovingly individual lighting effects. In Game Maker, Sprite rotation can be done mathematically by the computer ‘on the fly’ when using the Transform the sprite Action. This can save you a lot of work in Photoshop, my friend. You can use this Sprite Editor to change Sprites in a lot of different ways. You can experiment with some of the controls now, if you like – just don’t save anything you’re not happy with! Armed with these five Sprites, we need some sounds now… II. Building the Audio assets As you learned from the previous tutorials, creating audio assets is very similar to creating art assets in Game Maker. From the top menu, choose Add / Add Sound or just click on the little speaker icon on the bar at the top. Name this new sound spr_explosion (i.e., “sound: explosion”). Then click on the Load Sound button and, in the Assets / Audio folder, select Explosion.wav. If you want to listen to it, click on the green button as illustrated here; to stop it playing, press the red ■ button. Close and save the form by clicking OK. The ‘Play’ and ‘Stop’ buttons are here. Then create snd_bouns and snd_background in exactly the same way using their .wav and .mp3 (or .midi) files, respectively. Those are the assets; let’s make the game now! Copyright © 2006 by Alan Emrich. All rights reserved. Page 4 III. Moons and Asteroids Both the moons and asteroids will fly around the screen in varying straight lines. When they fly off one edge of the screen, they will ‘wrap’ to the opposite side. ‘Wrapping’ in Game Maker is easy! 1. From the top menu, choose Add / Add Object or on the little blue ball ● icon on the bar at the top. Name this new Object obj_moon (i.e., “object: moon”). Assign to it spr_moon. Then add a Create Event. For it’s only Action, Set direction and speed of motion for its self with the direction: ‘random(360)’ and speed of ‘4’ as shown below: Random (What?) In Game Maker, there are several built-in functions that you can call, such as ‘random.’ ‘Random’ tells the computer to generate a random number from 0 to whatever value is shown in the (parenthesis) that follow it. For example, the ‘direction’ for our moon Object is a number that represents degrees up to 360 (like a compass). Therefore, setting what direction it should be moving when it’s created is a random degree (i.e., ‘random(360)’). For the moon’s second Action, add an Other: Outside Room Event with its sole Action to Wrap when moving outside. It applies to self (i.e., this affects instances of obj_moon) and set the direction so that it works ‘in both directions’ (i.e., all four edges of the screen ‘wrap’) as illustrated here. That’s it for obj_moon. Click OK to close and save it. Copyright © 2006 by Alan Emrich. All rights reserved. Page 5 2. Now, the asteroid Object functions the same way with one slight alteration. When the screen is drawn each ‘turn’ (i.e., every 30th of a second), we want the asteroids drawn behind the other Objects on the screen. We do this by using the Depth function as described in the sidebar, You Gotta Have Depth. Right-click on obj_moon in the asset listing on the left side of the screen and Duplicate it as shown in the illustration on the right. You Gotta Have Depth Instances of Objects are usually drawn in the order in which they are created, making it hard to tell which Object will appear in front of another. In Game Maker, we can change this setting using the Object’s Depth value. Instances with smaller Depth values are drawn last, on top of instances with a higher Depth value. Then double-click on the new (duplicate) object and rename it obj_asteroid and, naturally, assign it spr_asteroid for its graphic element. All of the ‘rules’ for it (i.e., its Events and Actions) are copied in place and correct. The only change you need to make is on the left side: change the Depth to ‘10,’ as shown here. IV. Testing this out This is good time to see if everything you’ve done so far actually works according to plan. To test these Object, you must first create a Room and place instances of these Objects in them. Before we create that Room, however, we’ll create an asset for its background art. 1. From the top menu, choose Add / Add Background or just click on the little landscape portrait icon on the bar at the top. Name this new Background background_main and all of the default settings for it are fine. You’ll notice that the size of this background is 640 pixels wide by 480 pixels tall, which is the same size of the game screen we’ll be using. Unlike the Catch the Clown game (which uses a small background image that is ‘tiled’ to cover the room with copies of it), Evil Clutches and this Galactic Mail game use a single large graphic element for their backgrounds. Click OK to save and close this Background asset. Copyright © 2006 by Alan Emrich. All rights reserved. Page 6 2. From the top menu, choose Add / Add Room or just click on the blank screen icon on the bar at the top. If the whole Room isn’t visible, then enlarge the window so that it is. You’re going into ‘Level Designer mode’ right now, and you want to see the whole operating table. Select the settings tab and name this new Room room_first. A good Caption for the room would be ‘Galactic Mail’ as shown here. Notice that the default settings for the Room’s Width and Height are fine; we want a 640 x 480 Room. Next, select the backgrounds tab and, where it says <no background> change it to background_main via the pull-down menu symbol to its right as shown here. Ooooooh, pretty! Stars . . . Now select the objects tab and get ready to operate! Place a handful of obj_asteroid and obj_moon instances in the Room, selecting them in the bottom-left corner of the window. Be sure to read the italicized instructions beneath the selection display and try a few of them out! You should have a Room that looks something like this: You can find this phase of construction in file galactic1.gm6. Do your own work, please. Only use this version for comparison in case something isn’t working right in your build. So, save your game (File / Save as) somewhere you can easily find it again. Then go to Run / Run normally or simply press the green play button on the top menu bar. Before continuing, double-check that everything is working according to the rules (i.e., Events and Actions) that you’ve created. Are the moons and asteroids moving in different random directions? Do they reappear on the other side of the screen when they leave the room? Do the asteroids always pass behind the moons? Copyright © 2006 by Alan Emrich. All rights reserved. Page 7 IV. Let’s rock it! (Er, I mean, “rocket.”) It’s time to create the game’s interactive experience and start building the gameplay. Earlier, I mentioned that you’ll need two different rocket Objects, but let me explain why this is necessary. It is because our rocket has two distinctly different ways of behaving: sitting on top of a moving moon (when a player has full control over its direction), and flying through space where the player has only limited control. Instructing one Object to behave in two different ways can get very complicated checking for different Events and Actions all the time. However, if we separate these behaviors between different Objects it becomes quite simple. And here’s the best part: If the Objects look the same, the player will never know that we’ve ‘switched them’ on her! In this case, the flying rocket and the landed rocket look the same, so the illusion is perfect. In the same way, we need tow different moon Objects, as we want the landed rocket to follow the path of one particular moon around (the one it has landed on). By making this moon its own Object, we’ll be able to single it out from the plethora of other moons. A. Once again, right-click on obj_moon on the asset list and Duplicate it as shown on the right. Rename this new edition obj_specialmoon and set its Depth to ‘-5.’ This will guarantee that this moon is always drawn in front of the other moons (as its value is lower than 0). Also, we’ll have make this special moon responsible for starting the background music at the beginning of the game. Add an Other: Game Start Event and for its sole Action it should Play a sound for snd_background and make sure that Loop is set to true as shown below. C l i c k o n O K t o close and save the properties form. Finally, open up your Room (room_first) and replace one of your moons with this obj_specialmoon. You won’t see any difference (since they both use the same Sprite), but you should hear a difference as the background music will start to play. Now for the rocket Objects. Copyright © 2006 by Alan Emrich. All rights reserved. Page 8 B. Remember, we’re creating two rocket Objects; let’s start with the ‘landed’ version. Create a new Object called obj_landed and assign it spr_landed. Set its Depth to ‘-10’ as shown here so that it appears in front of the moons and looks like it’s sitting on the surface of obj_specialmoon. Add a Step: End Step Event. Just so you know, and End Step Event means that its Actions are performed just before instances are drawn at their new positions on the screen. Thus, we can use this Event to find out just where obj_specialmoon has moved to so that we can be sure we’re placing obj_landed at the exact same location just before both of them are drawn on the screen. Taking That Step (Event) The Step Events in Game Maker build the game’s Sequence of Play. That is, these are the Actions that are checked every single ‘Game Turn’ (i.e., 30th of a second) and performed. There are Step, Begin Step, and End Step Events, depending on how early (or late) in the Sequence of Play you want those Actions performed. In this case, we’re using an End Step Event which means it is the last thing checked before the drawing is done on the screen (which is always the last item in the game’s Sequence of Play each Game Turn). For the first Action, Jump to a given position. This allows us to move it exactly where we want – and where we want it to go is at the ‘x’ and ‘y’ coordinates of the special moon itself, right? In Game Maker we can say that by setting ‘x’ to obj_specialmoon.x and ‘y’ to obj_sepcialmoon.y as shown here. Make sure that you type in the names carefully, including the underscore and the dots! This might be a good time to test things out. Save obj_landed and place one instance of it anywhere in your Room and run the game. The rocket should jump to the position of the special moon and stay on top of it as it moves around. Yes, I know, your rocket is spinning around on the moon. We’ll fix that next. Just know that the Sprite for the rocket is an animation of 72 frames showing the rocket turned in 5° increments (5° x 72 = 360°). By default, Game Maker automatically cycles through a Sprite’s subimages to create an animation. But that is now what we want for this game; instead, we need Game Maker to select an appropriate subimage based upon the rocket’s trajectory. Subimage = direction/5 If you open it up and look at the Sprite spr_landed, you’ll notice that the first subimage (number 0) faces right and that each subsequent subimage is rotated left (i.e., in a counter-clockwise direction). This is because, in Game Maker, 0° is facing to the right screen edge (not toward the top of the screen, as you might expect), and degrees are added going counter-clockwise, not clockwise as they are on a compass. Thus, when the rocket is moving toward the top of the screen, it is moving in direction 90°. If you divide 90 by 5, you would get 18, which would be subimage 18 of the Sprite, which shows the rocket going straight up – perfect! The speed is set to ‘0’ so that the subimage is ‘paused’ there and does not animate. That requires a tiny bit of math. Game Maker tracks the direction of all Objects by degrees, so it can work out which rocket subimage to use by dividing the rocket Object’s current direction by 5 (as we’re using 5° increments). Thus, we’ll soon be writing ‘direction/5’ below to set the current subimage in a Change Sprite Action. Back in the Properties screen for obj_landed, we need to add a second Action to the End Step Event. In main2, select Change the sprite for spr_landed to submiage ‘direction/5’ at speed ‘0’ as shown on the left. “Direction” is a special term that Game Maker recognizes as meaning the direction that this instance is currently facing. “Speed” is the animation speed for that Sprite, and setting it to ‘0’ means ‘pause’ or ‘don’t play’ that animation. Copyright © 2006 by Alan Emrich. All rights reserved. Page 9 Next we have to be able to alter the trajectory of the landed rocket before we shoot it back off into space. We’ll use the <Left> and <Right> arrow keys for this. Add a Keyboard <Left> Event for obj_landed with its sole Action being to Set direction and speed of motion. The direction is ‘direction+10’ and the speed is ‘0’ as shown here. What ‘direction+10’ means is to turn the rocket 10° counterclockwise. Setting the speed to ‘0’ will keep the rocket in place on the moon (we’ll be setting its speed when we ‘launch’ it with the <Space> key). Add a similar Keyboard <Right> Event, only set the direction to ‘direction-10’ so that it turns 10° to the right this time. The last control we need is to ‘launch’ the stationary rocket (obj_landed) and turn it into the flying rocket (obj_flying). But since we haven’t created obj_flying yet, we’ll have to make that first and then come back here. C. Create a new Object called obj_flying, assign it spr_flying, and set its Depth to -10 to make sure that it appears in front of the moons. For its first Event, add an Other: Outside Room Event and for its only Action you want it to Wrap when moving outside set to ‘in both directions’ (just like the moons and asteroids) as shown here. Add a Step: End Step Event with a Change the sprite Action. Change it into spr_flying with the subimage of ‘direction/5’ and speed of ‘0’ as shown to the right. Do you remember what the Game Maker built-in variable “Direction” means? Why are we dividing it by 5? Why is the speed set to ‘0?’ If you don’t know the answer to these questions, reread the last section and make sure you understand why. It’s going to be an important lesson in future tutorials! Copyright © 2006 by Alan Emrich. All rights reserved. Page 10 When the rocket is flying you can turn it to the left and right as well, just not nearly as fast as you could while on the moon preparing for launch. Again, we’ll use the <Left> and <Right> arrow keys. Add a Keyboard <Left> Event and for its only Action, Set the direction and speed of motion in direction ‘direction+2’ and speed ‘6’ as shown. While flying, the rocket can only turn 2° at a time, as opposed to 10° while on a moon. Then create a similar Keyboard <Right> Event with the same speed but make the direction ‘direction-2’ so that the rocket rotates to the right instead of the left. The basic gameplay is almost there. The following Events and Actions will tie up the core gameplay mechanics. In obj_flying, add a Collision Event with obj_asteroid. Its only Action is to Restart the game as shown here. Obviously, hitting asteroids is how the player ‘loses.’ We’ll polish this up later with a cool explosion effect and sound, but we’re just trying to build the core gameplay right now and get our game prototype up and running. Next, add a Collision Event with obj_moon. Pay attention now! The first Action is to Change the instance of self into obj_landed (you do not want to perform event). The second Action is to Change the instance of other (obj_moon, in this case) into obj_specialmoon (again, do not perform events). Now, what we just did here is a little sneaky – we changed the instances of these two Objects right before the player’s eyes so quickly (in 1/30 of a second) they never knew what happened. I hope you understand the logic as to why we did that! Copyright © 2006 by Alan Emrich. All rights reserved. Page 11 Finally, save obj_flying and open obj_landed. It’s time to ‘blast off’ by adding a Key Press <Space> Event. Its first Action is to Set the direction and speed of motion for its self to ‘direction’ at speed ‘6’ as shown here. Do you understand why the direction is ‘direction’? We’re saying to move “in the direction that this Object is currently facing.” For the next Action, you want to Change the instance of self into obj_flying without performing its events. By changing the instance, this game piece has now become obj_flying with all of its associated rules. The last Action to complete our prototype is to Destroy the instance of Object: ‘obj_specialmoon’ as shown here. This is very clever; what this does is remove moons that the player has already landed on and delivered the mail to so that they have to keep going to the other moons. It works in this game because there is only one obj_specialmoon in play at a time. If there were more, this Action would destroy them all. Thus, you need to be careful about using it with you own game ideas. You can find this phase of construction in file galactic2.gm6. Do your own work, please. Only use this version for comparison in case something isn’t working right in your build. Your prototype is done! Check it out to make sure that you can rotate the rocket on a moon, launch it with the space bar, and steer it through the asteroids to land on another moon. While the prototype is already fun to play, we want to put some more features in, such as a scoring mechanism and advancing the player to the next level once the last moon has received its mail. We also want to add some sound and graphic polish to the game to make it more compelling to play. Copyright © 2006 by Alan Emrich. All rights reserved. Page 12 V. Winning and losing We’ll establish the score here, but let’s start with a cool effect to make asteroids more explosive. A. Create a new Object called obj_explosion and assign it spr_explosion and set its Depth to ‘-10’ so that it is drawn in front of the moons and asteroids. Add a Create Event where the only Action is to Play a sound for snd_explosion and you don’t want it to loop. (Background music loops, sound effects don’t.) Then add an Other: Animation End Event to end the game. The first Action is on the score tab where you want to Show the highscore table. To make this table more visually appealing, set the background to the same one used in the game (background_main) and give the other color some better contrast (such as bright yellow). Also, make the font more legible with 12-point Arial bold as shown. The second and final Action here is to Restart the game. Click OK to seal the deal. To apply this new explosion and call it into the game, open up obj_flying and go to its Collision Event with obj_asteroid. Delete the Restart the game Action that’s already there (obj_explosion already does that). Add an Action to Create an instance of an object and set it to ‘obj_explosion’ at the default settings of x:’0’ and y:’0.’ However, be sure to check the ‘Relative’ box, because you want the explosion to occur relative to where the collision event just occurred, not the absolute position of 0,0 (which is the top-left pixel on the streen). Then, Destroy the instance of self to remove the rocket from the screen. The game is over, after all. Copyright © 2006 by Alan Emrich. All rights reserved. Page 13 You can test your game now. Try colliding into an asteroid to see if you get a cool explosion. Of course, you can’t rack up any points for the High Score table yet, so that’s what we’ll do next. B. Now for the score. Because you are an advanced player and hard-core gamer, you will have noticed that a sure way to avoid being hit by an asteroid is patiently waiting for your moon to sidle up next to another and hop between them. While not ‘cheating’ per se, this technique takes a lot of fun out of the game and discourages risky behavior. To encourage jumping off moons faster and taking more risks, we’re going to make the game’s scoring system such that players receive points for delivering mail, but lose points for lollygagging about on a moon. Thus, through the carrots and sticks of using the game’s score, we can encourage more risky / rewarding / exciting gameplay. Open up obj_specialmoon and select the Game Start Event. Add another Action, this time to Set the score to ‘1000’ points as shown below. By giving the player some points to lose, they’ll want to jump off the first moon right away! Click OK to close the form. Then open up obj_landed and select its End Step Event. Add an Action to Set the score ‘Relative’ to ‘-1’ as shown. That is, every 30th of a second the player dawdles on a moon, they lose a point relative to their score: that’s 30 points per second! Click OK to close the form. Next, open up obj_flying and select its Collision Event with obj_moon. Add a new Action that will Set the score ‘Relative’ to ‘500’ points for delivering the mail. Then another Action to Play a sound for snd_bonus such that it doesn’t loop as shown. You can test your game again now and see if the score works. Next, we have to work on levels and a more satisfying ending when the player delivers all the mail. Copyright © 2006 by Alan Emrich. All rights reserved. Page 14 Roomy, Isn’t it? It is important to note that the order of the rooms in the resource list on the left side of the screen is the order that they occur as levels in your game. The top-listed room occurs first and so on through the bottom-listed room going last. To change their order, just drag and drop them into the position that you want them on your list. C. Presently, after all the mail is delivered, you must leave the last moon and crash into an asteroid to end the game. Lame! Obviously, we want the player to advance through more levels of everincreasing difficulty which, in Game Maker, is as simple as adding new Rooms. We can use Events and Actions to move the player between Rooms. So, let’s make some new levels (Rooms)! Open up the Rooms folder on the asset list along the left side of your screen and right-click on room_first, then select Duplicate as shown here. This will create an exact copy of your first room. Go to the settings tab and rename it ‘room_second.’ Then select the objects tab and add or remove instances of Objects using the left and right mouse buttons. Important: make sure that each level (Room) contains exactly one instance of obj_specialmoon and one instance of obj_landed! That two Rooms; you should have three for now (and you can make more later). So, Duplicate this room and make a third level. D. Having Rooms created isn’t the same as being able to move between them. For that, we have to know under what circumstances the player needs to be moved from Room to Room. In this game, we want to advance to the next level when there are no moons left in the current Room. Is that a “Level” or a “Room?” These two words are completely interchangeable for our purposes in creating game prototypes and games when using Game Maker. A “level” is a “Room” and a “Room” is a “level.” To do this, we will use a “Conditional Action.” You can spot these in Game Maker by their blue octagons, some of which are illustrated to the left. They ask a question and, if they get the desired answer, then the next Action is performed; if not, it is skipped. If more than one Action is to be performed next, then they must be placed together in a “Block” of code using the ▲ and ▼ symbols to ‘contain them’ as shown on the right. In this game, we’re going to ask the question “Is the total number of remaining moons equal to zero?” If the answer is “yes” (or, in computer terms, “true”), then a Block of Actions will be performed; otherwise, the answer is “no” (or “flase”) and this Block of Actions is skipped. Open up obj_flying and select its Collision Event with obj_moon. At the end of its current list of Actions, add a new one to ask the question: If the number of instances is a value for obj_moon being Equal to ‘0’ as shown to the right. Now, if the answer is “yes” (or “true,” in computer terms), then there are several things that we need to do, so add the Start of a block of Actions, please, so that they will all be performed (or skipped, if “false”) together. Copyright © 2006 by Alan Emrich. All rights reserved. Page 15 First, let’s pause for a moment to let the player absorb the fact that they’ve hit the last moon on that level. Therefore, the first Action in this Block is to Sleep for a while with its default of ‘1000’ milliseconds (i.e., 1 second) being just fine. Then we’ll reward the player for complete the level. The next Action is to Set the score ‘Relative’ to ‘1000’ points. Finally, in the main1 tab under ‘Rooms,’ select Go to next room with the transition effect you desire (although the default setting of ‘no effect’ is perfectly fine). You can find this phase of construction in file galactic3.gm6. Do your own work, please. Only use this version for comparison in case something isn’t working right in your build. Then you want to note that this is the End of a block of Actions by adding that symbol so it looks as shown. Note that Blocks of Actions are indented so that you can easily see that they belong together. You can test your game again now and check to see if you progress through the levels. If you defeat the last level, however, you will receive an Error Message. Don’t panic – fixing that is next on our To Do List, along with some additional finishing touches. VI. Finishing touches Here we’ll fix that end-game error, add a Splash screen (or ‘Title’ screen) to the game, a Help screen, and a Cheese screen (or ‘Congratulations’ / ‘End Game’ screen). We’ll also add some nice visual touches to add variety to our moons and asteroids. A. The Splash screen is first. We’ll need a new Object to display the name of the game and perform some initial tasks. This Object would be a good place to do some ‘housekeeping’ chores like starting the music and setting the initial score. The Splash screen will stay on until the player presses a key to enter the first level. Create a new Sprite called spr_title using the appropriate artwork file. Like the other Sprites, give it Smooth edges and Center its Origin Point as shown to the left. Because you left ‘Transparent’ selected, all of the green pixels will be invisible. You’ll see how this works visually in our design in a moment. Then create its Object, called obj_title using the above, newly-created Sprite, and set its Depth to ‘1’ so that the moons go in front of it and the asteroids go behind it. Its first Event is a Create Event where you will do all of the game-start ‘housekeeping.’ That is, you want to start the game’s music and set the player’s score to 1000 points. But wait! You have already done this in obj_specialmoon’s Game Start Event! What you’re going to do is copy those Actions over and paste them into obj_title’s Create Event. Add a Create Event for obj_title (if you have not done so already), then open up obj_specialmoon and select its Game Start Event. Copy (or Cut) the two Actions (play snd_background and Set score to 1000) from obj_specialmoon and Paste them into the Create Event of obj_title. Then delete the Game Start Event for obj_specialmoon (you don’t need it anymore because those ‘housekeeping’ chores are now handled by obj_title). The result of all this is shown below: Copyright © 2006 by Alan Emrich. All rights reserved. Page 16 Then add a Key Press <Any Key> Event with its only action to Go to next room as shown here. Click OK to wrap this Object up. To put this new Splash screen, obj_title. into the game, we need a Room for it before all of the others. Create a new Room called room_title with an appropriate caption such as ‘Welcome to Galactic Mail.’ In the backgrounds tab, give it the game’s background image. In the objects tab, add just a few moon and asteroid instances to “pretty it up a bit.” Then add one instance of obj_title in the center of the Room and drag it around until you have it where you want it. Close the Room and drag it on the Asset List along the left side of the screen so that it is the first room encountered. Quickly test your game to make sure your Splash screen comes up first, the music starts, your score is set to 1000, and pressing any key starts the game. B. That error at the end of the game is next to go. When the game ends, we should congratulate the player. Must as we did the Splash screen, we’re going to make the end-game Cheese screen. Create a new Object called obj_finish. All of the default settings are fine, including not having a Sprite! Add a Create Event and for its first of four Actions, Display a message. Type in something like, ‘Congratulations!#You’ve delivered all the mail!’ The ‘#’ symbol functions like the <Enter> key when you’re typing; it puts the text that follows it on the next line down. The second Action is to Set the score ‘Relative’ to ‘2000’ points as a game completion bonus. The third Action is to Show the highscore table with the background, other color, and font properties that you set before. The last Action is to Restart the game as shown here. This is in addition to the other way to end the game and Copyright © 2006 by Alan Emrich. All rights reserved. Page 17 see the High Score table, which is in obj_explosion that you get when you crash into an asteroid! Finally, create a Room called ‘room_finish’ captioned ‘Galactic Mail’ and assigned the game’s background (‘background_main’). Place only one instance of obj_finish in the center of the room. Quickly test your game to make sure you don’t get an error message when you complete the game. If you want to move room_finish up the list so that it’s right after room_first, that will get you to the end of the game that much quicker. Just be sure to put it back after you playtest this new feature! C. Let’s break up the monotony of the moons and asteroids and vary their looks. With a different moon Sprite and a little use of the random command, we can fix that. Open up obj_moon and click on the Edit button below the object’s Sprite. This is just another way of opening up the Sprite’s Properties screen, as shown below. Click on Load Sprite and select the basis.gif file. What you’ll see is a moon with a ‘base’ on it in the upper-left corner. If you examine it further, you can see that there are a total of eight different subimages for this Sprite. Now, click OK and close the Sprite form. Back on the obj_moon screen, click on the Create Event and add a Change the sprite Action. Change the Sprite into ‘spr_moon’ but for the subimage type in ‘random(8) and set the speed to ‘0.’ Now, if you’ll recall, speed ‘0’ means ‘pause’ (that is, freeze the animation at that subimage). The meaning of ‘random(8)’ in Game Maker is, “pick a random number from 0 to 7.” That is, Game Maker always starts counting at 0 and goes to one less than the number you input. That value, chosen randomly, will be the Sprite subimage used when that moon discovers that it has been created in your game. Thus, each moon will have a random subimage assigned to it. Copy that Action then click OK to close up that window, and then Paste it into the exact same place for obj_specialmoon and click OK to close it. You don’t have to change the Sprite here as they both share the same one. Finally, open up obj_asteroid and add a new Change the sprite Action to the end of its Create Event. This time, of course, you want spr_asteroid, but now we’re going to get clever. For the subimage, type in ‘random(180) – yes, there are 180 subimages, each 1° apart – and Copyright © 2006 by Alan Emrich. All rights reserved. Page 18 for the speed, let’s vary that, too, with ‘random(4)’ as shown below. That will vary both the starting image and the speed that it rotates (i.e., the speed that its animation plays) for each asteroid. D. Help information All right, you could stop here and bask in your creative genius for a while. But before you move on to your next game, you need to leave the player some instructions. It may seem blindingly obvious to you how to play your masterpiece, but a new player picking it cold will rarely find it so obvious. You can’t have a newbie write your game off as ‘bad’ because you didn’t take a moment to explain how to play it! Always provide help instructions (and in Game Maker, that’s easy). Double-click on Game Information near the bottom of the Asset List along the left side of the screen. This opens up a text editor where you can write to the player. Typically, you should input the name of your game, its author(s), a short description of the back story and goals, plus a list of the game’s controls. When you done, close the screen to save it. Below is a sample of what you might write for the Game Information for Galactic Mail. Galactic Mail You play an intergalactic mailman who must deliver mail to a number of inhabited moons. He must safely steer a course from moon to moon whilst avoiding dangerous asteroids. The mailman is paid for each delivery he makes, but pay is deducted for time spent hanging around on moons. This adds pressure to the difficult task of orienting his rickety old rocket, which cannot steer very well in space. (Note that once mail has been delivered to a moon it will be removed from your targeting computer to avoid confusion). Copyright © 2006 by Alan Emrich. All rights reserved. Page 19 Controls: While you are on a moon: <Left> rotate launching direction counter-clockwise <Right> rotate launching direction clockwise <Space> launch the rocket While in space: <Left> rotate direction of motion counter-clockwise <Right> rotate direction of motion clockwise General controls: Press <F4> to swich full-screen mode Press <Esc> to end the game Credits: Programming: Your Name Here Graphics: Kevin Crossley Music and Sound: Jacob Habgood Original Concept: Jacob Habgood and Mark Overmars You can find this phase of construction in file galactic4.gm6. Do your own work, please. Only use this version for comparison in case something isn’t working right in your build. That’s all there is to it. When the player presses the <F1> key during play, the game will pause and this screen will appear. Test your game to make sure that everything works, from the <F1> key, to randomized moons with buildings and asteroids, and you congratulations when players complete the game. Copyright © 2006 by Alan Emrich. All rights reserved. Page 20 VII. Additional ideas for improving this game You should start by making more levels, of course. Levels with faster-moving asteroids or smaller moons to make things harder would increase the gameplay challenge. You’ll notice that a larger planet Sprite and a smaller planetoid Sprite have been include with the graphics for the game, so incorporating those with your moon Sprite will give you three sizes to choose from so that you can start players on easier (larger) bodies and progress them through to smaller ones. Since you’re an artist, you can even vary the size of the asteroids yourself by using the game’s Sprite Editor tools. Duplicate spr_asteroid to make spr_asteroid_small or spr_asteroid_large, and then press the Edit Sprite button, in the Sprite Editor, select Transform / Resize Canvas (for larger asteroids, make it about 125%; for smaller ones try 80%). After the size of the canvas has been changed, then go and Scale Images the same percentage. Well, you’ll figure out all that art stuff... Create your modded game’s .gm6 file with a notes so that I can play it and look out for the changes you made in either the art, audio, pieces (new objects), rules changes, additional levels (i.e., new Rooms), etc. You will be graded for up to 10 points on effort for applying what you’ve already been taught about Game Maker by these three tutorial lessons and cleverness teaching yourself a little something new by discovery as you noodle around in Game Maker and explore it a bit on your own this week. Copyright © 2006 by Alan Emrich. All rights reserved.