게임제작/소스코드

[게임메이커]키보드 선택메뉴 혹은 선택지 작업방식

게임코드프리 2020. 11. 11. 19:05
반응형

 

 게임메이커 스튜디오에서 메뉴작업

 

룸과 폰트 그리고 오브젝트 한개로 완성


게임메이커에서 타이틀 메뉴 혹은 선택분기등 다양하게 글 메뉴를 선택해야 하는경우가 있는데

가장 쉬운 방식은 이미지를 메뉴만큼 프레임으로 만든후 image_index 를 활용하여 작업하는 것이 편리하지만

만약 이런 작업들이 많을 경우에는 리소스를 많이 먹고 불필요한 용량을 늘리는 원인이

되기도 합니다.

그래서 되도록 코드로 작업하는 것이 필요하며 간단한 코드 작성으로 다양한 활용이 가능합니다.


크리에이트 이벤트

///@desc Create Event 

x = room_width/2;
y = room_height/2;

menu_x = x;
menu_y = y;
button_h = 32;

//buttons
button[0] = "New Game";
button[1] = "Continue";
button[2] = "Options";
button[3] = "Exit";

buttons = array_length_1d(button);

menu_index = 0;
last_selected = 0;

 
먼저 어디에서 코드를 관리 할 오브젝트를 만들고

필요한 변수들을 설정합니다.


button_h 같은 경우는 글씨 세로 간격을 알기 위해서 사용한 변수이며, 나머지는 1차원 배열과 그 배열을 담은 변수


그리고 메뉴의 순서를 체크하기 위한 변수와 마지막 선택하고 있는 위치를 알기 위한 변수를 선언했습니다.

 

스텝이벤트

///@desc Step Event

menu_move = keyboard_check_pressed(vk_down) - keyboard_check_pressed(vk_up);

menu_index += menu_move;

if (menu_index < 0) menu_index = buttons -1;
if (menu_index > buttons -1) menu_index = 0;

//사운드를 넣고 싶다면
if (menu_index != last_selected) audio_play_sound(사운드명,1,false);

last_selected = menu_index;

 


스텝 이벤트에서는 키보드의 위 아래의 조작을 위한 변수를 선언하였고

변수 = 양수 - 음수는 대부분 처음 키 값은 0 이지만 키를 입력하게 되면 키 아래는 + 키 업은 - 이므로

+1 - 0 = 1 ,  0 - -1 = -1 이기에 누른 값을 가지게 됩니다. 

좌우로만 선택하는 메뉴라도 마찬가지이며 항상 (양수 - 음수) 순으로 써주는 것이 좋습니다.

 

나머지는 인덱스 순서에 따라서 버튼에 들어있는 배열의 순서를 바꿔주고

마지막 선택 변수에 메뉴의 인덱스를 넣어 어느 메뉴를 선택하고 있는지 알게 해줍니다.

 

드로우 이벤트

///@desc Draw event

for (var i = 0; i < buttons; i++)
{
	draw_set_font(font_text);
    draw_set_halign(fa_center);
    draw_set_color(c_white);
    
    if (menu_index == i) draw_set_color(c_orange);
    
	draw_text(menu_x, menu_y + button_h * i , button[i]);
}

//리피트로 하고 싶다면

var i = 0;
repeat(buttons)
{
	draw_set_font(font_text);
    draw_set_halign(fa_center);
    draw_set_color(c_white);
    
    if (menu_index == i) draw_set_color(c_orange);
	draw_text(menu_x, menu_y + button_h * i , button[i]);
	i++;
}

 

드로우 이벤트에는 예제로 두가지를 썼지만 한가지만 써도 되며,

for 문도 상관없고 repeat 문도 상관없지만 원하는 것 하나로 쓰면 됩니다.

 

 

엔터 입력시 

///@desc Enter입력시 

switch(menu_index)
{
	case 0 : 첫번째 메뉴시 하고싶은것;
    break;
	
    case 1 : //
    break;
    
    case 2 : //
    break;
    
    case 3 : game_end();
    break;
}

 

이것은 스텝 이벤트에서 코드를 넣어도 되고, 원한다면 따로 엔터 입력시라는 이벤트를 만들어 사용해도 됩니다.

스위치 문을 사용해 현재 메뉴 인덱스 값을 얻어와 케이스 별로 어떤 결과를 얻게 할지는 자유롭게 쓸 수 있습니다.

예를 들어 룸을 이동한다면, room_goto(룸 이름);

 

결과 화면

반응형
facebook twitter kakaoTalk kakaostory naver band shareLink
人気ブログランキングでフォロー