GN⁺: 완전 초보자를 위한 Go 언어로 게임 만들기
(threedots.tech)코딩으로 재미 찾기: 게임 개발로 번아웃 극복하기
- 개발자 커뮤니티에서 자주 보이는 불만: 코딩에 대한 열정이 사라짐
- 번아웃을 해소하기 위한 팁: 코딩을 다시 즐기기 위해 자신만의 게임 만들기
- 게임 개발로 프로그래밍에 빠진 개인 경험 공유
- Go 언어와 Ebitengine 라이브러리를 사용하여 게임 개발 권장
게임 개발의 기본 원리
- 영화와 유사하게, 게임은 빠르게 연속된 이미지(프레임)의 집합
- 게임은 실시간으로 이미지를 생성하고, 사용자 입력에 따라 다음 프레임 변경
- 게임은 기본적으로 무한 루프, 이미지 그리기와 로직 업데이트 반복
프로젝트 설정
- Go 모듈 생성 및 Ebitengine 라이브러리 추가
- 게임 인터페이스의 최소 구현으로 빈 창 실행
자산 로딩
- 프로그래머 아트를 사용하거나 무료 자산 활용 권장
-
embed
패키지를 사용하여 자산을 코드에 로드
이미지 그리기
-
Draw
메소드 내에서 모든 그리기 작업 수행 -
ebiten.Image
의DrawImage
메소드를 사용하여 다른 이미지 위에 이미지 그리기 -
DrawImageOptions
구조체를 통해 이미지의 위치, 회전, 크기 조절
게임 로직
-
Game
구조체는 게임 상태를 유지하고Update
메소드로 상태 변경 - 예시로 플레이어의 위치를 (X, Y) 벡터로 유지
움직임
-
Update
메소드에서 플레이어의 위치를 업데이트하여 움직임 구현 - 키보드 입력에 따라 플레이어의 위치 변경
타이머
- 게임 내에서 시간에 따른 로직 변경을 위한 타이머 구현
-
Timer
구조체를 사용하여 특정 시간 간격으로 이벤트 발생
게임 오브젝트
- 플레이어와 같은 게임 오브젝트를 캡슐화하여 관리
- 각 오브젝트는 자체
Update
및Draw
메소드를 가짐
오브젝트 생성
- 메테오 오브젝트를 생성하고 화면 가장자리에서 스폰
-
Game
구조체는 메테오 오브젝트를 추적
총알 발사
- 총알 발사 로직과 쿨다운 타이머 구현
-
Player
가 총알을 생성하고Game
이 추적
충돌 감지
- 충돌 감지를 위해
Rect
구조체와Collider()
메소드 구현 - 게임의
Update
에서 오브젝트 간 충돌 검사
GN⁺의 의견
이 글에서 가장 중요한 것은 개발자들이 번아웃을 극복하고 코딩에 대한 열정을 되찾을 수 있는 방법을 제시한다는 점이다. 게임 개발은 창의적이고 재미있는 프로젝트를 통해 코딩 기술을 연습하고, 동시에 새로운 언어나 라이브러리를 배울 수 있는 기회를 제공한다. 이 글은 개발자들에게 코딩을 취미로 다시 즐길 수 있는 영감을 주며, Go 언어와 Ebitengine 라이브러리를 사용한 게임 개발의 기본적인 접근 방법을 설명함으로써 흥미를 불러일으킨다.
Hacker News 의견
- 첫 번째 사용자는 새로운 언어나 그래픽 API를 배울 때 성능 테스트를 위해 파이어워크나 간단한 파티클 시뮬레이션을 작성하는 것을 선호함. 2021년에 Go와 Ebitengine을 사용하여 실험했을 때, 60fps에서 많은 픽셀을 움직일 수 있었던 놀라운 성능과 사용의 용이성에 깊은 인상을 받음.
- 두 번째 사용자는 지난해 Go 언어를 사용하여 g3n-engine을 이용한 게임 개발을 진행함. Go 언어를 좋아하고 배우고 싶어 선택했으며, 과거 2D 게임 개발 경험에 이어 3D 작업을 하고 싶어 g3n-engine을 선택함. 게임 제작은 유급 작업보다 훨씬 도전적이고 보람찬 경험이며, 학습해야 할 내용이 끊임없이 있음.
- 세 번째 사용자는 Go 언어를 위한 Ebiten API가 매우 좋으며, API 디자인에서 영감을 받을 수 있음을 언급함. 또한, Go를 C++로 변환하는 사용자 정의 컴파일러를 사용하여 게임 개발에 성능을 향상시키고, C/C++ API에 접근하며, WebAssembly에서도 좋은 성능을 제공함. 이 컴파일러는 Go 코드에서 GLSL을 생성하는 실험도 포함함.
- 네 번째 사용자는 Go 개발자는 아니지만, Go를 사용하여 게임을 만드는 한 YouTuber/Twitch 스트리머를 오랫동안 지켜봄. 해당 스트리머는 Go로 작은 MMO를 개발하고 있으며, OpenGL과 WASM을 사용하여 웹 버전을 개발함. Go의 가비지 컬렉션이 매우 견고하다고 이해함에도 불구하고, 많은 사람들이 "왜 Go로 만드는가?"라고 물음.
- 다섯 번째 사용자는 기사의 첫 부분에만 반응하며, 저자가 설명한 번아웃을 경험하고 있다면 취미를 "재정복"하기보다는 관심사를 발전시키는 것을 제안함. 이는 뇌가 정체되고 있다는 신호일 수 있으며, 프로그래밍과 다르지 않아도 좋지만, 컴퓨터 과학 이론으로 더 깊이 파고들 시기일 수 있음.
- 여섯 번째 사용자는 몇 년 동안 Ebitengine 사용자로서 만족스러운 경험을 함. Ebitengine으로 만들어진 게임의 소스를 보고 싶다면 awesome-ebitengine 목록을 확인할 것을 추천함. 해당 사용자의 itch.io 프로필에 나열된 모든 게임은 Ebitengine을 사용하여 만들어졌으며, 모두 오픈 소스임.
- 일곱 번째 사용자는 Ebitengine을 사용하여 게임을 개발 중이며, 경험이 상쾌하다고 느낌.
- 여덟 번째 사용자는 Go가 큰 게임을 작성하기에 적합한 플랫폼인지, C#을 사용하는 것을 정당화할 만큼 충분한 라이브러리와 성능이 있는지에 대해 의문을 제기함.
- 아홉 번째 사용자는 Go의 고루틴 개념 때문에 게임 제작에 적합한 언어인지 궁금해하며, 언젠가 시도해볼 생각임.
- 마지막으로, Ebitengine을 기반으로 한 게임에 대한 언급이 있으며, "Sprite 컴포넌트 예시가 어떻게 보일 수 있는지"에 대한 문장이 끊겨 있어 수정이 필요함을 지적함.