soma0sd

코딩 & 과학 & 교육

반응형

저는 캐릭터, 몬스터, 공격, 효과, UI 등 그래픽 리소스를 에이스프라이트aseprite로 그리고 있습니다. 에이스프라이트(aseprite)는 현재 스팀에서 20,500 원에 판매중인 픽셀아트 및 픽셀 애니메이션을 제작할 수 있는 응용프로그램입니다. 그림 그리는 실력이 모자라 임시로 작업하고 있습니다. 나중에 협업이나 의뢰를 통해 필요한 그래픽 리소스만 별도로 작업해야 하는 상황에 대비해 코딩과 그래픽리소스 작업을 분리하기로 했습니다. 에셋 데이터 asset_data.json은 json 형식으로 작성한 에셋 데이터 파일입니다. 그림 파일의 각 조각에 이름을 부여하여 코딩으로 다룰 수 있도록 만드는 역할을 수행합니다. { "파일명": { "size": "그림 조각의 크기", "prefix": "타일 id..

게임 개발일지: 그래픽 리소스와 게임 데이터

오늘은 키 입력을 받아 플레이어 캐릭터가 이동하는 방법과 화면을 이동하는 방법을 결정합니다. 플레이어 이동 플레이어 이동은 즉시 일정속도로 움직이기보단 방향키를 누르는 동안 최대속도까지 점점 가속하는 방식입니다. 이 방식은 방향키를 짧게 누르면 조금만 움직이고 누르고 있는 동안에는 충분히 빠른 속도로 이동할 수 있어서 조작감을 향상합니다. $$ \begin{align} v_{new} &= v_{0} + a \\ x_{new} &= x_{0} + v_{new} \end{align} $$ 이전 위치 \( x_{0} \)와 이전 속도 \( v_{0} \), 가속도 \( a \)를 통해 새 위치 \( x_{new} \)를 구합니다. 화면 이동 게임은 플레이어 캐릭터가 게임화면의 중앙에 위치합니다. 플레이어가 이..

게임 개발일지: 플레이어 이동과 화면 이동

파이게임(pygame)을 사용하여 게임을 만드는 중에 작성하는 일지입니다. 게임 실행 시나리오 주요 클래스와 구조를 파악하기 위해 간단한 실행 시나리오를 작성합니다. 앱(App) 클래스 초기화: 파이게임 초기화, 게임 데이터와 옵션 초기화 장면(Scene) 클래스 초기화: 시작 메뉴 장면, 인게임 장면 등 앱(App) 클래스 랜더링 시작(mainloop()): 이벤트 수신, 장면 업데이트, 장면 랜더링 수행 대략 이런 모양이 될듯 합니다. 검은색 화살표는 런타임때 실행하는 순서, 빨강 점선은 데이터 교환을 의미합니다. App 클래스 틀 작성 class App: """앱 클래스""" running: bool = False def __init__(self): """ 앱 초기화""" App.running = ..

게임 개발 일지: 모듈과 클래스 형식 만들기

오늘부터 파이썬의 게임모듈 파이게임(pygame)을 사용하여 슬라임 서바이벌(가칭)이라는 게임을 개발합니다. Python 3.9.12 pygame 2.1.2 (SDL 2.0.18) 위는 기초 언어 환경입니다. 파이게임은 LGPL 라이선스를 사용하며 SDL2을 파이썬에서 사용할 수 있도록 만들고 몇 가지 기능이 추가되어있는 모듈입니다. 기초 개발환경은 파이썬 3.9의 최신 릴리즈와 파이게임 2.1.2를 사용합니다. mypy 0.942 black 22.3.0 pydocstyle 6.1.1 개발 편의성 도구입니다. 마이파이(mypy)는 소스코드 검사를 수행하며 디버그를 실행하기 전에 상당수의 오류를 미리 잡아줘서 편합니다. 블랙(black)은 파이썬 코드를 규격에 맞게 정리해주는 역할을 수행합니다. 여러 소스..

게임 개발 일지: 기본 개발 환경 구성

이전에는 키보드 조작으로 타일맵 이동코드를 추가했습니다. 이 방법은 키보들르 눌렀을 때 한 번만 이동하고 원하는 만큼 이동하려면 그만큼 여러번 눌러야 합니다. 게임 시스템에 따라 그방식이 좋은 경우도 있지만, 키보드를 누르고 있는동안 부드럽게 이동하는 것이 좋은 경우도 있을 것입니다. 오늘은 게임의 타일맵을 키보드의 WASD키를 누르고 있는 동안 이동하도록 만들고, 부드러운 이동을 위해 누르는 동안 타일맵의 이동이 가속하도록 만듭니다. 키보드 이벤트 Pygame의 키보드 입력을 매개변수로 받아 카메라의 속도를 변경하는 메서드를 작성합니다. 이 때, 무한정 가속하면 게임할 때 문제가 있을테니 [-10, 10]범위에서 가속하도록 합니다. 키보드에서 손을 떼면 가속과 속도를 무시하고 즉시 정지하도록 합니다. ..

Pygame: 키보드를 누르고 있으면 타일맵 이동을 가속

이전의 등축투영 타일의 좌표 포스트는 코드를 기준으로 설명했고 배치하는 방식에 대한 설명이 꽤나 불성실해서 보충하는 포스트를 작성하였습니다. 규칙을 파악하기 각각 \( w_{tile} \) 는 타일셋 이미지의 너비, \( h_{tile} \)는 타일셋 이미지의 높이, \( w_{grid} \)는 배치할 격자의 너비, \( h_{grid} \)는 배치할 격자의 높이입니다. 아이디어를 얻기 위해 그림을 보며 수식으로 정리해봅니다. $$ \begin{matrix} f_{x}(0, 0) = & 0 & f_{y}(0, 0) = & 0 \\ f_{x}(1, 0) = & - 0.5 w_{grid} & f_{y}(1, 0) = & 0.5 h_{grid} \\ f_{x}(0, 1) = & 0.5 w_{grid} & f_..

Pygame [보충]: 등축투영 타일의 좌표

만드는 게임이 건설 운영 시뮬레이션이다보니 캐릭터의 이동이 아니라 직접 조작으로 화면을 옮기는 기능이 필요합니다. 오른손은 마우스로 바쁠테니 WASD이동을 하는 편이 좋겠죠. 타일맵 이동 소스코드의 move() 메서드 먼저 살펴보면 self.__cam_pos_x 값과 self.__cam_pos_y 값을 변경하는 것을 볼 수 있습니다. 이 값들은 blit_to() 메서드에서 타일 배치 좌표를 보정하는 역할을 합니다. 보정값을 바꿨으니 모든 타일의 위치가 변합니다. def blit_to(self, surface: "Surface"): """지정한 표면에 타일맵을 출력""" surface.fill(pygame.Color(0, 0, 0, 0)) xlim, ylim = self.shape xcenter = sur..

Pygame: 키보드 조작으로 타일맵 이동

게임을 제작하다보니 소스코드의 덩치가 꽤나 커져서 깃허브에 저장소를 만들었습니다. 등축투영(isometric) 타일은 정육면체를 표현할 때 윗면만 보이는 직교좌표계 타일맵과는 다르게 세 면이 동시에 같은 넓이로 보이는 타일맵을 의미합니다. 높이 표현이 수월하며 입체 표현이 용이합니다. 그러나, 타일을 그릴 때 정사각형을 기반으로 하는 직교좌표계 타일보다 그리기가 어렵고, 캐릭터의 이동방향이 기울어져있어 조작의 직관성이 떨어진다는 단점이 있습니다. 오늘은 어제 한 타일 배치에 이어 파이게임(Pygame)의 게임화면에 배치한 등축투영 타일맵을 중앙에 배치하도록 합니다. 타일맵을 그냥 배치하면 제일 위쪽의 타일부터 배치하다보니 게임 타일맵 전체가 한쪽에 치우친 것을 볼 수 있습니다. 게임을 시작할 때 한쪽에 ..

Pygame: 등축투영 타일맵을 가운데 배치하기

오늘은 등축 투영(isometric) 타일배치를 위한 좌표계를 구현해봅니다. 직교 좌표계를 등축투영 좌표계로 변환 하향식 게임에서 사용하는 직교좌표계 타일에서 왼쪽 위가 (0, 0) 좌표일 때, 이 타일 좌표계를 그대로 회전시켜 등축투영(isometric) 좌표계로 변환하면 그림처럼 왼쪽 끝이 (0. 0) 좌표계가 됩니다. 하지만 이대로 타일을 배치하면 문제가 발생합니다. 타일을 x가 0인 지점부터 차례대로 채운다고 하면 랜더링 하는 순서로 인해 그림과 같은 문제가 생깁니다. 원점을 꼭대기 부분으로 바꾸지 않으면 계산이 편하긴 하겠지만 랜더링 순서로 인해 맵에 벽이나 언덕 타일이 있는 경우 심각한 문제가 발생합니다. 타일셋 이미지 예제를 작성하기 전에 타일셋 이미지를 프로젝트 디렉토리 내부의 asset/..

Pygame: 등축투영 타일의 좌표

End of content

No more pages to load

◀ PREVNEXT ▶