In order to create a game in GameMaker: Studio, you need a minimum of three types of resource assets: a Sprite (what you see), an Object (what it does), and a Room (where it happens). On top of these, you can also have Scripts, Backgrounds, Sounds, Fonts, Paths, and Time Lines.
Each resource that you can bring into GameMaker: Studio has its own properties editor. In order to get acquainted with each of them, we are going to build a very simple game of cat and mouse. We will create a player character (a mouse) that can move around the room, collect items (cheese), and avoid an enemy (a cat). Let's dive right in by creating some sprites.
Sprites are bitmap images that are intended to be used for the graphical representation of an object. These can be a single image or an animated sequence of images. GameMaker has its own image editor to create these, but also allows JPG, GIF, PNG, and BMP files to be imported.
For our example, we are going to start by creating two sprites; one for a wall and one for a player character. If you have downloaded the support files, we have supplied image files for this in the Chapter_01
folder.
We will start with a simple Sprite that will represent the walls of our game.
spr_Wall
.Chapter 1/Sprites/Wall.png
and click on OK.The player in this game is going to be a mouse and the Sprite consists of two frames of animation.
spr_Player
.Chapter 1/Sprites/Player.gif
. Check the box for Remove Background and Smooth Edges. Click on OK.16
and Y to 16
, or you can just click on the Center button.Congratulations! You have created your first sprites. We will be going deeper into the creation of art assets in the following chapter, so let's move onto Objects.
This is where the real power of GameMaker: Studio truly shows itself. Objects can be thought of as containers that hold the properties, events, and functions that we want each item in the game to do. When we place an object into the game world, it is called an instance and it will operate independently from all other instances of that object.
Before we move on, it is important to understand the difference between an object and an instance of that object. An object is a set of rules that describe something, while an instance is a unique representation of that something. A real-world example would be you are an instance of a human object. A human is something that has arms, legs, speaks, sleeps, and so on. A you is the unique interpretation of these elements. An example of this concept can be seen in the preceding diagram.
The reason this is important is because depending on the functions being used, the effect will be applied either to all of the items of that type or to the individual item. Generally you wouldn't want to shoot an enemy and then have all the enemies in the world die, would you?
Continuing with our example, we are going to create a Wall object and a Player object. The Wall is going to be a stationary obstacle, while the Player is going to have controls allowing it to move around the world and collide with the Wall.
We will start with the solid Wall object that we can use to create a maze for the player.
obj_Wall
.spr_Wall
.GameMaker treats collision with solid objects differently than non-solid objects. If a solid object and a non-solid object collide, GameMaker will try and prevent them from overlapping by moving the non-solid object back to its previous position. Of course, in order to do this properly, the solid object has to be stationary. Therefore, we should add the solid property to the Wall.
The Player object will introduce us to using Events and Actions for things, such as movement and collision.
obj_Player
.spr_Player
as the Sprite.GameMaker's power comes from its event-driven system. Events are moments and actions that occur during the running of a game. When you add an Event to an Object, you are asking the item to respond to that action when it occurs, and then apply the assigned instructions.
Sounds fairly straightforward, doesn't it? Well it can be a bit confusing when it comes to the order of events. GameMaker breaks down the game into steps (finite moments of time), which run the events many times every second. Some events happen in a preset order, such as Begin Step, which always starts at the very beginning of the step. Other events happen whenever they are called, such as Create, which is run immediately when an instance of an object is created, to check whether that code occurs at the start or end of the step.
Go to http://wiki.yoyogames.com/index.php/Order_of_events to learn more about GameMaker: Studio's order of events.
Events need Actions to be applied for them to do anything. GameMaker: Studio uses a drag-and-drop (DnD) system where icons representing common behaviors can be easily implemented. These have been separated into seven different tabs based on functionality. For the vast majority of this book we are going to use only the Execute Script icon found in the Common tab, as we will be writing code placed into Scripts. In this chapter, however, we will use the DnD Actions, so that you get an understanding of what they do.
8
. This will apply a velocity of eight pixels per step.Now we have an object that will move around the world when the arrow keys are pressed. However, if we were to run this, once we started moving, we would be unable to stop. This is because we are applying a velocity to the object. In order for us to stop the object, we need to give it a velocity of zero.
0
.The last thing we need to do is to add our collision detection. Collision in GameMaker: Studio is a single event comprising two instances. Each instance is capable of executing an event call on this single collision, though it is generally more efficient to put the code on only one of them. In our case, it makes sense to put a Collision Event on the Player for when it collides with a Wall, as the Player will be the instance that does something. The Wall will remain where it is, doing nothing.
0
. Click on OK.The actors are ready; we have some objects that can be seen and do something. Now all we need to do is put these into a room.
Rooms represent the world in which the instances of our objects live. Most rooms you create will likely be used as various levels, but rooms can also used for:
We want to lay out a world that will contain the player as well as presenting some obstacles. To do this, we are going to place down wall objects around the outer edges of the room and place a few lines in the center.
32
. This will create a placement grid with snapping points every 32 pixels.rm_GameArea
.obj_Wall
.Now you might be thinking that this is going to take a painfully long time to build the room, click by click. Don't worry, there is an easier way. If you hold down Shift + Ctrl, you will be able to paint the world with the instances. If you make a mistake and want to remove an instance, just right mouse click to delete one instance, or hold the Shift key to de-paint the instances. If you just want to move the instance a tiny bit, as in not a whole grid unit, hold the Alt key down.
Don't forget to add the Player in!
obj_Player
.obj_Player
into the room in the lower-right corner of the room.While creating a game, there are three different types of compilations that can be done. If the game is 100 percent complete, you can select Create Application for the target platform. If the game is still in development, there is Run Normally, which will compile and run the game as if it were an application, and Run in Debug Mode, which runs the debugging tools.
Let's not wait any longer. Run the game by navigating to Run | Run the Game, or by pressing F5.
If everything is working correctly, the player object should be able to move around the world using the arrow keys, but not be able to pass through any of the wall objects. However, there is something not quite right. The player object appears to be flickering due to it being animated. Let's fix this while taking a look at the Script Properties editor.
GameMaker: Studio utilizes its own proprietary scripting language called GameMaker Language
, otherwise known as GML. This language was developed to be very forgiving to the novice user, and utilizes some functionality you likely won't find in other scripting languages. For example, GML will accept the standard expression &&
to combine two comparisons, or alternatively the word and
. GameMaker: Studio does a lot of hard work when it comes to creating games by giving the user a great set of functions, variables, and constants.
As previously stated, we want to stop the player object from animating. This is very easy to do using scripts.
scr_Player_Create
. Throughout this book we will be naming most of our scripts with the name of the event at the end of the name. In this case we will be placing this code into a Create
event.image_speed = 0;
In order for the script to run we need to attach it to an object.
obj_Player
.scr_Player_Create
as the script to execute, and then click on OK.We can now run the game, and we see that the player object is no longer animating.
Backgrounds are a special kind of art asset that come in two different types: background images and tilesets. Unlike Sprites, backgrounds never have any animation as a part of the art asset. Background images are mainly used as large backdrops of a room and are useful if you want the background to move. Tilesets are small slices of art that can be used to paint the background, are useful for creating large, unique worlds, and to keep the graphics cost computationally low.
For this simple example we will just create a static background. We will look more into tilesets in the next chapter:
bg_Ground
.Chapter 1/Backgrounds/Ground.png
.We now have the art asset ready to go, we just need to place it into the room.
rm_GameArea
.backgrounds
tab.Each room allows up to eight backgrounds to be displayed simultaneously. These backgrounds can also be used as foreground elements. If no background is active, it will display a solid color.
bg_Ground
as the background to be displayed.0
.Let's run the game again and we can now see that we have a background. Things are definitely looking better, but something is missing. Let's get some sound into the game.
The Sound Properties editor is where you can bring in sounds to be used in your games. GameMaker allows you to bring in MP3 and WAV files only. There are two types of sounds that you can use:
Normal sounds are all the small sound effects that you hear, such as gunfire and footsteps. These should generally be WAV files. Background music is for the longer sounds such as the game music, but also things such as spoken dialog. This should be in MP3 format.
When GameMaker: Studio exports the game audio for HTML5, all sounds will be converted to both MP3 and OGG format. This is due to the fact that different browsers use different audio file formats in their implementation of the HTML5 audio tag. Luckily for us, GameMaker: Studio automatically adds browser identification code into the game, so the game knows what files are being used.
We are going to create two sounds for the game, some background music and a sound effect for a collectible object.
Let's bring in some music to our game to help build some atmosphere.
snd_bgMusic
.Chapter 1/Sounds/bgMusic.mp3
file. If you want to hear the music, just hit the play button. When you are done listening, hit the stop button.We will want to have the music start right at the start of the game. To do this we are going to create a data object that we will call the Overlord . Data objects are generally not meant to be seen in the game, so we do not need to assign it a Sprite.
We will be using an Overlord object to watch over the game and control things, such as the music and win/lose condition.
obj_Overlord
.snd_bgMusic
, set loop: to true
, and then click on OK.Before we test this out, we need to make sure the Overlord is in the world. When you place it into a room, it will be represented by a little blue circle icon, as shown in the following screenshot:
rm_GameArea
.obj_Overlord
from the objects tab and place a single instance in the room.Let's run the game and listen. Music should start playing right away and loop infinitely. Let's move on to creating a collectible.
We are going to create an object that the player can collect during the game. When the player collides with it, the sound will be played once.
snd_Collect
.Chapter 1/Sounds/Collect.wav
file and set it to Normal Sound, and then click on OK.We haven't created an Object for this, nor have we brought in a Sprite. Now is a chance for you to test your memory. We will only quickly go over what we need.
spr_Collect
.Chapter 1/Sprites/Collect.png
and center its origin.obj_Collect
.spr_Collect
as its Sprite.obj_Player
.sound:
field to snd_Collect
and set loop: to false
.Now when the player collides with the object it will play the sound once. That's a good start, but why don't we give the player a bit more of a reward?
50
, check the box for Relative, and then click on OK. This will add 50 points to our score each time the object is collected. Relative makes the score add to the previous score.Now we have something worth collecting. Only one issue remains and that is we get the points and sound just for touching the object. We can't let that go on forever!
Let's place a couple of these collectibles into the room and run the game. We should be able to move the player around the world and collide with the collectibles. We should hear a sound play and the object disappears. But where is our score? Well, in order to display it, we need to bring in some text.
You can import fonts to use them as text in your games. These fonts need to be installed on your machine in order to use them during development. Each font resource is set to a specific font type, size, and whether it is bold/italicized or not. If you want a slight variation, such as a font that is two points larger, than a separate font resource must be created. This is due to the fact that on export, GameMaker will convert the font into an image that will allow it to be used without the font being pre-installed on the user's machine.
We are going to create a font that will be used to display the score of the game.
fnt_Impact
.16
. Then click on OK.We now have a font that we can use in our game. For this, we are going to have the Overlord object draw the game score at the top of the screen. We will also make the text white and align it to the center.
obj_Overlord
.fnt_Impact
and align it to center
. Click on OK.320
, the y: field can remain at 0
, and remove Score:
from the caption: field, leaving it blank as can be seen in the following screenshot. Click on OK.We can now run the game and the score will now be displayed at the top of the screen in the center. When you collide with the collectibles now, you should see the score increase.
Paths are the best way to create complex movement patterns for objects. A path is made up of a series of points in which an object can move along. The transition between points can be straight, meaning the object will hit each point precisely, or curved, an interpolation between three points. The path can either be an open line or a closed loop. The following screenshot will be used as the reference image throughout this section.
We are going to create a simple enemy that will follow a path around the room. If the player collides with the enemy, the player will be destroyed. Let's start by creating the path.
pth_Enemy
.rm_GameArea
.To add a point for the path you can just left-click anywhere on the map. The very first point will be represented by a green square and all the points following will be circles.
64
, 64
of the map. If you make a mistake you can always drag the point to the proper position, or you can manually set the X and Y values.The path is ready for use, now we just need to create an enemy to attach the path to. This enemy is going to simply move along the path and if it collides with the player, it will restart the game.
spr_Enemy
.Chapter 1/Sprites/Enemy.png
and center the origin.obj_Enemy
.pth_Enemy
.4
.We now have an enemy ready to follow a path, but it isn't really a threat to the player. Let's put a collision event on the enemy and make it restart the game on contact.
obj_Player
, navigate to Actions | Main2, and drag the Restart Game icon into the Actions: area.We've now got some risk in the game, but not enough reward. Let's fix that, shall we?
Time Line is an advanced time tracking system that allows finite control of things that happen during gameplay. A Time Line is comprised of a list of moments. Each moment represents a number of steps from when the Time Line started.
While a Time Line can be used for almost anything, one of the most common uses for one is to spawn instances. In this game, we are going to use it to spawn our Collectible objects, so that the player has something to chase after.
tm_Spawn_Collectibles
.60
.obj_Collect
.-64
.random(394) + 48
.4
, and set the direction: field to 0
. It should look like the following screenshot. Click on OK.120
and repeat the previous steps except this time make it vertical. To do this, the x: field should be set to random(546) + 48
, the y: field should be -64
, the speed: field should be 4
, and the direction: field should be 270
.We now have a Time Line that will spawn a new moving Collectible every two seconds. However, we need to attach this to an object so let's apply this to the obj_Overlord
.
obj_Overlord
.tm_Spawn_Collectibles
.0
; this will start it from the beginning.Loop
.There you have it! Run the game and you should see the collectibles start to spawn after two seconds and continue to be created forever. As you can see from the following screenshot, our game is complete, but there is still one component we need to take a look at.
13.58.116.51