복사 콘솔에서 게임 엔진 기초 구축 및 하드웨어 문제 해결
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
앱 개발
대상자
- 취미 개발자 및 하드웨어 애호가: 복사 콘솔 제작, 임베디드 시스템, 레트로 게임 엔진 개발에 관심 있는 사람들
- 난이도: 중급 (하드웨어 이해, Python 미디어 프로그래밍, 게임 엔진 설계 기초 필요)
핵심 요약
- 게임 엔진 핵심 구조:
PicoEngine
클래스를 기반으로 고정 시간 간격 게임 루프, 입력 처리 시스템, 스프라이트 애니메이션 시스템 구현 - 하드웨어 제약 대응: SH1106 OLED의 I2C 주소 불일치(0x3C/0x3D), USB 전원으로 인한 전압 저하 문제 해결
- 메모리 최적화: 16x16 스프라이트는 32바이트(16x16 / 8) 소모, 1KB VRAM 제한으로 32개 스프라이트 지원 (UI/폰트를 위해 절반만 사용)
섹션별 세부 요약
1. OLED 연결 및 하드웨어 문제 해결
- I2C 주소 문제: SH1106의 주소는 0x3C 또는 0x3D에 따라 솔더 브릿지 조정 필요
- 전원 문제: USB로 Pico와 OLED 동시 구동 시 전압 저하로 인한 간헐적 리셋 발생
- 솔루션: 전원 분리 또는 외부 전원 사용
2. 입력 처리 시스템 설계
- 버튼 설정:
```python
buttons = {
'A': Pin(17, Pin.IN, Pin.PULL_DOWN),
...
}
```
- 설계 원칙:
- 내부 풀다운 저항 사용으로 외부 회로 간소화
- ADC 기능 핀(GP26-28)은 향후 오디오 확장 위해 회피
- 전력 소비: 버튼 누를 때 약 0.3mA 소비
3. 게임 엔진 아키텍처
- 클래스 구조:
```python
class PicoEngine:
def loop(self):
while True:
# 입력 처리 및 게임 로직 실행
```
- 핵심 기능:
- 고정 시간 간격 (target_fps = 30)으로 게임 로직 일관성 유지
- 프레임 예산 추적 (프레임 드롭 기록)
- 엔진과 게임 분리:
/games/pong.py
파일 기반 카트리지 시스템
4. 스프라이트 애니메이션 시스템
- 스프라이트 클래스:
```python
class Sprite:
def move(self, dx, dy):
self.x += dx
self.y += dy
```
- 애니메이션 처리:
```python
class Animated_Sprite(Sprite):
def update(self):
# 애니메이션 프레임 전환 로직
```
- 메모리 계산: 16x16 스프라이트는 32바이트 소모, 전체 VRAM 1KB로 최대 32개 스프라이트 지원
5. 향후 로드맵
- 게임 객체 생성: 게임 로직 확장
- 오디오 엔진: PWM 기반 사운드 효과 구현
- 카트리지 시스템: SD 카드 기반 게임 로딩
결론
- 핵심 팁:
- 하드웨어 제약 대응 시 전원 분리, I2C 주소 확인 필수
- 게임 엔진 설계 시 스프라이트/애니메이션 시스템 분리, 카트리지 기반 확장성 고려
- MIT 라이선스로 공개된 코드는 GitHub 및 Twitter에서 실시간 진행 상황 확인 가능