게임제작/소스코드

[게임메이커]키보드로 이동하여 선택하는 이름입력 만들기

게임코드프리 2020. 10. 14. 01:34
반응형

#키보드 조작 #이름 입력기 

 

게임메이커 스튜디오2로 이름입력 만들기

 

 

콘솔 게임에서 자주 등장하는 방식의 이름입력기는 사실 상당히 쉽지만 알고리즘을 모르면 대체

어떻게 해야 할지 막막합니다.

오늘은 오래전에 만들다가 포기한(...) 게임 중 이름 입력기 부분에 대해서만 따로 정리하여 소스코드를 설명할까 합니다.

소스코드 카테고리는 초보자를 위한 공간이 아니기에 이해가 가지 않는다면 게임메이커 스튜디오에 관한

다른 글을 먼저 읽어주시기 바랍니다.

 

1.스프라이트 폰트와 커서 만들어놓기

 

(스프라이트 폰트는 원하는 사이즈로 각각 A ~ Z 까지 준비)

 

(당연히 스프라이트 폰트와 같은 크기로 선택할 커서도 준비합니다)

 

2.Obj_name_keyboard

 

이제 게임메이커 스튜디오에서 오브젝트 폴더에 위와같은 원하는 이름으로 오브젝트를 생성합니다.

 

(크리에이트 이벤트, 스텝이벤트, 드로우 GUI로 설정된 오브젝트)

 

[크리에이트 이벤트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
///Create Event
alpha=0;
x_scale =0;
y_scale =0;
current_name = "";
 
global.PL = false;
global.PR = false;
global.PU = false;
global.PD = false;
 
global.POK = false;
global.PCAN = false;
 
max_letter = 12;
 
grid_x = 0;
grid_y = 0;
 
letter_string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
img_font = font_add_sprite_ext(img_font0, letter_string, false0);
draw_set_font(img_font);
 
x_letters = 10;
y_letters = 3;
 
char_count = 1;
 
for (var yy = 0; yy < y_letters; yy++)
{
    for (var xx = 0; xx < x_letters; xx++)
    {
        if (char_count <= 29)
        {
            a_letters[xx,yy] = string_char_at(letter_string, char_count);
        }else
        {
            a_letters[xx,yy] = "OK"
        }
        char_count++;
    }
}
cs

 

코드의 내용은 대충 키입력값을 알아내기 위한 global 시리즈의 pl , pr 등의 선언이나

max_letter 같은 최대 입력가능 변수선언, 그리고 글자선언과 이미지 폰트를 사용하기 위한 변수와

마지막에 글자들을 뿌려주기 위한 for문이 전부입니다.

 

x_letters = 10 은 가로 10개의 글자

y_letters = 3 은 세로 3개의 글자를 뿌려주기 위함이니 원하는 대로 수정해도 되는 부분입니다.

 

[스텝 이벤트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/// @description Insert description here
// You can write your code in this editor
if (global.newgame_menu == 1)
{
//player input
if (global.key_left_p) {global.PL=true}else{global.PL=false}
if (global.key_right_p) {global.PR=true}else{global.PR=false}
if (global.key_up) {global.PU=true}else{global.PU=false}
if (global.key_down) {global.PD=true}else{global.PD=false}
if (global.key_conform) {global.POK=true}else{global.POK=false}
if (global.key_jump) {global.PCAN=true}else{global.PCAN=false}
 
#region Move the cusor
if (global.PL)
{
    if (grid_x -1< 0 
    {
        grid_x = (x_letters -1);
    }else
    {
        grid_x--;
    }
}
 
if (global.PR)
{
    if (grid_x +1>= x_letters
    {
        grid_x = 0
    }else
    {
        grid_x++;
    }
}
 
 
if (global.PU)
{
    if (grid_y -1< 0 
    {
        grid_y = (y_letters -1);
    }else
    {
        grid_y--;
    }
}
 
if (global.PD)
{
    if (grid_y +1>= y_letters
    {
        grid_y = 0
    }else
    {
        grid_y++;
    }
}
#endregion
 
#region Pressed OK
if (global.POK)
{
    var new_letter = a_letters[grid_x, grid_y];
    
    if (string_length(current_name)) <= max_letter
    {
        
        if (new_letter != "OK")
        {
            current_name += new_letter;
        }
    }
    //complete name
    if (new_letter == "OK")
    {
        global.player_name = current_name;
        global.newgame_menu = 0;
        global.key_conform = -1//키입력 초기화 시키지 않으면 반복됨
        instance_destroy();
    }
}
#endregion
 
#region Pressed Cancel
 
if (global.PCAN)
{
    letter_count = string_length(current_name);
    
    if (letter_count >= 1) current_name = string_delete(current_name,letter_count,1);
}
 
#endregion
 
//이미지 키보드 백배경 연출
if x_scale <=1
{
    x_scale+=0.1;
    y_scale+=0.1;
}
if x_scale > 1
{
    x_scale=1;
    y_scale=1;
}
if alpha <= 1
{
    alpha+=0.01;
    if alpha>1{alpha=1;}
}
}
cs

 

스텝이벤트의 코드들은 대부분 키보드 조작에 관한 내용과  캔슬 키를 이용하여 전단계 이름을 지우는 정도의 조작.

그리고 마지막에 배경이미지를 연출 시키는 내용입니다.

 

[Draw GUI 이벤트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/// @description Insert description here
// You can write your code in this editor
draw_set_font(img_font)
draw_set_color(c_white)
font_size = 48;
 
//draw letters
start_x = view_xport[0]+550;
start_y = view_yport[0]+520;
 
//buffer = ceil(14/2);
 
//keyboard background image
draw_sprite_ext(img_lazer_back,0,view_xport[0]+1280/2,view_yport[0]+474,x_scale,y_scale,0,c_white,alpha)
 
var char_count = 1;
 
for(var yy=0; yy < y_letters; yy++)
{
    for(var xx=0; xx < x_letters; xx++)
    {
        var letter = a_letters[xx,yy];
        var draw_x = start_x + (xx * (font_size*2));
        var draw_y = start_y + (yy *(font_size + font_size));
        
        draw_text(draw_x, draw_y, letter);
        
        if (xx = grid_x and yy = grid_y) draw_sprite(img_cursor, 0, draw_x, draw_y);
        char_count++;
    }
}
 
 
 
//player name
draw_set_font(font_text_ui)
draw_set_color(c_lime)
draw_text(500,250,current_name)
draw_text(500,260,"_ _ _ _ _ _ _ _ _ _ _ _")
 
cs

 

이제 실제로 드로우를 해야 하기에 위치값이나 커서 이미지 좌표, 기본적으로 이름이 입력될 공간에 _ _ _ _ _ _ 텍스트로

꾸며준 내용의 코드입니다.

여기서 뷰포트는 룸에서 설정한 사이즈를 바탕으로 화면의 크기가 변해도 고정된 뷰에서 좌표계산을 하기 위함인데...

그냥 없이 좌표계산만으로 설정해도 무관합니다.

buffer는 뭔가 하려다가 //주석처리만 해두고 쓰지 않는 변수이니 무시하셔도 됩니다.

 

그 다음은, 원하는 타이밍에 이 오브젝트를 생성시켜 주거나 혹은 처음부터 룸에 오브젝트를 배치하여 

사용하는 것이 전부입니다.

 

어느정도 GML을 배웠다면 어려운 코드가 하나도 없으며 대부분 변수,  for문이나 드로우관련 명령어외엔

사용하지 않았기에 충분히 이해가 갈거라 생각하며,

소스코드를 분석하여 자신만의 키보드 입력기를 창조하는데 도움이 되었으면 합니다.

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