🤔 Para Refletir :
"Publique seu jogo. Dê a cara a tapa. Vai ter hater? Sim, porque você foi lá e fez, tem gente que nem faz!"
- HenriqueGibi

Script Scripts úteis para Projetos de Game Maker

DougMR Masculino

Cidadão
Membro
Membro
Juntou-se
04 de Janeiro de 2022
Postagens
171
Bravecoins
735
Fala pessoal! Ao trabalhar em diferentes projetos no Game Maker, percebi que eu usava certos algoritmos com bastante frequência, então decidi criar funções para não ter que digitar do zero novamente toda vez que pretendo incluir algo que já programei antes em um novo projeto. Eu adaptei os scripts para que sejam customizáveis, assim, podem ser utilizáveis em quase qualquer projeto, apenas alterando os valores de cada argumento para que melhor se adequem as suas necessidades.

Como são bastante úteis pra mim, imagino que também possam ser úteis pro pessoal aqui do Condado que usa o Game Maker, então decidi compartilhá-los neste Post:
Esta função replica a movimentação alinhada a um "Grid" (Matriz), presente em jogos antigos de RPG, como Pokémon, Final Fantasy, etc.
Código:
///scr_grid_mov(up_key, down_key, left_key, right_key, cell_w, cell_h,...
//...offset_x, offset_y, spd, inst_collision);

/*=================================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Function arguments:
up_key - variable containing keyboard key for upward movement
down_key - variable containing keyboard key for downward movement
left_key - variable containing keyboard key for leftward movement
right_key - variable containing keyboard key for rightward movement
cell_w - the width of each cell inside the grid
cell_h - the height of each cell inside the grid
offset_x - the "x" offset for the origin of the player sprite
offset_y - the "y" offset for the origin of the player sprite
spd - the movement speed (in pixels per frame)
inst_collision - the obstacle the player will collide against
=================================================================*/

//initiate variables:
up_key = argument0;
down_key = argument1;
left_key = argument2;
right_key = argument3;
cell_w = argument4;
cell_h = argument5;
offset_x = argument6;
offset_y = argument7;
spd = argument8;
inst_collision = argument9;

//check if player is aligned to grid:
if x == (x div cell_w * cell_w) + offset_x
&& y == (y div cell_h * cell_h) + offset_y
    aligned = true;
else
    aligned = false;

//check for input and allow movement if there is no collision:
if aligned
{
   hspeed = 0;
   vspeed = 0;

   if keyboard_check(up_key)
   {
        if !place_meeting(x, y - cell_h, inst_collision)
        {
            hspeed = 0;
            vspeed = -spd;
        }
   }
   else
   if keyboard_check(down_key)
   {
        if !place_meeting(x, y + cell_h, inst_collision)
        {
            hspeed = 0;
            vspeed = spd;
        }
    }
    else
    if keyboard_check(left_key)
    {
        if !place_meeting(x - cell_w, y, inst_collision)
        {
            hspeed = -spd;
            vspeed = 0;
        }
    }
    else
    if keyboard_check(right_key)
    {
        if !place_meeting(x + cell_w, y, inst_collision)
        {
            hspeed = spd;
            vspeed = 0;
        }
   }
   else
   {
      hspeed = 0;
      vspeed = 0;
   }
}
Esta função tem o intuito de substituir a função "draw_sprite", usada dentro do "Draw Event", quando sua intenção é desenhar uma sprite que contém animações. É possível também determinar o que acontece ao fim da animação, se ela deve reiniciar do primeiro frame, inverter, ou parar.
Código:
///scr_draw_sprite_animated(_x, _y, spr, frame_speed, animation_end);

/*=================================================================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Create Event:
current_frame = 0;
img_index = 0;
reverse_flag = false;

Function arguments:
_x - the x coordinate to draw the sprite
_y - the y coordinate to draw the sprite
spr - the sprite index to be drawn
frame_speed - how many frames it should wait before displaying next image index
animation_end - checks what happens when it reaches last image index ("restart", "reverse", "stop")
=================================================================================================*/

//initiate variables:
_x = argument0;
_y = argument1;
spr = argument2;
frame_speed = argument3;
animation_end = argument4;

//start animation:
total_sub = sprite_get_number(spr);

if current_frame < frame_speed
    current_frame += 1;
else
{
    if animation_end != "reverse"
    {
        if img_index < total_sub
            img_index += 1;
    }
    else if animation_end == "reverse"
    {
        if reverse_flag == true
        {
            if img_index > 0
                img_index -= 1;;
        }
        else
        {
            if img_index < total_sub - 1
                img_index += 1;
            else
                reverse_flag = true;
        }        
    }
         
    current_frame = 0;
}

//animation end:
if animation_end == "restart"
{
    if img_index == total_sub
        img_index = 0;
}

if animation_end == "reverse"
{
    if reverse_flag == true
    {
        if img_index == 0
            reverse_flag = false;
    }    
}

if animation_end == "stop"
{
    if img_index == total_sub
        img_index = total_sub - 1;    
}

//draw the sprite:
draw_sprite(spr, img_index, _x, _y);

Ainda tenho mais Scripts que pretendo editar para torná-los mais customizáveis, então aguardem por atualizações neste Post!
 
Última edição:
Abaixo tenho um grupo de scripts que trabalham em conjunto para criar um inventário, adicionar itens, atualizar a posição destes itens em cada slot, e exibir o inventário na tela, respectivamente. O objetivo é criar um sistema de inventário bem simples, que apenas armazena variáveis do tipo "String" (nome de cada item) dentro de um grande "Array". Bastante útil em jogos de puzzle, que requerem determinados itens para que você avance na campanha:
Código:
///scr_inv_create(inv_name);

/*=====================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Function arguments:
inv_name -  the name of the inventory being created
=====================================================*/

//initiate variables:
inv_name = argument0;
slot_number = 9999;

//create empty slots:
for(i = 0; i < slot_number + 1; i += 1)
    inv[i] = "empty";
Código:
///scr_inv_add_item(inv_index, item_name);

/*============================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Function arguments:
inv_index - the index of the object that "owns" the inventory
item_name - the name of the item being stored
============================================================*/

//initiate variables:
inv_index = argument0;
item_name = argument1;

//check the total amount of slots:
total_slots =  inv_index.slot_number;

//place item inside empty slot:
for(i = 0; i < total_slots; i += 1)
{
    if inv_index.inv[i] == "empty"
    {
        inv_index.inv[i] = item_name;
        break;
    }
}
Código:
///scr_inv_update(inv_index);

/*===========================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Function argument:
inv_index - the index of the object that "owns" the inventory
===========================================================*/

//initiate variables:
inv_index = argument;

//check the total amount of slots:
total_slots =  inv_index.slot_number;

//move items to the previous slot in case they're empty
for(i = 1; i < total_slots; i += 1)
{
    if inv_index.inv[i - 1] == "empty"
    {
        inv_index.inv[i - 1] = inv_index.inv[i];
        inv_index.inv[i] = "empty";
    }
}
Código:
///scr_draw_inv(inv_x, inv_y, C1, C2, C3, C4, C5, title_font, item_font,...
//...title_font_size, item_font_size, inv_index, _w, _amount);

/*================================================================
Credits: Douglas Miranda Rodrigues, aka "DougMR"

Create Event:
inv_cursor_pos = 0;

Function arguments:
inv_x - the x coordinate to draw inventory window
inv_y - the y coordinate to draw inventory window
C1 - color of the window border
C2 - color of the window
C3 - color of the window Title font
C4 - color of the window Item font
C5 - color of the window font for the Selected Item
title_font - the font index to draw the text of the window Title
item_font - the font index to draw the text of the inventory items
title_font_size - the size for the Title font (in pixels)
item_font_size - the size for the Item font (in pixels)
_w - the width value (in pixels) for the window
_amount - the amount of items that can be displayed at a time
================================================================*/

//initiate variables:
inv_x = argument0;
inv_y = argument1;
C1 = argument2;
C2 = argument3;
C3 = argument4;
C4 = argument5;
C5 = argument6;
title_font = argument7;
item_font = argument8;
title_font_size = argument9;
item_font_size = argument10;
inv_index = argument11;
_w = argument12;
_amount = argument13;

//draw window border (1):
draw_set_color(C1);
draw_rectangle(inv_x, inv_y, inv_x + _w, inv_y + title_font_size - 4, false);

//draw window
draw_set_color(C2);
draw_rectangle(inv_x, inv_y + title_font_size - 4, inv_x + _w, inv_y + (_amount * item_font_size)
+ item_font_size, false);

//draw window border (2):
draw_set_color(C1);
draw_rectangle(inv_x, inv_y + title_font_size - 4, inv_x + _w, inv_y + (_amount * item_font_size)
+ item_font_size, true);

//draw window title:
if inv_index != noone
{
    draw_set_font(title_font);
    draw_set_color(C3);
    draw_set_halign(fa_center);
    draw_text(inv_x + (_w / 2), inv_y, inv_index.inv_name);
}

//select items:
if keyboard_check_pressed(vk_down)
{ 
    if inv_cursor_pos < inv_index.slot_number
    {
        if inv_index.inv[inv_cursor_pos + 1] != "empty"
            inv_cursor_pos += 1;
    }
}
else if keyboard_check_pressed(vk_up)
{ 
    if inv_cursor_pos > 0
        inv_cursor_pos -= 1;
}

//draw items
inv_page = inv_cursor_pos div _amount

for(i = inv_page * _amount; i < (inv_page * _amount) + _amount; i += 1)
{
    draw_set_font(item_font);
    draw_set_halign(fa_center);
  
    if inv_cursor_pos == i
    {
        if inv_index.inv[i] != "empty"
        {
            draw_set_color(C5)
            draw_text(inv_x + (_w / 2), inv_y + ((item_font_size * i) + item_font_size + 2)
            - (inv_page * (_amount * item_font_size)), "- " + inv_index.inv[i]);
        }
    }
    else
    {
        if inv_index.inv[i] != "empty"
        {
            draw_set_color(C4)
            draw_text(inv_x + (_w / 2), inv_y + ((item_font_size * i) + item_font_size + 2)
            - (inv_page * (_amount * item_font_size)), inv_index.inv[i]);
        } 
    }
}

//reset draw color:
draw_set_color(c_white);

//reset text alignment:
draw_set_halign(fa_left);
 
Última edição:
Voltar
Topo Inferior