Python 게임 개발: Pygame으로 만든 스페이스 쇼터 튜토리얼

게임 개발을 통한 Python 프로그래밍 경험 공유

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

앱 개발

대상자

- 초보~중급 Python 개발자: Pygame 기반 게임 개발 기초와 확장성 학습

- 게임 개발 흥미자: 객체 지향 프로그래밍 적용 사례 분석

- 튜토리얼 활용자: 기초 코드를 기반으로 독자적인 기능 추가 방법

핵심 요약

  • pygame을 사용한 스페이스 쇼터 게임 개발 과정 공유 (Python 3.8 이상 호환)
  • Kamikaze 적 AI 로직: pygame.mask 기반 픽셀 정확한 충돌 감지로 높은 난이도 구현
  • 사운드 시스템: pygame.mixerSOUND_ENABLED, MUSIC_ENABLED 플래그로 다이나믹 음향 제어

섹션별 세부 요약

1. 게임 기초 구조 설계

  • Tech With Tim 튜토리얼 기반으로 Player, Enemy, KamikazeEnemy 클래스 설계
  • assets/ 폴더에서 스프라이트, bgm/ 폴더에서 배경음악 자동 로딩
  • pygame 사용 시 주기적인 저장 파일 관리 (예: HIGH_SCORE_FILE 설정)

2. 적 AI 로직 확장

  • move() 메서드에서 math.hypot()적 간 최소 거리 체크 (중첩 방지)
  • Kamikaze 적:

```python

def move(self, vel, player):

if self.is_diving:

dx = self.target_x - (self.x + self.get_width()//2)

dy = self.target_y - (self.y + self.get_height()//2)

distance = (dx2 + dy2)**0.5

self.x += (dx / distance) * self.dive_speed

```

  • 적색 플래시 경고로 사용자에게 시각적 피드백 제공

3. 충돌 시스템 구현

  • pygame.mask.overlap()을 사용한 픽셀 단위 충돌 감지

```python

offset_x = obj2.x - obj1.x

offset_y = obj2.y - obj1.y

collision = obj1.mask.overlap(obj2.mask, (offset_x, offset_y)) != None

```

  • 플레이어 레이저와 적 레이저 간 충돌 시 상호 파괴

```python

for enemy_laser in enemy.lasers[:]:

for player_laser in player.lasers[:]:

if enemy_laser.collision(player_laser):

enemy.lasers.remove(enemy_laser)

player.lasers.remove(player_laser)

```

4. UI/UX 확장

  • 메뉴 시스템 구현: pause_menu() 함수로 RESUME, NEW GAME, QUIT 옵션 제공
  • 사운드 제어: play_sfx()play_music()으로 SFX/MUSIC 레벨 별도 관리

```python

def play_music(music_file, loops=-1, volume=0.7):

if MUSIC_ENABLED:

pygame.mixer.music.load(music_file)

pygame.mixer.music.set_volume(volume)

pygame.mixer.music.play(loops)

```

5. 게임 오버 처리

  • R 키로 재시작, M 키로 메인 메뉴로 이동, Q로 종료
  • 최고 점수 저장: save_high_score()HIGH_SCORE_FILE에 저장

결론

  • Pygame 프로젝트 패키징: pyinstaller --onefilemain.exe 생성 및 assets/, bgm/ 폴더 포함
  • GitHub 파일 크기 제한 대응: .wav.mp3 변환으로 8배 파일 크기 감소
  • 핵심 학습점:

- pygame.mask정확한 충돌 감지 구현

- 사운드 시스템 설계 시 볼륨/재생 상태 별도 관리

- 자체적인 AI 로직 추가로 게임의 차별화 가능

- __init__ 메서드에서 자원 초기화__del__에서 메모리 해제 필수