첫번째 기획편을 쓰고 창피해서 안쓸까 하다가
기왕 시작한거 마무리는 지어야겠다는 생각에 마저 적도록 하겠습니다.
프로그래밍은 게임 개발에서 가장 핵심이 되는 부분이고,
이 글을 읽는 개발자 분들이 가장 많은 관심을 갖는 부분일 겁니다.
제가 이 글에서 전달하고 싶은 것은
게임을 개발 하는데 있어서 필요한 도구들, 언어, 게임 엔진의 선택,
그리고 시행 착오를 줄이고 초보 게임 개발자 분들이 좀더 쉽게 접근할 수 있는 방법 등입니다.
(2) 게임 프로그래밍
제가 작년 10월에 안드로이드를 처음 시작하면서 안펍에 가입을 했던 기억이 납니다.
전 그 당시에도 게임을 만드는 부분에만 관심이 있었기 때문에 다른건 관심도 두지 않았어요.
일단 안드로이드 설치 방법을 찾아서 설치를 하고 이클립스를 깔고 준비를 마친 후에
게임에 관련된 샘플 소스를 찾았습니다.
그 당시 제가 했던 것은 샘플 소스에서 제가 쓰지 않는 부분은 전부 삭제해버리고 이미지를
뿌리는 부분만 남겨놨습니다. 몇십 줄의 소스로 다이어트가 됐던 기억이 납니다.
개인적으로 이미지만 뿌릴 수 있다면 게임 개발의 50%는 다 된거나 다름없다는 주의라서
자바를 처음 접해 보지만 무작정 코딩을 시작했습니다.
자바 역시 문법 자체는 C와 다르지 않아서 자바를 모르는 상태에서도 쉽게 코딩이 가능하더군요.
간단한 이미지를 만들어서 터치 트위스터라는 게임을 만들었는데 정확하게 하루밤 걸렸습니다.
이게 하룻밤 만에 만든 허접 게임 터치 트위스터 입니다.
BeenieSoft라는 브랜드 네임을 처음 사용하게 된 게임이기도 하네요.
19년이나 게임을 개발했지만 이 게임의 소스를 보자면 부끄럽기 짝이 없습니다.
이유는 간단합니다. 게임 개발 툴이 없었기 때문입니다.
"게임 개발 툴이란 무엇인가?"
게임 개발 툴은 게임 개발에 필요한 리소스들을 규격화 해서 작업 기간을 단축시켜주고
게임의 확장성과 호환성을 높여주는 역할을 합니다.
쉽게 예를 들면 게임 개발 툴 없이 작성한 100줄 자리 게임 소스가 있다고 하면
제 경우, 게임 개발 툴을 사용하여 50줄 이내로 줄일 수 있습니다.
소스의 분량을 줄이는 역할만 하는 것이 아니라 소스 코드를 간결화 해주고, 디버깅도 용이하게 해줍니다.
위의 터치 트위스터를 예로 들어 보겠습니다.
터치 트위스터에 사용된 게임 이미지 입니다.
실제로 터치 트위스터란 게임 도중에는 위의 이미지 1장 외에는 나오질 않습니다.
당시엔 개발 툴이나 엔진이 없던 상황이므로 모든 이미지의 사이즈를 똑같이 맞춰서
프로그래밍 작업시 좌표 계산이 쉽게끔 했습니다.
얼굴 이미지 1장당 80x80을 썼던걸로 기억합니다.
이 게임의 경우는 똑같은 크기와 모양의 이미지들로 게임이 가능했으므로 쉽게 해결됐습니다만,
만약 다양한 이미지들이 나와야 하는 일반 게임의 경우 이미지의 모든 사이즈를 알고 있어야 하는
문제점이 있습니다.
뿌릴 영역의 위치와 크기, 소스 영역의 크기 모두 알고 있어야 원하는 이미지가 나올테니까요.
수십장 정도의 이미지까진 어찌 된다고 해도 100여장이 넘어가면 한계를 느낄 수 밖에 없습니다.
이런 이유 때문에 게임 개발 툴의 필요성이 절실해지는 것이지요.
이건 제가 만든 게임 개발 툴입니다.
DOS 시절부터 쓰던 툴을 윈도우 용으로 바꾸고, 데이터 포맷을 변환하고, 온라인 게임용으로 바꾸고
이런 과정을 계속 거쳐서 쓰던 툴입니다만, 이걸 다시 안드로이드용으로 컨버팅을 했습니다.
윈도우용 개발 툴에는 데이터 파일 안에 이미지 데이터까지 모두 포함이 되어 있습니다만,
안드로이드에선 리소스에 있는 파일만 써야하므로 이미지에서 사용할 영역의 좌표값만 기억하게 하고
이걸 다시 애니메이션 좌표로 보정해서 쓰는 파일 포맷을 썼습니다.
이미지 파일의 좌표 영역은 *.SPR 파일로, 애니메이션 좌표는 *.ANI 파일로 저장해서 썼습니다.
이 툴을 사용한 이후에 알까기 온라인 게임은 7일, 오목은 2일, 장기가 2일 정도 소요됐습니다.
게임 개발 툴의 위력은 이 정도로 막강합니다. 만약 게임 개발 툴이 없었다면 이런 게임들의 개발은 힘들었을겁니다.
개발 툴에 대해서 쓰다보니 쓸데없는 얘기가 길어졌는데요.
게임 개발자에게 있어서 개발 툴이 있고 없음은 게임의 퀄리티부터 개발 과정 자체가 달라진다는걸 명심해주세요.
"게임 개발 툴만 있으면 모든게 해결되나요?"
네. 너무나도 당연히! 물론! 아닙니다. 게임 개발 툴만 있다고 해서 모든게 해결되진 않지요.
게임 개발툴에서 만들어진 데이터들을 읽어와서 게임 화면 위에 손쉽게 뿌려주고 관리할 수 있는 코드가 있어야 겠지요.
이것을 우리는 흔히 "게임 엔진"이라고 부릅니다.
언리얼 엔진, 유니티 엔진, 크라이 엔진, 코코스2D 엔진 등 여러분도 한번쯤 들어봤을 법한 엔진들이 많이 있을 겁니다.
이 엔진들은 모두 게임 내에서의 이미지(혹은 폴리곤) 출력과 이동 등을 처리해주는 부분들이 들어가 있습니다.
사실 이미지를 뿌리고, 회전시키고, 확대시키고, 축소시키고, 이동시키는 일들이 게임 엔진의 핵심이라 하겠습니다.
중요한건 위에 소개한 모든 게임 엔진들은 모두 "좋은 개발 툴"을 함께 제공하고 있다는 점입니다.
물론 공개된 안드로이드용 게임 엔진들 중에는 툴 없이 제공되는 엔진들도 있습니다만,
대부분의 경우는 "게임 개발 툴 + 라이브러리 = 게임 엔진"의 등식이 성립됩니다.
자! 여기서 여러분은 한가지 선택을 해야 합니다.
"내가 직접 게임 엔진을 만들 것이냐? 아니면 유료/무료 게임 엔진을 사용할 것이냐?"
내가 직접 게임 엔진을 개발하고자 할 경우의 체크 리스트
(1) 내게 게임 개발 툴의 개발 능력이 있는가? (델파이,VC,VB 등 사용 능력)
(2) 만약 있다면 3개월 이내에 실무에 사용 가능한 개발 툴을 완성할 수 있는가?
(3) 내가 만들고자 하는 게임 엔진에 필요한 기능들을 설계하고 만들어 낼 수 있는가?
유료/무료 게임 엔진을 사용하고자 할 경우의 체크 리스트
(1) 타인이 개발한 라이브러리를 사용해본 경험이 있는가?
(2) 내가 필요로 하는 기능을 해당 게임 엔진에서 제공하고 있는가?
(3) 영어로 된 메뉴얼을 읽고 이해할 능력이 있는가?
위의 체크 리스트를 토대로 선택하면 크게 실수하는 일은 없을 겁니다.
자신이 직접 개발 툴과 엔진을 개발하는 경우, 완성을 해낸다면 내가 작성한 코드이므로
수정, 변환이 자유롭고 이걸 토대로 게임을 개발하는 시간이 매우 빨라집니다.
(제 경우 다른 게임 엔진을 사용하지 않고 제 엔진을 사용하는게 개발 시간이 더 빠릅니다.)
알려진 게임 엔진을 사용하는 경우, 검증된 엔진들은 퍼포먼스를 보장해주기 때문에
게임의 퀄리티를 어느정도 수준 이상으로 유지할 수 있고, 개발 툴과 엔진을 개발하는데
투자할 시간을 게임 개발에 투자할 수 있다는 장점들이 있습니다.
자! 게임 엔진의 선택은 이쯤에서 정리하고, 실제 게임 개발을 하려면 어찌해야 할까요?
게임 개발이 전혀 없는 프로그래머들은 게임을 만들자고 결심한 순간부터 고민이 시작됩니다.
"도대체 뭘 어떻게 어디서부터 시작해야 하지?" 이 생각 한번쯤은 다들 해보셨겠죠?
제가 드릴 수 있는 해결책은 이겁니다.
"공개된 게임 샘플들을 적극 활용하세요."
게임 개발을 배우는데 있어서 이거보다 좋은 방법은 없습니다.
문제는 자신이 만들고 싶은 게임과 관련된 소스들만 찾으려고 하지 마시라는 겁니다.
이게 과연 가능한 걸까요? 불가능합니다. 여기서부터 오류가 발생하죠.
수많은 사람들이 인터넷을 뒤져서 필요한 소스를 찾는데 그 소스들이 모두 있다면
뭐하러 어렵게 코딩을 하겠습니까?
만들고 싶은 게임에 관련된 소스를 찾지 마시고, 자신이 가장 보기 쉬운 소스를 찾으세요.
제가 터치 트위스터를 만들때 사용했던 방법입니다.
안펍과 안사를 뒤져서 가장 간결하고 보기 쉽게 돼 있는 소스를 찾았습니다.
실제로 샘플 코드는 게임이 작동되는 소스도 아니었습니다.
단순히 이미지를 출력해주는 정도의 소스였습니다만, 아주 짧고 쉬운 코드였기 때문에 선택했습니다.
완성도 높은 게임은 소스 코드도 길게 마련입니다.
코드가 길다면 당연히 그걸 분석하고 이해하는데만도 상당한 시간이 요구되지요.
그러다가 지쳐서 포기하게 되는게 게임 프로그래밍입니다.
"모든 내용을 다 이해하려고 하지 마세요."
남이 만든 소스를 구했을때 초보 개발자들이 하는 가장 큰 실수가 소스의 첫줄부터 독파한다는 겁니다.
첫줄부터 모르는 메소드가 나오면 책을 찾아 이게 뭔가 하고 뒤져보게 됩니다.
이거 쓸데없는 짓입니다. 하다보면 결국 나중에 다 알게 될 것을 "공부"를 해서 외우려고 하면 내것이 아닙니다.
몸으로 직접 체득을 해야 하는 것이지, 공부로 외운 것은 필요성이 없어지는 순간에 사라지게 됩니다.
아 이건 대충 무슨 기능을 하는거겠군? 하는 추측하는 정도로 충분합니다.
터치 트위스터를 만들때 저는 이미지를 출력해주는 메소드를 제외하고 어떤 메소드도 검색해보지 않았습니다.
실제로 저는 안드로이드 책 1권도 없이 게임 개발을 시작했고, 지금도 마찬가지입니다.
필요한 곳에 집중하라는 의미입니다.
그렇다고 다른 부분이 중요하지 않다는건 아닙니다. 오해하지 마세요.
게임 개발은 긴 여정이 필요한 만큼 먼저 안쪽부터 파도 들어서 밖으로 나오는 과정을 밟으시라는 의미입니다.
"모르는 것을 부끄러워 하지 마세요."
프로그래밍만이 아니라 인생의 모든 부분에 해당되는 이야기입니다만,
모르는 것을 부끄러워 하는 사람은 절대 발전할 수 없습니다.
제가 질문/답변 란에 질문한 내용이 3페이지에 달하더군요.
나름 19년차 개발자로 살아오고 있습니다만, 모르는건 모르는 겁니다. 쪽팔릴 이유가 없지요.
어느정도 개발 경력이 있다고 해서 "아 이런거 물어보긴 창피한데?"하는 순간 개발자로선 빵점입니다.
제 나이 이제 곧 40을 바라봅니다만, 상대가 중고생이라도 모르는 것을 물어보는 것에 주저하지 않습니다.
인터넷이 안된다면 모를까 예의를 갖춰 질문하면 배울 수 있는 곳이 널려 있습니다.
저 역시 이곳에서 많은 것을 질문하며 배웠기에 이런 글을 쓰며 조금이라도 후배님들에게 도움을 드리려고 하는거고요.
여러분도 그렇게 하시면 됩니다.
"첫 작품은 가벼운 것부터 시작하세요."
게임 개발에 경험이 없는 상태에서 앵그리버드 같은 게임을 만들겠다고 목표를 설정하면
실제로 개발되어 나오는 작품은 헝그리버드가 될 겁니다.
기존에 나와있던 게임의 카피도 좋고, 자신이 전혀 좋아하는 장르가 아니어도 좋습니다.
쉽고 가볍게 만들 수 있는 게임을 첫 작품으로 정하시고 도전한다는 생각으로 임하세요.
게임이 재미는 없을지라도 그걸 완성해 냈을 때의 기쁨은 앵그리버드를 개발했을 때의 기쁨과 다르지 않습니다.
"가능하다면 OpenGL로 개발을 시작하세요."
안드로이드에서는 게임 개발에 2가지 옵션을 사용할 수가 있는데요.
한가지는 Canvas라는 것이고, 다른 한가지가 OpenGL 입니다.
저는 안드로이드에서 OpenGL을 쓸 수 있다는 것조차 모르는 상태에서 시작해서 무조건 Canvas를 썼습니다만
실제로 게임을 완성해서 런칭해보면 갤럭시 기종에서 게임이 갑자기 느려진다던가 하는 문제점들이 있습니다.
OpenGL로 엔진을 변경하고 나서는 그런 일이 발생하지 않아요.
이건 제 경험에 의한 것이니 비록 이해하기 어렵더라도 OpenGL을 사용하시길 강력하게 권해 드립니다.
OpenGL을 사용하실 때도 위에서 말씀드린 것처럼 메소드 하나하나를 다 이해하려고 하지 마시라는 겁니다.
저는 아직도 OpenGL의 메소드들이 무슨 기능을 하는지 완벽하게 알지 못합니다.
이 코드들은 OpenGL 초기화에 필요한 것들, 이 코드들은 실제로 이미지 뿌릴때, 이것은 이미지 회전할 때,
이런 정도로 알고 있을 뿐입니다. 하지만 게임 개발하는데는 아무런 지장이 없지요.
OpenGL의 또 한가지 장점은 아이폰에서도 OpenGL을 지원하므로
안드로이드/아이폰 동시 개발이 가능하다는 겁니다. 소스 코드를 60% 이상 재활용할 수 있어요.
휴! 게임 프로그래밍에 관해 제가 드릴 수 있는 정보는 이 정도가 한계일듯 합니다.
혹시나 공부에 도움이 되실까 싶어 제가 개발했던 터치 트위스터의 쓰레기 같은 소스를 올립니다.
파일 크기가 1메가로 제한돼 있어 3개로 분할 압축했으니 필요하신 분은 알집으로 풀어쓰세요.
다음에 기회를 봐서 간단한 온라인 게임 개발 강좌를 올리도록 하겠습니다.
VC를 이용한 간단한 서버와 클라이언트 소스를 공개하려고 합니다.
언제가 될지는 장담 못하겠습니다만, 빠른 시일 내로 준비하도록 하겠습니다.
1인 게임 개발을 하시려는 분들에게 조금이나마 도움이 되었으면 좋겠네요.
긴 글 읽어주셔서 감사 드립니다.
WhiteB님 감사합니다. 그런데 전 중국이라 그런지 연결이 안되네요. 다른 분들 다운 잘 되시는지요?