Introduction To Game Design & Programming in GameMaker Studio 2
Page 9
Create Event
/// @description Set Up
live=true;
active=true;
alarm[0]=room_speed*5;
//look for initial target
if instance_exists(obj_enemy_parent)
{
target=instance_nearest(mouse_x,mouse_y,obj_enemy_parent);
}
else
{
target=noone;
}
start_hp=200;
hp=200;
my_power=5*global.pow;
audio_play_sound(snd_missile,1,false);
live=true;
active=true;
alarm[0]=room_speed*5;
Sets a flag as true for live and active. Sets an alarm 0 for 5 seconds.
if instance_exists(obj_enemy_parent)
{
target=instance_nearest(mouse_x,mouse_y,obj_enemy_parent);
}
else
{
target=noone;
}
Looks for a target (that has the parent obj_enemy_parent), sets the value of target to the enemy’s id (each instance has a different id), otherwise sets it to noone.
start_hp=200;
hp=200;
This object has an hp, which counts down. When run out the missile destroys.
my_power=5*global.pow;
audio_play_sound(snd_missile,1,false);
Sets the power of the missile and plays a sound.
Step Event
/// @description Look For Target
if instance_exists(obj_enemy_parent)
{
if target=noone target=instance_nearest(x,y,obj_enemy_parent);
}
else
{
target=noone;
}
///track target
if target!=noone
if instance_exists(target)
{
tx = target.x;
ty = target.y;
direction = scr_angle_rotate(direction, point_direction(x, y, tx, ty),3);
image_angle = direction;
}
else
{
if instance_exists(obj_enemy_parent)
{
target=instance_nearest(x,y,obj_enemy_parent);
}
else
{
target=noone;
}
}
if instance_exists(target) && target.x<0 target=noone;
//health bar
hp--;
if hp<1
{
instance_destroy();
}
if instance_exists(obj_enemy_parent)
{
if target=noone target=instance_nearest(x,y,obj_enemy_parent);
}
Checks for a new target if obj_enemy_parent exists and the weapon does not currently have a target set.
if target!=noone
if instance_exists(target)
{
tx = target.x;
ty = target.y;
direction = scr_angle_rotate(direction, point_direction(x, y, tx, ty),3);
image_angle = direction;
}
If the weapon has a target and the target still exists, then changes direction to move towards the target.
else
{
if instance_exists(obj_enemy_parent)
{
target=instance_nearest(x,y,obj_enemy_parent);
}
else
{
target=noone;
}
}
Looks for a new target again if current does not exist.
hp--;
if hp<1
{
instance_destroy();
}
Reduces hp by 1 each step ( -- is basically the same as hp-=1 or hp=hp-1), if less than 1 then destroys itself.
Draw Event
/// @description Drawing
draw_self();
if instance_exists(target)
{
draw_sprite(spr_locked,0,target.x,target.y);
draw_set_colour(c_lime);
draw_line_width(x,y,target.x,target.y,3);
}
scr_healthbar(0,0,40);
draw_self();
Draws self (if you put any code in a Draw Event that doesn’t force drawing of a sprite, it will not draw – adding this forces it to draw).
if instance_exists(target)
{
draw_sprite(spr_locked,0,target.x,target.y);
draw_set_colour(c_lime);
draw_line_width(x,y,target.x,target.y,3);
}
This will check if the target exists, and if it does it will draw a lime green line from the weapon to the target.
scr_healthbar(0,0,40);
This will draw a small healthbar relative to the weapons current location.
obj_bullet_1
This object is the projectile that will fire the player’s secondary weapon (when player has collected enough power ups and the weapon is active).
Figure 7_31 shows the sprite set up:
Figure 7_31: Showing sprite set up for spr_bullet_1
Create Event
/// @description Set Up
my_power=1*global.pow;
audio_play_sound(snd_bullet_1,1,false);
Sets the strength of the weapon and plays a sound.
Outside Room Event
/// @description Destroy when not needeed
instance_destroy();
Destroys the instance when outside the room.
obj_bullet_2
This object is the projectile that will fire the player’s triary weapon (when player has collected enough power ups and the weapon is active).
This uses the same sprite as shown in Figure 7_30.
Create Event
/// @description Set Up
my_power=2*global.pow;
audio_play_sound(snd_bullet_2,1,false);
Sets the strength of the weapon and plays a sound.
Outside Room Event
/// @description Destroy When no longer needed
instance_destroy();
Destroys the instance when outside the room.
obj_power_bullet
This is a power weapon that becomes active when the player has collected enough power ups.
Figure 7_32 shows spr_power_effect, which is assigned to this object:
Figure 7_32: Showing the sprite spr_power_effect
Create Event
/// @description Set Up
image_xscale=0.1;
image_yscale=0.1;
my_power=2*global.pow;
audio_play_sound(snd_power,1,false);
Sets the initial scale (size), power and plays a sound.
Step Event
/// @description Increase Size
image_xscale+=0.06;
image_yscale+=0.06;
Gradually increases size.
Outside Room Event
/// @description Destroy When Done
instance_destroy();
Destroy when done with, to prevent memory errors.
obj_extra_1_top
This weapon will be created when the player has collected enough power ups. It shoots automatically.
Figure 7_33 below shows the sprite assigned for this object:
Figure 7_33: Showing sprite spr_extra_1
Create Event
/// @description Set initial alarm
alarm[0]=room_speed*2;
Sets an alarm for firing control
Step Event
/// @description Keep In Relation to player location and angle
xx = obj_player.x + lengthdir_x(64, obj_player.image_angle);
yy = obj_player.y + 100 + lengthdir_y(128, obj_player.image_angle);
image_angle=obj_player.image_angle;
x=xx;
y=yy-204;
Keeps the angle and position relative to the player.
Alarm 0 Event
/// @de
scription Shoot Projectiles
alarm[0]=(room_speed*1.5)+room_speed*5/global.shoot_speed;
ang=image_angle;
xx = x + lengthdir_x(32, ang);
yy = y + lengthdir_y(32, ang);
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang;
bullet.speed=7;
bullet.image_angle=ang;
if global.level<6 exit;
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang-30;
bullet.speed=7;
bullet.image_angle=ang-30;
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang+30;
bullet.speed=7;
bullet.image_angle=ang+30;
alarm[0]=(room_speed*1.5)+room_speed*5/global.shoot_speed;
Resets the alarm.
ang=image_angle;
xx = x + lengthdir_x(32, ang);
yy = y + lengthdir_y(32, ang);
Keeps it relative to the player.
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang;
bullet.speed=7;
bullet.image_angle=ang;
Creates an instance of the bullet object, with a starting location relative the weapon source, and with given speed and angle.
if global.level<6 exit;
Exists if player is on less than level 6. If it is 6 or above then 2 more projectiles are created, with angles of +30’ and -30’ of the initial weapon.
obj_extra_1_bottom
This weapon will be created when the player has collected enough power ups. It shoots automatically.
This object uses the same sprite as shown in Figure 7_33 previously.
Create Event
/// @description Set Alarm (synced with top)
alarm[0]=obj_extra_1_top.alarm[0];
level=1;
Step Event
/// @description Keep in relation to player
xx = obj_player.x + lengthdir_x(64, obj_player.image_angle);
yy = obj_player.y + 100 + lengthdir_y(128, obj_player.image_angle);
image_angle=obj_player.image_angle;
x=xx;
y=yy;
Alarm 0 Event
/// @description Shoot Projectiles
alarm[0]=obj_extra_1_top.alarm[0];
ang=image_angle;
xx = x + lengthdir_x(32, ang);
yy = y + lengthdir_y(32, ang);
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang;
bullet.speed=7;
bullet.image_angle=ang;
if global.level<6 exit;
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang-30;
bullet.speed=7;
bullet.image_angle=ang-30;
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_1);
bullet.direction=ang+30;
bullet.speed=7;
bullet.image_angle=ang+30;
Works in the same way as the first weapon above.
obj_extra_2_top
This weapon will be created when the player has collected enough power ups. It shoots automatically.
The sprite for this object is shown below in Figure 7_34:
Figure 7_34: Showing sprite spr_extra_2
Create Event
/// @description Set inital alarm
alarm[0]=room_speed*2;
Step Event
/// @description sync with player
xx = obj_player.x + lengthdir_x(64, obj_player.image_angle);
yy = obj_player.y + 100 + lengthdir_y(128, obj_player.image_angle);
image_angle=obj_player.image_angle;
x=xx;
y=yy-332;
Alarm 0 Event
/// @description Create Projectile
alarm[0]=room_speed*4;
ang=image_angle;
xx = x + lengthdir_x(32, ang);
yy = y + lengthdir_y(32, ang);
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_2);
bullet.direction=ang;
bullet.speed=7;
bullet.image_angle=ang;
No new code to comment on here.
obj_extra_2_bottom
This weapon will be created when the player has collected enough power ups. It shoots automatically.
This uses the same sprite as shown in Figure 7_34.
Create Event
/// @description Set Initial Alarm
alarm[0]=obj_extra_2_top.alarm[0];
Step Event
/// @description SSync with player
xx = obj_player.x + lengthdir_x(64, obj_player.image_angle);
yy = obj_player.y + 100 + lengthdir_y(128, obj_player.image_angle);
image_angle=obj_player.image_angle;
x=xx;
y=yy+128;
Alarm 0 Event
/// @description Cretae Projectile
alarm[0]=obj_extra_2_top.alarm[0];
ang=image_angle;
xx = x + lengthdir_x(32, ang);
yy = y + lengthdir_y(32, ang);
bullet=instance_create_layer(xx,yy,"Missiles",obj_bullet_2);
bullet.direction=ang;
bullet.speed=7;
bullet.image_angle=ang;
No new code to comment on here.
obj_spawn_enemy
This object will act as a controller, and spawn enemies accordingly.
There is no sprite for this object.
Create Event
/// @description Set Inital alarms
alarm[0]=room_speed*8;
alarm[1]=room_speed*16;
alarm[2]=room_speed*60;
Sets some initial alarms.
Alarm 0 Event
/// @description Make Enemy Floor
alarm[0]=room_speed*8;
if instance_number(obj_boss)==0 && instance_number(obj_enemy_floor)==0 enemy=instance_create_layer(room_width+200,0,"Enemy",obj_enemy_floor);
Restarts the alarm, then checks is no instances of obj_boss or obj_enemy_floor are currently present, if not it creates an instance of obj_enemy_floor.
Alarm 1 Event
/// @description Make Enemy Air
alarm[1]=room_speed*16;
if instance_number(obj_boss)==0 && instance_number(obj_enemy_air)==0 enemy=instance_create_layer(room_width+200,0,"Enemy",obj_enemy_air);
Restarts the alarm, and then checks whether obj_boss or obj_enemy_air is present, if not an instance of obj_enemy_air is created.
Alarm 2 Event
/// @description Make Boss
alarm[0]=room_speed*60;
if instance_number(obj_boss)==0 enemy=instance_create_layer(room_width+200,0,"Enemy",obj_boss);
Checks whether an instance of obj_boss is currently present, if not it creates one.
obj_enemy_floor
This is the enemy that will move along the bottom of the window. It does not fire any projectiles.
Figure 7_35 shows the sprite set up for this object:
Figure 7_35: Showing the sprite spr_floor_1 for object obj_enemy_floor
Create Event
/// @description Set Up
start_hp=global.level*global.level;
hp=start_hp;
hspeed=-3.7;
This sets the instances starting hp values, used for drawing detecting when dead. hspeed is the horizontal speed, a negative value makes it move towards the left.
Step Event
/// @description Check pos, hp
if x<0 instance_destroy();
//if hp<1
if hp<1
{
instance_destroy();
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=start_hp;
for (var i = 0; i < 15; i += 1)
{
part=instance_create_layer(x,y,"Score_Effect",obj_floor_parts);
part.image_ind
ex=i;
}
}
//control y
y=layer_get_y("bg_1")+100;
if x<0 instance_destroy();
This line of code checks if it has gone off the left side of the window, if it has then it no longer needed and is destroyed.
if hp<1
{
instance_destroy();
coin=instance_create_layer(x,y,"Player",obj_coin_bubble);
coin.value=start_hp;
Checks the value of hp, if it is less than 1, this code block is executed. It firstly creates a coin at the enemy’s location and gives is a value equal to the starting hp value.
for (var i = 0; i < 15; i += 1)
{
part=instance_create_layer(x,y,"Score_Effect",obj_floor_parts);
part.image_index=i;
}
}
This creates instances of obj_floor_parts and assigns each a different image_index.
y=layer_get_y("bg_1")+100;
This makes the instance move up and down relative to background bg_1. This ensures that it matches the backgrounds movement.
Draw Event
/// @description Drawing
draw_self();
scr_healthbar(0,-40,60);
Draws the current subimage and a health bar.
Collision With obj_mine_parent Event
/// @description Reduce if in contact with mine
hp-=other.my_power;
This will reduces it’s hp every step it is colliding with any mine.
Collision With obj_player_weapon_parent Event
/// @description Reduce hp
hp-=other.my_power;
with other instance_destroy();
audio_play_sound(snd_exp_1,1,false);
Reduces hp by the colliding instances my_power value, destroys the colliding instance, and plays a sound.
Collision with obj_power_bullet Event
/// @description Reduce hp
hp-=other.my_power/10;
Reduces hp when in collision with the power_bullet object, reduces by 1/10 of the power_bullet’s power.
obj_enemy_air
This enemy will move onto the window, then follow a set path on a loop. This will fire projectiles towards the player.