Vamos criar um menu simples e fluido que não necessite de códigos
complexos, por isso mesmo esse não menu não terá elementos como controles
deslizantes(sliders), caixa de verificação(checkbox), uma caixa de opções
(choice box).
Não se esqueça de preparar a room, habilite a câmera e na viewport properties configure para que se adeque a câmera, essa parte é importante já que iremos desenhar o menu na GUI, por fim precisamos de um objeto que ira receber todo nosso código, irei chamar de oMenu_inicial.
No evento Create, precisaremos de um array que guardara os nomes dos botões e outro array para guarda a escala de cada posição do menu para dar um efeito fluido.
//Create Event <oMenu_inicial>
//Criando os botões do
menu
menu_inicial = ["Jogar" ,
"Opções",
"Sair"];
//Criando um array para cada posição do menu
esc = array_create(
array_length(menu_inicial),
1);
Agora precisamos de um evento de DrawGui, onde iremos desenhar nosso menu.
Não podemos usar o valores de mouse_x e mouse_y do gamemaker, então precisaremos coletar a posição do mouse na GUI. Também precisaremos pegar a largura e altura da GUI e definir a posição do menu.
Vamos também definir a fonte e o alinhamento e no final resetar para o valor padrão.
Logo abaixo, precisaremos de um laço de repetição que caminhe por todas
posições do menu.
//DrawGui event <oMenuinicial>
//Pegando a posição do mouse na GUI
var _mx = device_mouse_x_to_gui(0);
var _my = device_mouse_y_to_gui(0);
//Pegando as dimenções da GUI
var _wgui = display_get_gui_width();
var _hgui = display_get_gui_height();
//Definindo a posição do menu
var _posx = _wgui / 2;
var _posy = _hgui / 2;
//Definindo fonte e alinhamento
draw_set_font(fmenu_inicial);
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
var tam_menu = array_length(menu_inicial);
for(var i = 0; i < tam_menu; i++)
{
//Código
}
//Resetando fonte e alinhamento
draw_set_halign(-1);
draw_set_valign(-1);
draw_set_font(-1);
Dentro do laço de repetição precisaremos armazenar a altura, podemos usar string_height("I") já que não difere, e a largura, já que cada texto pode ter uma largura diferente usamos menu_inicial[i] como referencial.
Precisamos também armazenar as coordenada do retângulo que fica em volta do texto, para isso precisaremos calcular o vetor(x,y) superior esquerdo e o vetor(x,y) inferior direito.
Depois usamos uma condição com point_in_rectangle() para detectar quando o
mouse está por cima, usaremos as variáveis do mouse na GUI e a coordenadas
do retângulo armazenados.
Quando a condição detectar que estamos em cima de alguma posição do menu, então modificamos a escala da mesma posição para dá um feedback legal e faremos uma condição para quando pressionar o botão esquerdo do mouse executar um switch que executara o que eu quero de acordo com a posição. Senão tiver em cima do texto, então volto minha escala da mesma posição para 1.
Por fim desenhamos o menu com nossas informações.
//DrawGui event <oMenuinicial>
var tam_menu = array_length(menu_inicial);
for(var i = 0; i < tam_menu; i++)
{
//Pegando a altura e a largura do texto
var _hstr = string_height("I");
var _wstr = string_width(menu_inicial[i]);
//Coordenadas do retangulo
//Canto superior esquerdo
var x1 = _posx - (_wstr / 2); //Já que meu texto está centralizado, retorno metade
var y1 = _posy - (_hstr / 2) + (_hstr * i); //retorno metade da altura e ajusto a posição com base no índice
//Canto inferior direito
var x2 = _posx + (_wstr / 2); //Somo metade da largura
var y2 = _posy + (_hstr / 2) + (_hstr * i); //Somo metade da altura e ajusto a posição com base no índice
//Se o mouse estiver dentro do retangulo
if(point_in_rectangle(_mx,_my,x1,y1,x2,y2)){
esc[i] = lerp(esc[i], 1.4, 0.15);
//Quando clicar acontecer alguma coisa
if(mouse_check_button_pressed(mb_left)){
switch menu_inicial[i]
{
case menu_inicial[0]: //Jogar
show_message("Vamos Jogar");//codigo vai aqui
break;
case menu_inicial[1]: //Opções
show_message("Tenho que configurar algumas coisas");//codigo vai aqui
break;
case menu_inicial[2]: //Sair
game_end();//codigo vai aqui
break;
}
}
}
else{ //Se o mouse não está no retangulo
esc[i] = lerp(esc[i], 1, 0.15);
}
//Desenhano o menu
draw_text_transformed(_posx, _posy + _hstr * i, menu_inicial[i], esc[i], esc[i], 0);
}
Não esqueçam de colocar o obejto oMenuInicial na room!
.jpg)