7P by gogoj2 2달전 | ★ favorite | 댓글 14개

2004년 여름, 군대에서 말년을 보내고 있던 저는 남는 시간에 뭘 할까 고민하다가 게임 기획을 하기 시작했습니다. 당시 동생이 게임그래픽 디자인을 전공하고 있어서 제대하고 나면 뭔가 하나 같이 만들어 보면 좋겠다고 생각을 했거든요. (아..저는 평범한 문과생입니다. 기술은 전혀)

아마추어 도전이었기에 작고 간단한 걸 만들려고 했습니다. 가장 만만한 게임 중 하나인 벽돌깨기(알카노이드)를 베이스로 새로운 대결 방식을 더했는데, 이미 수많은 사람들이 새로운 버전을 내놓았던 게임이지만 저처럼 만든 건 없어보였습니다.

제대를 하고는 동생과 동생친구들을 모아서 야심차게 팀을 꾸렸는데 얼마 못가 각자 사정이 생기면서 금방 팀은 엎어졌습니다. 다음에 기회가 되면 만들어야지 했는데 기회가 다시 오지 않더군요. 세월이 흘러 사회생활 하면서도 가끔 생각이 났고, 잠깐 파이썬을 공부해보겠다고 했던 시절에도 목표로 뒀었지만 저에겐 너무 어려운 과제 였습니다.

그렇게 시간이 흘러흘러 20여년이 더 지난 작년 여름, 미팅 끝나고 같이 저녁식사를 하는데 같이 미팅했던 기업 대표님들이 AI 로 만들 수 있는게 너무 많아졌다며 다들 재창업을 하고 싶다는 겁니다. 그날 자극을 받은 저는 밤에 집에 돌아와 말로만 듣던 클로드 코드를 설치해보게 됩니다. 그리고 2시간 후…뺌!!

클로드코드에 첫 프로젝트로 뭘 시켜볼까 고민하다가 20년전 아이디어를 되짚어가며 주문을 했는데, 2시간 정도 지나니 제 눈 앞에서 패들과 공이 움직이며 벽돌을 깨고 있었습니다. 그때의 전율이란. 이런 간증(?) 이제 넘쳐나니 익숙하시겠지만 반년이 지난 지금은 클로드코드 없으면 못사는 삶이 되었습니다.

게임은 그동안 조금씩 다듬다가 이제 그래도 데모라고 내놓을 수 있는 수준은 되어 용기를 내어 공개를 해봅니다. 그것도 눈팅만 하던 긱뉴스에!! 원래는 2인용 대전 게임으로 구상한건데, 멀티 유저 기능은 저에게 너무 높은 벽이라 컴퓨터와 대결하는 형태로 만들었습니다.

간단히 소개를 하면,

  • 컴퓨터용입니다. 모바일은 아직 대응을 못했습니다.
  • 2인이 한 공간에서 서로 등지고 하는 벽돌깨기 게임입니다. 먼저 벽돌을 다 깨는 쪽이 승리합니다.
  • 내가 공을 놓치면 상대방 영역으로 공이 넘어갑니다. 상대방이 놓치면 나에게 넘어 옵니다.
  • 현실세계의 물리 개념을 넣어 무게, 충격, 가속도, 관성이 있습니다. 생각보다 어렵습니다.
  • 데모 버전이라 단판후 재시작으로 계속 할 수 있습니다.
  • 어릴적 오락실 처럼 기록을 세우면 이름을 새길 수 있습니다.

개발 과정의 교훈도 적어보자면

  • 리팩토링! 리팩토링! 리팩토링!
  • 말로만 듣던 리팩토링이 뭔지 알게 되었고, 지옥 중에 리팩토링 지옥이라는 것이 존재할 수 있지 않을까 생각하게 됐습니다.
  • 처음에 꿈에 부풀어 배틀넷을 꿈꾸며 마구쪼개어 기능을 부풀렸다가 버그의 홍수 속에 결국 다 리셋 했다가 다시 쪼갰다가 합쳤다.. 오푸스 4.5 나오기 전이었습니다.
  • 이 작은 걸 하나 만들면서도 이정도인데, 프로그래머 분들에게 존경의 마음을 가지게 됐습니다.

다행히 지금은 분수를 좀 알게됐고, 작업을 잘게 쪼개서 워크플로우 문서를 만들고, 개발로그와 깃 커밋을 꼼꼼히 챙기는 작업자가 되었습니다. 가장 큰 소득은 해보고 싶은게 정말 많아졌다는 것입니다. 일하면서 필요한 도구들을 직접 만들어보려고 열심히 궁리중입니다.

이 게임은 어찌해야할지 고민입니다. 지금 저의 상황으로는 본격 개발을 하기는 어렵고, 그렇다고 그냥 묻어버리기에는 아깝고 합니다. 아이들이 즐겁게 할 수 있는 게임이 되었으면 하는 소망이 있습니다.

항상 긱뉴스의 소식들에서 많은 것을 배우고 있고 감사히 잘 보고 있습니다. 고맙습니다.

현실세계의 물리 개념을 넣어 무게, 충격, 가속도, 관성이 있습니다. 생각보다 어렵습니다.

게임 물리학에 이해도가 낮은 부분이 느껴지는 멘트여서 좀 다듬어주시면 좋을 것 같습니다.

직접 다듬어주세요 ㅋㅋ 문과생 앞에서 가오잡지 마시구

문과생의 마음을 걱정해주셔서 감사합니다.ㅎㅎ ^^

제가 문구를 다듬어드리기 어려운 이유는 제가 만드신 코드를 보지 않아서 어떤 방식으로 물리엔진을 구현하셨는지 모르기 때문입니다.

원치 않은 지적을 드린 부분에 대해서 제가 사과드립니다.
많은 분들이 프로덕트 홍보를 하시는데, AI로 홍보하시거나 적절하지 않은 설명들을 첨부하시는 경우가 많아서 댓글을 남기는데요. 화나게 만들려고 적은 댓글은 아니었습니다.

관심 감사합니다. 전혀 기분 나쁘지 않았습니다. 조언은 항상 감사하죠. 오히려 어디를 어떻게 고쳐야 한다는 것인지 이해를 못해서 좀 더 자세히 설명해주시면 좋겠습니다.

현실물리를 적용했다는 내용에 대해 더 설명을 드리면, 이런 게임들이 보통 아주 간단한 충돌 감지 및 반사 만 구현을 하더군요. 근데 저는 실제 핀볼게임 처럼 공이나 벽돌이 충돌할 때 실제 무게감과 속도에 의한 충돌의 에너지가 느껴졌으면 좋겠다는 생각이 들어서 게임용 라이브러리 보다 좀 더 정교하다는 Planck.js 를 찾아다가 써보게 됐습니다. 벽돌이 공에 맞으면 그 충격에 밀리고 회전하고 하는 것을 표현을 했고요. 설정에서 공의 무게, 벽돌의 무게, 충돌 에너지의 감쇠, 저항 이런 것들을 바꿀 수 있게 되어 있어서 설정에 따라 다른 경험을 하게 만들었습니다.
(제가 크레이지 모드라고 부르는 설정이 있는데, 공의 무게를 최대로 올리고 벽돌의 무게를 최소로 낮추면 아주 다이나믹한 게임이 됩니다.)

코드도 깃허브에 있습니다.
https://github.com/gogodevelop2/mirror-breakout

넵 코멘트 드리면,
우선 충돌 설계, 반발계수 설정 등에서 더 많은 노력을 들이신 것 같습니다.
그리고 특히 충돌을 각각의 질량과 반발계수로 계산되어 발생하게 되었는데, 목적으로 하신 것과 다른 부분들을 말씀드리면

paddle이나 brick의 질량이나 속도 같은 것들이 ball의 모멘텀에만 영향을 주므로 사실
본질적으로는 충돌방식을 물리학 모델에서 영감을 받아
공과 (벽돌, 패들, 벽) 사이의 충돌을 각각 다르게 짜신 것에 가깝습니다.

따라서 현실 물리학이라고 말씀하시기 보다는, 물리엔진의 요소들을 차용해서 충돌과 모멘텀 변화를 다이나믹하게 설계하셨다고 설명하시는 것이 좋아보입니다.

특히, 충돌과정이 비현실적이어서 모멘텀이 달라지는 것들을 스피드 보정으로 적용하셨는데 이것이 조작감 측면에서는 히든처럼 느껴질 수도 있고, 되게 불친절한 면처럼 느껴질 수도 있는 것 같습니다.

조금 더 쉽게 풀어서 설명드리면,
물리학적인 수식들과 계산 방식이 쓰였지만 결과론적으로는 현실적이지 않은
모델이고, 현실적이지 않은 부분들에서 발생하는 문제들을 게임적으로 막기 위해(무한 스피드, 멈춤, 방향 조절 등) 에서 보정하신 부분들이 많이 들어가 있습니다.

상세한 설명 감사합니다. 이해가 잘 되었습니다. 게임 제작을 처음 해보다보니 게임물리학이라는 세계와 용어 사용의 적절함에 대해 잘 몰랐던 탓에 설명이 오해를 부르도록 적었었네요. 설명을 들으니 현업에 계시는 분들이 어떤 수준으로 결과물들을 바라보시는지 조금 알 것 같습니다. 본문 수정하는 법을 못찾겠어서..알아보고 수정하겠습니다. 고맙습니다.

컨셉은 재밌는데, 조작감이 너무 안좋네요. 이런 게임에 조작에 관성을 적용하는 건 좋은 아이디어는 아닌거 같습니다. 난이도와는 좀 다른 이야기인것 같아요.

의견 감사합니다. 말씀 주신 점 고민해봤고 관성을 반으로 줄여서 좀 더 조작이 쉽도록 했습니다. 제가 생각한 물리컨셉을 우선으로 생각했는데, 게임의 조작성과 부딪힐 때 어떻게 해야하는지를 좀 더 고민하게 됐습니다. 계속 고쳐나가보겠습니다. (본업이 바빠져서 반영이 늦었습니다.)

FURY 님이 누구신지.. 엄청난 점수를 기록하고 가셨네요.;;

 
[숨김 처리된 댓글입니다]
숨김 처리된 댓글

감사합니다.ㅎㅎ 저도 취미활동 응원하겠습니다!