슈팅게임을 만들 때 처음에는 총알이 잘 나가지만, 적 수가 늘어나는 순간 프레임 저하와 충돌 누락이 한꺼번에 터지는 경우가 많습니다. 특히 연사 로직이 입력 이벤트에 붙어 있으면 컴퓨터 성능이나 FPS에 따라 총알 밀도가 달라져 밸런스가 무너집니다.
이번 글은 파이썬 슈팅게임 총알 발사 구현을 안정적으로 만드는 기준을 정리한 리라이팅 버전입니다. 핵심은 “총알 생성”, “총알 수명 관리”, “충돌 처리”를 분리하는 것입니다. 구조만 분리해도 성능과 재현성이 눈에 띄게 개선됩니다.
![[파이썬] 슈팅게임 총알 발사 구현: 연사·쿨타임·충돌까지 한 번에 정리 2 파이썬 슈팅게임 총알 발사 구현 본문 이미지 1](https://www.shindeacon.co.kr/wp-content/uploads/2026/04/b1-3.png)
Table of Contents
슈팅게임 총알 발사는 연사 주기와 오브젝트 정리를 분리해야 안정됩니다
연사는 키 입력이 아니라 시간 간격으로 제어
키를 누른 프레임마다 즉시 총알을 만들면 프레임에 종속됩니다. 가장 안전한 방식은 마지막 발사 시각과 현재 시각 차이를 비교하는 쿨타임 방식입니다.
fire_interval_ms = 110
last_fire_ms = 0
now = pygame.time.get_ticks()
if is_fire_pressed and now - last_fire_ms >= fire_interval_ms:
bullets.append([player_x, player_y, 0, -14])
last_fire_ms = now
이 구조는 FPS가 달라져도 초당 발사 수가 일정하게 유지됩니다.
무기별 발사 주기 테이블
샷건/레이저/기본탄을 같은 코드로 운영하려면 무기마다 interval만 다르게 두는 테이블 구조가 관리에 유리합니다.
총알 리스트는 역순 순회로 삭제
정방향 순회 중 삭제하면 인덱스가 밀리면서 일부 총알 업데이트가 건너뛰어집니다. 역순 순회는 충돌/삭제가 동시에 일어나도 안전합니다.
for i in range(len(bullets)-1, -1, -1):
bullets[i][1] += bullets[i][3]
if bullets[i][1] < -20:
bullets.pop(i)
총알, 적, 이펙트 모두 같은 규칙을 적용하면 오브젝트 누수가 줄어듭니다.
충돌 처리는 단순 AABB부터 완성
처음부터 픽셀 충돌을 쓰면 성능과 디버깅 부담이 큽니다. 기본은 사각형 충돌(AABB)로 고정하고, 이후 필요 구간만 정밀 충돌로 교체하는 전략이 안전합니다.
def aabb(ax, ay, aw, ah, bx, by, bw, bh):
return ax < bx + bw and ax + aw > bx and ay < by + bh and ay + ah > by
관통 현상 줄이는 방법
총알 속도가 높으면 한 프레임에 적을 건너뛸 수 있습니다. 이 경우 선분 교차 또는 소규모 서브스텝 업데이트를 적용하세요.
![[파이썬] 슈팅게임 총알 발사 구현: 연사·쿨타임·충돌까지 한 번에 정리 3 파이썬 슈팅게임 총알 발사 구현 본문 이미지 2](https://www.shindeacon.co.kr/wp-content/uploads/2026/04/b2-3.png)
성능이 떨어질 때 먼저 보는 항목
1) 화면 밖 오브젝트 누적
삭제 조건이 빠져 있으면 시간이 지날수록 프레임이 떨어집니다.
2) 이중 충돌 처리
같은 총알이 여러 적에 중복 판정되는지 확인하고, 첫 충돌 후 즉시 제거하거나 플래그를 둡니다.
3) 렌더 순서 문제
업데이트와 렌더를 분리하지 않으면 디버깅이 어려워집니다. 루프 구조를 고정하세요.
실무형 루프 구조 예시
# 1) 입력
# 2) 발사 쿨타임 체크 -> 생성
# 3) 총알/적 업데이트
# 4) 충돌 처리
# 5) 화면 그리기
# 6) 화면 밖 오브젝트 정리
이 순서를 고정하면 기능이 늘어나도 버그 위치를 빠르게 특정할 수 있습니다.
정리
파이썬 슈팅게임 총알 발사 구현은 연사 주기 고정, 역순 삭제, 충돌 단순화라는 세 가지 원칙을 지키면 안정적으로 완성됩니다. 먼저 구조를 단단히 만든 뒤 연출을 더하면 수정 비용이 크게 줄어듭니다.