불가살(Bulgasal) 보스 배틀 게임 개발일지
불가살(Bulgasal) 보스 배틀 게임 개발일지
프로젝트 개요
- 프로젝트명: 불가살 (Bulgasal) - 2D 보스 배틀 게임
- 개발 엔진: Godot 4.x
- 개발 언어: GDScript
- 개발 기간: 2025년 7월 23일
- 개발자: hojun313
개발 진행 상황
Phase 1: 초기 프로젝트 설정 및 플레이어 기본 기능
목표: 플레이어 캐릭터의 기본적인 움직임과 애니메이션 구현
완성된 기능:
- ✅ 플레이어 이동 시스템 (좌우 방향키)
- ✅ 점프 시스템 (Enter키, 중력 적용)
- ✅ 스프라이트 애니메이션 (idle, walk_a, walk_b, jump)
- ✅ 캐릭터 방향 전환 (좌우 이동 시 sprite flip)
사용된 리소스:
character_purple_idle.pngcharacter_purple_walk_a.png/character_purple_walk_b.pngcharacter_purple_jump.png
핵심 코드 구조:
extends CharacterBody2D
const SPEED = 300.0
const JUMP_VELOCITY = -400.0
Phase 2: 공격 시스템 구현
목표: 플레이어가 총알을 발사하여 적을 공격할 수 있는 시스템 구현
완성된 기능:
- ✅ 총알 발사 시스템 (Z키)
- ✅ 총알 물리 엔진 (Area2D 기반, 직선 이동)
- ✅ 총알 자동 삭제 (3초 후 자동 제거)
- ✅ 방향성 공격 (플레이어가 바라보는 방향으로 발사)
구현 세부사항:
- 총알 스크립트:
Bullet.gd - 총알 씬:
Bullet.tscn(노란색 ColorRect) - 발사 위치: 플레이어 앞쪽 30픽셀
- 총알 속도: 500px/s
Phase 3: 보스 시스템 기초 구현
목표: 슬라임 킹 보스의 기본적인 AI와 행동 패턴 구현
완성된 기능:
- ✅ SlimeKing 보스 (점프 공격 패턴)
- ✅ 보스 AI: 3초마다 플레이어 방향으로 점프 공격
- ✅ 벽 충돌 처리 (벽에 부딪히면 방향 전환)
- ✅ 랜덤 점프 높이 (MIN/MAX 수직 속도)
보스 스펙:
- 체력: 100 HP
- 점프 주기: 3초
- 수평 속도: 400px/s
- 수직 속도: -1100 ~ -500px/s (랜덤)
Phase 4: 데미지 시스템 구현
목표: 플레이어와 보스 간의 상호 데미지 시스템 구축
❌ 중대한 문제 발생
초기 구현에서 다음 문제들이 발생:
- 총알이 플레이어 자신을 공격하는 문제
- Area2D와 CharacterBody2D 간의 충돌 감지 실패
- 복잡한 충돌 로직으로 인한 버그 다발
🔄 시스템 재설계 결정
문제 해결을 위해 전체 시스템을 재구축하기로 결정
Phase 5: 상속 구조 기반 보스 시스템 재구축
목표: 확장 가능한 보스 시스템과 안정적인 데미지 처리 구현
완성된 기능:
- ✅ BaseBoss 클래스 생성 (상속 기반 보스 시스템)
- ✅ 보스 공통 기능:
- 체력 관리 시스템
- 데미지 받기 (
take_damage()) - 죽음 처리 (
die()) - 플레이어 감지 및 거리 계산
- 보스 상태 관리 (
BossStateenum)
상속 구조:
BaseBoss (부모 클래스)
├── 공통 기능: 체력, 데미지, 중력, 플레이어 감지
└── SlimeKing (자식 클래스)
└── 고유 기능: 점프 공격 패턴
Phase 6: 충돌 시스템 재설계
목표: 안정적인 총알-보스 충돌 처리 시스템 구축
해결된 문제:
- ✅ 자기 공격 방지: 총알이 플레이어를 공격하지 않도록 처리
- ✅ 히트박스 시스템: BaseBoss에 자동 히트박스(Area2D) 생성
- ✅ Area2D 간 충돌: 총알(Area2D) ↔ 보스 히트박스(Area2D)
구현 방식:
# 총알이 보스 히트박스와 충돌
func _on_area_entered(area):
if area.is_in_group("boss_hitbox"):
var boss = area.get_parent()
boss.take_damage(damage)
Phase 7: 체력 시스템 완성
목표: 플레이어와 보스의 완전한 체력 관리 시스템
완성된 기능:
- ✅ 플레이어 체력 시스템 (100 HP)
- ✅ 데미지 처리:
take_damage()함수 - ✅ 죽음 처리: 체력 0 시 게임 오버 로직
- ✅ 그룹 관리: “player”, “boss”, “boss_hitbox” 그룹
밸런스:
- 플레이어: 100 HP
- 보스: 100 HP
- 총알 데미지: 10 HP (10발로 보스 처치)
Phase 8: UI 시스템 구현 (다수의 시행착오)
목표: 플레이어와 보스의 체력을 시각적으로 표시
❌ UI 표시 문제들
여러 차례 UI가 표시되지 않는 문제 발생:
- UIManager.tscn - Control 기반 UI (실패)
- CanvasLayer 기반 UI (실패)
- SimpleUI.tscn - 간단한 테스트 UI (실패)
✅ 최종 해결책: 플레이어 직접 UI 생성
문제 해결을 위해 Player.gd에서 직접 UI를 생성하는 방식 채택
완성된 UI 기능:
- ✅ 실시간 체력바: ProgressBar 위젯 사용
- ✅ 플레이어 체력바: 좌상단, 녹색 바
- ✅ 보스 체력바: 플레이어 아래, 빨간색 바
- ✅ 체력 수치 표시: “100/100” 형태의 텍스트
- ✅ 동적 표시: 보스가 있을 때만 보스 체력바 표시
UI 구성:
- 배경: 검은 반투명 패널 (400x120)
- 위치: 좌상단 (30, 30)
- 플레이어 바: 300x20, 흰색 라벨
- 보스 바: 300x20, 빨간색 라벨
최종 완성된 시스템
🎮 플레이어 시스템
- 이동: 방향키 (300px/s)
- 점프: Enter키 (-400px/s)
- 공격: Z키 (총알 발사)
- 체력: 100 HP
- 애니메이션: 4가지 상태 (idle, walk, jump)
🏹 공격 시스템
- 총알: Area2D 기반, 노란색 사각형
- 속도: 500px/s
- 데미지: 10 HP
- 수명: 3초 후 자동 삭제
- 방향: 플레이어가 바라보는 방향
👹 보스 시스템
- BaseBoss: 확장 가능한 상속 기반 시스템
- SlimeKing: 점프 공격 패턴 보스
- 체력: 100 HP (10발로 처치)
- AI: 3초마다 플레이어 방향 점프 공격
- 히트박스: 자동 생성되는 Area2D
📊 UI 시스템
- 실시간 체력바: 플레이어/보스 체력 시각화
- 체력 수치: 정확한 HP 표시
- 동적 표시: 상황에 따른 UI 변화
기술적 성과
✅ 성공한 구현
- 객체지향 설계: BaseBoss 상속 구조로 확장성 확보
- 안정적인 충돌 시스템: Area2D 기반 히트박스
- 실용적인 UI: 직접 생성 방식으로 호환성 문제 해결
- 완전한 게임 루프: 플레이어 → 공격 → 보스 → 체력 → UI
🔧 해결한 주요 문제들
- 자기 공격 문제: 그룹 기반 충돌 필터링
- UI 표시 실패: 여러 시도 끝에 직접 생성 방식 채택
- 충돌 감지 실패: CharacterBody2D → Area2D 히트박스로 해결
- 시스템 복잡성: 상속 구조로 코드 정리
향후 확장 가능성
🚀 준비된 확장 기능
- 새로운 보스: BaseBoss 상속으로 쉬운 추가
- 다양한 공격 패턴: 가상 함수 오버라이드
- 추가 UI 요소: 기존 UI 시스템에 통합
- 플레이어 능력: 기존 시스템과 호환
📝 권장 개선사항
- 사운드 시스템 추가
- 파티클 이펙트 (공격, 피격)
- 스테이지 시스템
- 플레이어 능력 업그레이드
- 추가 보스 캐릭터
결론
초기 구현에서 여러 기술적 문제가 발생했으나, 시스템을 재설계하고 단계적으로 접근함으로써 안정적인 2D 보스 배틀 게임을 완성했습니다. 특히 상속 기반 보스 시스템과 실용적인 UI 해결책을 통해 확장 가능하고 유지보수가 용이한 코드베이스를 구축했습니다.
핵심 성과: 완전히 작동하는 보스 배틀 게임 시스템 + 향후 확장을 위한 견고한 아키텍처
개발일지 작성일: 2025년 7월 23일
Repository: bulgasal