Introduction To Game Design & Programming in GameMaker Studio 2
Page 11
The sprite for this is shown in Figure 7_48:
Figure 7_48: Showing sprite spr_asteroid_large
Create Event
/// @description Set Movement
ang=irandom_range(150,210);
x=room_width+200;
y=irandom_range(100,room_height-100);
motion_set(ang,4);
rot=choose(-1,1);
Sets a random angle between 150 and 210 (30’ each way from 180’), sets the start location 200 pixels off of the right side of the window, and a random y position between 100 and room height less 100. Sets moving at a speed of 4, and rotation clockwise or anti-clockwise.
Step Event
/// @description Rotate
image_angle+=rot;
Rotates each step.
Collision With obj_player Event
/// @description Damage player if no shield
if other.shield>0
{
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=60;
instance_destroy();
}
else
{
audio_play_sound(snd_lose_health,1,false);
health-=3;
other.flash=true;
other.alarm[0]=room_speed/2;
instance_destroy();
}
When it collides with player, checks for shield. If shield is active it makes a coin bubble instance and destroys itself. If the shield is not active the player loses health, shows damage and the asteroid is destroyed.
Collison With obj_player_weapon_parent Event
/// @description Damage Control
ast=instance_create_layer(x,y,"Asteroid",obj_asteroid_medium);
ast.direction=direction-20;
ast.speed=speed+1;
ast.rot=rot*-2;
ast=instance_create_layer(x,y,"Asteroid",obj_asteroid_medium);
ast.direction=direction+20;
ast.speed=speed+1;
ast.rot=rot*-2;
with other instance_destroy();
instance_destroy();
If hit by a player’s primary weapons, two new smaller asteroids are created, the projectile is destroyed and the current asteroid is destroyed.
obj_asteroid_medium
A medium asteroid that the player can shoot at. If shot it creates smaller asteroids. Damages player if player hits it.
Figure 7_49 shows the sprite set up for this object.
Figure 7_49: Showing spr_asteroid_medium
Step Event
/// @description rotate
image_angle+=rot;
Collision With obj_player_weapon_parent Event
/// @description Damage Control
ast=instance_create_layer(x,y,"Asteroid",obj_asteroid_small);
ast.direction=direction-20;
ast.speed=speed+1;
ast.rot=rot*-2;
ast=instance_create_layer(x,y,"Asteroid",obj_asteroid_small);
ast.direction=direction+20;
ast.speed=speed+1;
ast.rot=rot*-2;
with other instance_destroy();
instance_destroy();
Creates 2 new small asteroids, and destroys projectile and self.
Collision With obj_player Event
/// @description Damage Player If no Shield
if other.shield>0
{
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=30;
instance_destroy();
}
else
{
audio_play_sound(snd_lose_health,1,false);
health-=3;
other.flash=true;
other.alarm[0]=room_speed/2;
instance_destroy();
}
Checks for player’s shield and act accordingly.
obj_asteroid_small
A small asteroid that the player can shoot at. If shot it creates a coin bonus instance for the player to collect. Damages player if player hits it
Figure 7_50 shows the sprite for this object:
Figure 7_50: Showing sprite set up for spr_asteroid_small
Create Event
/// @description Set Up
image_speed=0;
image_index=irandom(5);
Prevents animation and chooses a random sub image.
Step Event
/// @description Rotate
image_angle+=rot;
Rotates in the given direction (when created by obj_asteroid_medium)
Collision With obj_player Event
/// @description Damage Player if no shield
if other.shield>0
{
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=15;
instance_destroy();
}
else
{
health-=1;
other.flash=true;
other.alarm[0]=room_speed/2;
audio_play_sound(snd_lose_health,1,false);
instance_destroy();
}
Creates a coin or damages player, depending if the player’s shield is active or not.
Collision With obj_player_weapon_parent Event
/// @description Make Coin
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=20;
with other instance_destroy();
instance_destroy();
Creates a coin instance if hit by player’s primary weapons.
obj_spawn_poles
Creates foreground instances to create a better parallax effect.
Create Event
/// @description Set an Alarm
alarm[0]=(room_speed*10)+irandom(room_speed*10);
Alarm 0 Event
/// @description Spawn obj_pole
alarm[0]=(room_speed*10)+irandom(room_speed*10);
instance_create_layer(room_width+300,room_height/2,"Foreground",obj_pole);
obj_pole
A foreground object that moves across the window, and moves up and down in relation the player’s movement.
Figure 7_51 shows the sprite set up for this object:
Figure 7_51: Showing sprite set up for spr_post
Create Event
/// @description Set Up
hspeed=-6;
image_speed=0;
image_index=irandom(8);
Moves left at a speed of 6. Prevents animation and chooses a random sub_image.
Step Event
/// @description Check & change position
if x<-1000 instance_destroy();
player=obj_player.y
y=(room_height/2)-player+550;
Moves up and down, taking into account the player’s y position.
obj_info
Tells the player what the bonus they collected does.
Figure 7_52 shows the sprites and set up for this object:
Figure 7_52: Showing spr_info
Create Event
/// @description Set Up
image_speed=0;
alarm[0]=room_speed*5;
x=room_width/2;
y=room_height/2;
Prevent automatic animation, set an alarm for 5 seconds, and position in middle of the window.
Alarm 0 Event
/// @description Destroy
instance_destroy();
Destroys self when alarm triggers.
obj_cursor
Follows the player around the room, used for one of the playar’s weapons. Also draws the locked-on sprite on the nearest enemy (if upgraded and an enemy instance exists).
There is no sprite assigned to this object, though it does use a few. This is shown in Figure 7_53:
Figure 7_53: Showing sprite spr_sight
Figure 7_54 shows sprite spr_lock
Figure 7_54: Showing sprite spr_lock
Create Event
/// @description Set Defualt Cursor
cursor_sprite=spr_sight;
Tells th
e program to set the cursor to sprite spr_sight.
Step Event
/// @description Update Position
x=mouse_x;
y=mouse_y;
Updates the location to the current mouse’s position.
Draw Event
/// @description Lock On
if instance_exists(obj_enemy_parent) and global.level>12
{
nearest=instance_nearest(x,y,obj_enemy_parent);
draw_sprite(spr_lock,0,nearest.x,nearest.y);
}
Will draw the lock on sprite if player’s level is over 12, at the nearest enemy location.
obj_spawner
This will spawn shield and upgrade bonus instances.
There is no sprite for this object.
Create Event
/// @description Set Alarms
alarm[0]=room_speed;//shield
alarm[1]=room_speed;//power power up
Sets some initial alarms.
Alarm 0 Event
/// @description Create a Shield Bonus
instance_create_layer(room_width+200, random_range(100,room_height-100),"Player",obj_shield_collect);
alarm[0]=room_speed*40;
Creates a shield for the player to try and collect, restarts the alarm.
Alarm 1 Event
/// @description Create Power Up
instance_create_layer(room_width+200, random_range(100,room_height-100),"Player",obj_power_up);
alarm[1]=room_speed*35;
Creates a power up for the player to try and collect, restarts the alarm.
obj_asteroid_spawn
Periodically spawns asteroids.
There is no sprite for this object.
Create Event
/// @description Set an Alarm
alarm[0]=room_speed*6;
Sets the initial alarm.
Alarm 0 Event
/// @description Make asteroid and restart alarm
alarm[0]=room_speed*6;
instance_create_layer(x,y,"Asteroid",obj_asteroid_large);
Restarts the alarm, creates an asteroid object.
obj_hud_control
Draws a background images, and info needed for the player (is drawn semi-transparent).
There is no sprite assigned for this object, though it does use one, which is shown below in Figure 7_55:
Figure 7_55: Showing sprite spr_hud
Create Event
/// @description Stop & Play Music
audio_stop_sound(snd_music_menu);
audio_play_sound(snd_music_game,1,true);
Stops any music and player the music for the game room.
Step Event
/// @description Format Score & Save on Gameover If New Highscore
score_text=string(score);
while string_length(score_text)<6 score_text="0"+score_text;
hiscore_text=string(global.highscore);
while string_length(hiscore_text)<6 hiscore_text="0"+hiscore_text;
///check health;
if health<0
{
if score>global.highscore//do this if bigger than current score
{
ini_open("scores.ini");//open ini
ini_write_real("scores","high",score);//write a value
ini_close();//close value
global.highscore=score;//update highscore
global.saved=true;
}
room_goto(room_gameover);
}
This formats the text for the score and highscore. It checks the players health (a global value) and if the player is dead it updates the saved highscore. It then goes to the gameover room.
Draw Event
/// @description Draw HUD
draw_set_font(font_menu);
draw_set_colour(c_black);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_set_alpha(0.5);
draw_sprite(spr_hud,0,0,0);
draw_text(200,40,"Score "+string(score));
draw_text(200,80,"Highscore "+string(global.highscore));
draw_text(600,40,"Level "+string(global.level));
draw_text(600,80,"Power "+string(global.pow));
if obj_player.shield>0
{
draw_text(1000,40,"Shield Active");
}
else
{
draw_text(1000,40,"No Shield");
}
draw_text(1000,80,"Health "+string(health));
draw_set_alpha(1);
Sets style for text drawing and sets the alpha to 50%. Draws HUD image all HUD text and then sets alpha back to normal value.
This Section Is For The Game Over Room
obj_game_over
Will display player’s score and highscore, then goto the starting room.
There is no sprite for this object.
Create Event
/// @description Set alarm and change music
alarm[0]=room_speed*6;
audio_stop_all();
audio_play_sound(snd_music_gameover,1,true);
Sets an alarm to 6 seconds, stops music and plays music for gameover room on loop.
Alarm 0 Event
/// @description Goto Game Start room
room_goto(room_splash);
Goes back to menu room when alarm is triggered.
Draw Event
/// @description Draw Score Info
draw_set_colour(c_white);
draw_text(room_width/2,400,"Score "+string(score));
draw_text(room_width/2,500,"Highscore "+string(global.highscore));
Sets drawing style and draws player’s score and highscore.
Rooms
This game has a few rooms, the setups are shown below
room_splash
This room has a size of 1300 wide and a height of 768.
It has a single instance of obj_splash.
room_menu
This room has a size of 1300x768.
It has a number of layers as shown in Figure 7_56:
Figure 7_56: Showing the layers for room_menu
The Player layer has one instance of obj_player_menu placed on it.
The Menu layer has one of obj_menu and one of obj_buttom.
Figure 7_57 shows these instances placed in the room:
Figure 7_57: Showing instances placed in the room
This room also has 3 backgrounds, used for a parallax effect.
Figure 7_58 shows the setting for bg_1:
Figure 7_58: Showing background setting for bg_1
Background bg_2 is set with a y offset of -100 and horitonal speed of -2.
Background bg_3 is set with a y offset of 200 and horitonal speed of -1.
Figure 7_59 shows the room with backgrounds and instances in place:
Figure 7_59: Showing room set up
room_intro
This room has a size of 1300 x 768.
Is has one instance of obj_intro_control and one of obj_emitter.
room_how_play
This room has a size of 1300 x 768.
Is has one instance of obj_how_to_play and one of obj_emitter.
room_game
This room has a dimension of 1300 by 768. It has many layers, as shown in Figure 7_60:
Figure 7_60: Showing layers for room_game
The Foreground layer has:
obj_spawn_poles
obj_cursor
The Score_Effect layer has no instances present at room start.
The Asteroid layer has:
obj_asteroid_spawn
The Player layer has:
obj_player
obj_hud_control
obj_spawner
The Missile layer has instances when the room starts.
The Enemy_Cannon layer has no instances.
The Enemy_Ball layer has no instances.
The Enemy layer has no instances.
The Enemy_Missile layer has no instances.
The Instances layer has no instances.
&n
bsp; Backgrounds are set up in the same way as the menu room.
The Foreground layer has:
obj_spawn_poles
obj_cursor
The Foreground layer has:
obj_spawn_poles
obj_cursor
room_gameover
This room has a size of 1300 x 768.
Is has one instance of obj_game_over.
Paths
This game uses two paths, as shown in Figure 7_61 and Figure 7_62:
Figure 7_61: Showing path set up for path_circle
Figure 7_62: Showing path set up for path_boss
Audio
This game uses sound audio, all from SoundImage.org. Figure 7_63 shows the sounds used in this game.
Figure 7_63: Showing sounds
There is a playable exe version of this game in the download.
There is also a skeleton project with all the code and instances set up, but with no sprites.
All sprites for the game are from:
GameDeveloperStudio.com
Chapter 8 Final Testing
The final stage is to make some final checks and make sure everything is working and correctly set up. Ideally there should only be minor tweaks required at this point. You should check for the following:
Audio does not have any blank sound at start or end
Texture pages are set large enough for over sized graphics you may have used
Variables change as expected
You are using the correct variable types (i.e. local, global or var)
Collision boxes are set up according to the sprite and how it behaves