게임 개발을 통한 Python 프로그래밍 경험 공유
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
앱 개발
대상자
- 초보~중급 Python 개발자: Pygame 기반 게임 개발 기초와 확장성 학습
- 게임 개발 흥미자: 객체 지향 프로그래밍 적용 사례 분석
- 튜토리얼 활용자: 기초 코드를 기반으로 독자적인 기능 추가 방법
핵심 요약
- pygame을 사용한 스페이스 쇼터 게임 개발 과정 공유 (Python 3.8 이상 호환)
- Kamikaze 적 AI 로직:
pygame.mask
기반 픽셀 정확한 충돌 감지로 높은 난이도 구현 - 사운드 시스템:
pygame.mixer
와SOUND_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 --onefile
로main.exe
생성 및assets/
,bgm/
폴더 포함 - GitHub 파일 크기 제한 대응:
.wav
→.mp3
변환으로 8배 파일 크기 감소 - 핵심 학습점:
- pygame.mask
로 정확한 충돌 감지 구현
- 사운드 시스템 설계 시 볼륨/재생 상태 별도 관리
- 자체적인 AI 로직 추가로 게임의 차별화 가능
- __init__
메서드에서 자원 초기화 및 __del__
에서 메모리 해제 필수