프로그래밍 강의 (68)
이번 강좌에서는 흔히 쓰면서도 개념을 알 듯 모를 듯한 게임메이커의 드로우 이벤트에 대해서 알아보겠습니다. 어찌 보면 가장 기초적인 개념이면서도 가장 심화적인 부분이 바로 이 드로우 이벤트입니다. 1. 인스턴스가 사라져요 드로우 이벤트를 사용하게 되면 인스턴스가 사라지게(?) 됩니다. 이렇게 되는 이유는 드로우 이벤트를 사용하기 전에는 게임메이커에서 자체적으로 인스턴스의 스프라이트를 그리지만, 드로우 이벤트를 사용하게 되면 게임메이커에서 인스턴스의 스프라이트를 그리지 않기 때문입니다. 사라짐 문제의 해결 방법은 draw_self() 함수를 사용하는 것입니다. 이 함수는 draw_sprite_ext(sprite_index, image_index, x, y, image_xscale, image_yscale,..
증가 연산자와 감소 연산자는 1을 더하거나 빼는 단순한 역할만을 합니다. 증가 연산자는 "var++, ++var"을 사용하며, 감소 연산자는 "var--, --var"을 사용하지요. 단순히 1을 더하거나 빼는 역할만을 하는 이 기능을 왜 만든 것일까요? C언어와 같은 컴파일러에서는 프로그램의 약간의 속도 향상에 있었습니다. 하지만 게임메이커: 스튜디오(GameMaker: Studio)는 인터프리터형식입니다. 그렇다면 이 기능은 필요 없지 않을까요? 그렇다면 위와 같은 코드를 살펴봅시다. 사진에서는 증가 연산자가 draw_text 함수 안에 있습니다. 원래 위의 코드는 증가 연산자를 사용하지 않았다면, draw_text(0, i*16, count) count+=1 이렇게 써졌어야 했을 코드입니다. 이것으로..
대부분의 프로그래밍 컴파일러가 그러하듯, 게임메이커: 스튜디오(GameMaker: Studio)에서도 배열은 2차원까지만 지원합니다. 하지만 여러분들이 어느 날 갑자기 꼭 n차원 배열을 사용해야 하는 때가 온다면 어떻게 해야 할까요? 이 강좌에서는 n차원 배열을 구현할 수 있는 여러 가지 방법 중 한 가지 방법을 제시하고자 합니다. 위 그림은 멍멍이(qw5628)님의 3차원 배열이 [N1, N2, N3] 일 때, [5, 4, 3] 이라는 크기를 가진 배열의 주소를 설명하는 사진입니다. 이 강좌에서는 N을 배열 크기로, n을 배열에 삽입하는 숫자라고 정의하겠습니다. [N1, N2] 에서 [5, 4] 가 배열의 크기일 때, [0, 0] 의 주소는 0 이고, [0, 3] 의 주소가 3 이라면, [1, 0] 의..
여기서 말하는 더블 뷰란 보통의 2인용 게임에서 화면을 나누는것을 의미합니다. 사실 정말로 쉬운 개념인데 2인용 게임을 만드는것이 희귀한 일인지라 잘 모르시는 분들이 많습니다. 2개의 뷰를 같은 위치에 놓으면 어떻게 될까요? 뷰는 0~7번의 화면이 차례로 백그라운드와 드로우 이벤트에 의해 그려집니다. 그러므로 만약 두 개의 뷰의 위치가 같다면, 나중에 그려진 뷰가 화면에 나타나게 됩니다. 하여 두 개의 화면이 나타나야 하는 2인용 게임에서는 두 개의 뷰의 위치를 분리할 필요가 있습니다. 0번 뷰에서는 뷰 세팅을 위와 같이 하였습니다. 뷰가 300*300으로 나뉘므로, Hbor/Vbor(뷰 이동 경계선)을 중앙인 150으로 처리한 것을 보실 수가 있을 것입니다. 이제 1번 뷰입니다. 두 개의 화면을 분리해..
게임메이커: 스튜디오(GameMaker: Studio)는 현재 PNG 형식의 이미지 로드만 지원합니다. 그렇다면 GIF 형식의 이미지 파일은 로드하지 못하니까 스프라이트에 애니메이션 기능을 넣을 수는 없는 걸까요? 답은 "전혀 그렇지 않습니다." 입니다. GIF 파일을 불러오지 못해도, PNG 파일만으로도 충분히 애니메이션 스프라이트를 불러올 수가 있습니다. 이번 강좌에서는 외부 이미지를 불러와서 애니메이션화를 할 수 있는 두 가지 방법을 제시하고자 합니다. 첫 번째 방법은 스트립(Strip)으로 이미지를 불러오는 것입니다. 스프라이트 에디터에서 GIF 파일을 열면 쪼개진 이미지를 볼 수가 있습니다. 이 상태에서 스프라이트를 저장하게 되면, 이렇게 연속된 이미지로 저장됩니다. 위에서 저장된 스트립이 0~..
이번 강좌에서는 정말로 쉽게 구현할 수가 있지만, 어찌할 방법을 몰라서 발만 동동 구르는 게임 일시 정지 기능에 대해 다루겠습니다. 여러분은 강좌를 보기 전에 서피스를 먼저 배워두시는 편이 좋습니다. Create 이벤트입니다. 위 코드에서 눈여겨보아야 할 것은 'view_surface_id[0] = suf' 부분입니다. 제 서피스강좌를 보신 분들이라면 이게 화면을 서피스로 복사하는 역할을 한다는 것을 알 수가 있을 것입니다. 당연히 view_surface_id[*] 기능을 사용하는 게임 프로젝트는 뷰를 만들어야 하고요. 왜 화면을 서피스에 복사하느냐면, 게임이 일시 정지되기 때문입니다. 게임이 일시 정지가 되면, 일시 정지가 되기 전의 게임화면을 그려야 하므로 서피스로 따로 저장해 두는 것이죠. play..
게임메이커: 스튜디오(GameMaker: Studio)에서는 폰트 설정 없이 한글을 드로우 하게 되면 글자가 그려지지 않습니다. 여러분의 게임에 한글을 드로우 하려면 프로젝트에 폰트를 추가해야 합니다. * 게임메이커: 스튜디오의 문자열은 유니코드인 UTF-8 포맷으로 이루어져 있으므로, 폰트의 범위를 설정할 때는 유니코드 범위 목록을 살펴보는 것도 좋습니다. 먼저 Fonts 리소스에서 Create Font 로 새로운 폰트를 만들어주세요. 한글을 드로우 하려면 한글 폰트가 필요합니다. Font 에서 한글을 그릴 수 있는 폰트를 선택해주세요. * '@나눔고딕' 처럼 @가 붙어있는 폰트는 옆으로 누워있는 모양의 폰트입니다. 기본으로 추가되어있는 32 to 127 의 범위는 영어와 특수문자들이 들어있습니다. 불..
이번 강좌에서는 화면에 비가 내리는 파티클을 만들어볼 것입니다. 사실 원래는 짱 짱 멋진 캠프파이어를 예시로 하고자 했는데, 그 부분은 여러분이 구현하는 게 좋다고 판단하였습니다. 캠프파이어를 만들고자 하신다면, 불 모양은 part_type_shape 함수의 내장 스프라이트에서 얻으실 수 있습니다. (mamaqhf 님의 예시) 비는 모든 인스턴스 위에 존재하여야 합니다. 파티클 시스템의 깊이를 최대한 낮게 잡아줍니다. 이제 빗자국 파티클 타입을 만들어 봅시다. 원 모양을 주고 크기는 최대한 낮게 잡은 뒤 파티클이 존재할 시간을 잡아주세요. 가장 중요한 하늘에서 내리는 비 부분입니다. "part_type_death(pt, 1, pt2)" 부분의 코드를 통해서 자신이 사라지면 빗자국을 만드는 것을 보실 수가..
여러분들은 이펙트를 스프라이트로 그릴 수도 있지만, 파티클(Particle)이라는 시스템으로 컴퓨터로 만들 수도 있습니다. 게임메이커: 스튜디오(GameMaker: Studio)는 이런 파티클 기능을 쉽게 구현할 수 있게 해줍니다. 파티클은 게임메이커의 오브젝트의 기능과 매우 유사합니다. 속도, 가속도, 중력, 가변 크기, 생명, 파티클이 파괴될 시 파티클 생성 등 여러 가지 기능을 제공합니다. 당신은 강좌를 읽기 전에 게임메이커: 스튜디오의 도움말을 참조하여 어떤 파티클에 함수가 있는지 살펴보는 것이 좋습니다. 파티클을 조작하는 함수는 매우 다양하므로 강좌에서는 충분히 다루질 못합니다. 파티클의 생성은 기본적으로 '파티클 시스템 -> 파티클 타입 -> 파티클 이미터' 순서를 거치게 됩니다. 그러나 파티..
해시(Hash)란 무엇이고 왜 써야 할까요? 대부분의 게임은 소스 프로젝트 안에 유닛들의 능력치가 저장되어 있을 것입니다. 하지만, 대형 게임의 경우 패치를 통해 능력치 파일을 게임 폴더 등에 전송하게 되는데, 이때 누군가가 능력치 파일을 마음대로 수정한다면 골치가 아파지겠지요? 이럴 때 사용하는 게 암호화와 해시 기능이며, 이번 강좌에서는 해시에 관한 내용을 다룰 것입니다. 해시란, 어떤 문자열이나 파일에서 특정한 연산을 하여 특정한 문자열을 뽑아낸 것입니다. 이 문자열은 이론상으론 해시를 뽑아낸 데이터와만 일치해집니다. 그러므로 어떤 데이터가 단 1바이트라도 수정이 되면, 해시값이 크게 바뀌어서 파일이 수정된 것을 감지할 수가 있습니다. (해시는 암호화가 아닙니다. 단지 특정한 값을 뽑아낼 뿐입니다...