Sunday, April 18, 2021

【GAMEMAKER】invincible abilities

 Information about object: obj_player

Sprite: spr_idle_down
Solid: false
Visible: true
Depth: 0
Persistent: true
Parent:
Children:
Mask:
No Physics Object
Create Event:
execute code:

///set up
enum player_state {
    idle,
    up,
    down,
    left,
    right
    }

dir=player_state.down;
is_moving=false;
image_speed=0.5;

col=0;//initial value
sw=0;//for sine wave
move_col=5;
invincible=false;
invincible_timer=100;
alarm[0]=20;//to replenish
Alarm Event for alarm 0:
execute code:

invincible_timer++;
if invincible_timer>100 invincible_timer=100;
alarm[0]=20;
Step Event:
execute code:

//animation
if is_moving
{
    switch (dir)
    {
        case player_state.up:
        sprite_index=spr_walk_up;
        break;

        case player_state.down:
        sprite_index=spr_walk_down;
        break;

        case player_state.left:
        sprite_index=spr_walk_left;
        break;
   
        case player_state.right:
        sprite_index=spr_walk_right;
        break;
    }
}
else
{
    switch (dir)
    {
        case player_state.up:
        sprite_index=spr_idle_up;
        break;

        case player_state.down:
        sprite_index=spr_idle_down;
        break;

        case player_state.left:
        sprite_index=spr_idle_left;
        break;
   
        case player_state.right:
        sprite_index=spr_idle_right;
        break;
    }
}



execute code:

///invincibility
if keyboard_check_released(ord('I')) //switch between true / false on key press
{
    invincible=!invincible;
}

if invincible
{
    sw += 0.1;//for sin wave - ie speed
    col= sin(sw) * move_col;//for sin wave
    image_blend = make_colour_rgb(125+(col*20), 100, 100); 
    invincible_timer-=1;
}
else
{
    image_blend = make_colour_rgb(255,255,255);
}

//check if player has invincible_timer
if invincible_timer<1 invincible=false;
execute code:

///keypress code
if (keyboard_check(vk_left))
{
    dir=player_state.left;
    is_moving=true;
}
else
if (keyboard_check(vk_right))
{
    dir=player_state.right;
    is_moving=true;
}
else
if (keyboard_check(vk_up))
{
    dir=player_state.up;
    is_moving=true;
}
else
if (keyboard_check(vk_down))
{
    dir=player_state.down;
    is_moving=true;
}
else
{
    is_moving=false;
}

execute code:

///movement
if is_moving
{
    switch (dir)
    {
        case player_state.up:
        y -= 4;
        break;

        case player_state.down:
        y += 4;
        break;

        case player_state.left:
        x -= 4;
        break;
   
        case player_state.right:
        x += 4;
        break;
    }
}
Draw Event:
execute code:

///draw self and box showing invincible_timer
draw_self();
//background
draw_set_colour(c_red);
draw_rectangle(x-50,y-70,x+50,y-65,false);
//bar
draw_set_colour(c_green);
draw_rectangle(x-50,y-70,x-50+invincible_timer,y-65,false);

No comments:

Post a Comment