파이썬으로 할 만한것을 찾아보다가 게임을 만들어보자 싶었다.
파이썬으로 만들 수 있는 게임이 이것저것 있지만 어렸을적 많이 했던 겔로그 슈팅게임이 생각 났다.
해서 가벼운 마음으로 만들기 시작했는데 몇몇 어려움에 몇시간씩이나 골머리를 앓게 될 줄을 당시엔 알지 못했다.
내가 직면한 어려움을 간단히 정리하자면
1. 재장전까지 걸리는 시간의 시각화
2. 게임의 반복성
1번을 이야기 하자면 주인공이 총알을 발사하고 딜레이를 가지고 다시 발사할 수 있게 했는데 이 딜레이를 시각적으로 보여주고 싶었다.
처음엔 간단할 줄 알았던 문제였는데 며칠을 고민해야 했고 삽질을 해야했다. 단순히 1초의 딜레이라면 1초동안 줄어들거나 늘어나는 원 또는 직사각형을 만들면 될 줄 알았다. 그러나 정작 필요한건 발사한 시간과 잘게 나누어진 시간에 맞춰 줄어드는 도형이 필요했다.
결국 만들어낸 코드는 다음과 같고 요약하자면
재장전 시간은 이전 총알 발사 시간과 현재 시간의 차이로 계산해야 했고 그걸 잘게 나누어 주어야 서서히 줄어드는 도형을 만들 수 있었다.
reload_second = (f"{round(bullet_delay - (current_time - last_bullet_time), 2 )}")
reload_second = float(reload_second)
if reload_second > 0:
reload_second = reload_second
elif reload_second < 0:
reload_second = 0
elif reload_second < 0.50 or reload_second > 0.0:
reload_sound.play()
# print(reload_second)
# 사각형 그리기640, 480
# pygame.draw.rect(screen, (255, 0, 0), (text_x, text_y+50, reload_second*100, 8), 5)
pygame.draw.rect(screen, (255, 255, 255), (player_rect.x, player_rect.y, reload_second * 40, 3), 5)
- reload_second 변수: 재장전 시간을 나타내는 변수입니다. 재장전 시간은 이전 총알 발사 시간과 현재 시간의 차이로 계산됩니다.
- round(bullet_delay - (current_time - last_bullet_time), 2): 재장전 시간을 계산하는 식입니다. bullet_delay는 총알 발사 간격을 나타내는 변수이고, current_time은 현재 시간을 나타내는 변수입니다. last_bullet_time은 이전 총알 발사 시간을 나타내는 변수입니다. 재장전 시간은 총알 발사 간격에서 현재 시간과 이전 총알 발사 시간을 뺀 값으로 계산됩니다. round() 함수를 사용하여 소수점 둘째 자리까지 반올림합니다.
- float(reload_second): reload_second 변수를 부동소수점 숫자로 변환합니다.
- 재장전 시간에 따른 처리:
- if reload_second > 0:: 재장전 시간이 0보다 크면, reload_second 변수를 그대로 유지합니다.
- elif reload_second < 0:: 재장전 시간이 0보다 작으면, reload_second 변수를 0으로 설정합니다.
- elif reload_second < 0.50 or reload_second > 0.0:: 재장전 시간이 0.0 초보다 작거나 0.50 초보다 작으면, reload_sound를 재생합니다. 이는 재장전 시간이 어느 정도 남았을 때 효과음을 재생하도록 하는 것으로 보입니다.
- pygame.draw.rect(screen, (255, 255, 255), (player_rect.x, player_rect.y, reload_second * 40, 3), 5): 재장전 시간을 표시하는 사각형을 화면에 그립니다. 사각형의 위치는 player_rect 변수를 기준으로 하며, 너비는 reload_second * 40으로 설정됩니다. 높이는 3으로 고정되며, 선의 두께는 5로 설정됩니다. 이 코드를 통해 재장전 시간에 따라 사각형의 너비가 변화하여 시각적으로 재장전 시간이 표시됩니다.
이렇게 원하는 시간을 계산하고 그게 맞는 사각형을 만들어서 주인공 비행기와 함께 움직여서 사용자가 재장전 시간을 확인하기 좋게 만들었다.
2번 문제는 주인공이 적 전투기와 부딪혀 죽을때 마다 종료되어서 매번 실행을 해주어야하고 Best Time등도 확인 할 수 가 없었다.
그래서 시작할때와 재시작할 때의 화면과 구동하는 코드 등을 각각 함수로 구분해 만들어주어 조건에 맞게 함수들을 왔다갔다 하며 원하는 만큼 반복을 하고 종료 직전까지 정보를 저장 할 수 있게 되었다.
처음에는 간단할 줄 알았던 프로그램이었지만 역시나 쉽게 되는 것은 없다는 교훈을 다시한번 일깨워 주었다. 손이 닿지 않고는 저절로 되는 것은 없고 직접 해보기 전까지는 알 수 없었던 부분들을 많이 깨우칠 수 있었다.