Pygame 프로젝트 개발기 - GAMEOVER
처음 해보는 github 협업 프로젝트.. 잘 해낼 수 있을까??
들어가기 전….
Github에 있는 프로젝트 레포지토리를 링크로 달고싶은데 교수님께서 비공개?로 해두셨다,, 내 프로젝트 다른 사람들한테 보여주고싶은데~ 진짜 잘 했는데~
🛠 구현 기능
초반 회의 때 어떤 기능들을 추가할 지 이야기를 나눴다.
시작 화면임당
플레이 화면임당
종료 화면임당
그렇다.. 그림판으로 대충 틀을 잡아본 그림이다… 참고로 초기에는 쓰레기를 피하는 게임이었던 것
먼저 화면 구성은 이렇게 하기로 했다. 그렇다면 원본 게임에서 어떤 것들을 추가해야 저렇게 보일 수 있을까?
🧠 생각한 대로 이루어지리..
- 시작 화면, 플레이 화면, 종료 화면 총 3가지로 상황에 맞는 화면 나누기
- 시작 화면에 START 버튼, 로고 만들기
- 플레이 화면에 시간 나오게 하기
- 생명 시스템 구현하고 표시하기
- 종료 화면에 재시작, 게임 종료, 종료되었을 때의 시간이 나오게 하기
- 게임오버가 되면 위에서 떨어지던 오브젝트들과 캐릭터 사라지게 하기
위 사진들만 보면 대충 이정도가 떠올랐다.
여기서 세세하게 기능들을 나누고 팀원들과 하나씩 나눠서 개발을 하기로 했다.
나의 첫 임무는 종료 화면 만들기..!
종료 화면 만들기
처음 생각해낸 방법은 아직 생명 시스템이 구현이 되어있지 않기때문에 그저 폭탄과 캐릭터가 충돌하면 종료화면으로 넘어가게 하면 된다.
알고리즘은 아래와 같다.
- 폭탄과 캐릭터가 충돌한다.
- 만들어둔 game_over 변수를 True로 변경한다.
- if game_over: 조건문을 만들어서 game_over가 True가 되면 작동하게 만든다.
- 조건문의 내용으로는
Game Over를 표시하고 게임 화면을 업데이트해서 오브젝트들을 다 없앤다.
추가로 게임 오버가 됐을 때는 폭탄이 더이상 생성되지 못하게 폭탄 생성 코드에 not game_over 조건도 추가해줬다.
변경된 코드는 아래와 같다.
import pygame # 1. pygame 선언
import random
import os
pygame.init() # 2. pygame 초기화
# 3. pygame에 사용되는 전역변수 선언
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
size = [600, 800]
screen = pygame.display.set_mode(size)
done = False
clock = pygame.time.Clock()
game_over = False # 게임 오버 상태를 나타내는 변수
def runGame():
bomb_image = pygame.image.load('bomb.png')
bomb_image = pygame.transform.scale(bomb_image, (50, 50))
bombs = []
for i in range(5):
rect = pygame.Rect(bomb_image.get_rect())
rect.left = random.randint(0, size[0])
rect.top = -100
dy = random.randint(3, 9)
bombs.append({'rect': rect, 'dy': dy})
person_image = pygame.image.load('person.png')
person_image = pygame.transform.scale(person_image, (100, 100))
person = pygame.Rect(person_image.get_rect())
person.left = size[0] // 2 - person.width // 2
person.top = size[1] - person.height
person_dx = 0
global done, game_over
font = pygame.font.SysFont(None, 75) # 게임오버 텍스트를 위한 폰트 설정
while not done:
clock.tick(30)
screen.fill(BLACK)
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
break
elif event.type == pygame.KEYDOWN and not game_over:
if event.key == pygame.K_LEFT:
person_dx = -5
elif event.key == pygame.K_RIGHT:
person_dx = 5
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
person_dx = 0
elif event.key == pygame.K_RIGHT:
person_dx = 0
if not game_over:
for bomb in bombs:
bomb['rect'].top += bomb['dy']
if bomb['rect'].top > size[1]:
bombs.remove(bomb)
rect = pygame.Rect(bomb_image.get_rect())
rect.left = random.randint(0, size[0])
rect.top = -100
dy = random.randint(3, 9)
bombs.append({'rect': rect, 'dy': dy})
person.left = person.left + person_dx
if person.left < 0:
person.left = 0
elif person.left > size[0] - person.width:
person.left = size[0] - person.width
screen.blit(person_image, person)
for bomb in bombs:
if bomb['rect'].colliderect(person):
game_over = True
screen.blit(bomb_image, bomb['rect'])
if game_over:
game_over_text = font.render("Game Over", True, WHITE)
screen.blit(game_over_text, (size[0] // 2 - game_over_text.get_width() // 2, size[1] // 2 - game_over_text.get_height() // 2))
pygame.display.update()
pygame.display.update()
runGame()
pygame.quit()
게임 오버 화면임당
그렇다.. 정말 딱 기초적인 부분만 구현을 한 것이다.
제일 큰 문제점은 이 화면에서 x를 클릭해서 게임을 끄는 것 말고는 할 수 있는 게 없다는 것..!!
당연히 점점 개발을 하면서 고쳐나갈 부분이다.
그래도 내가 뭔가를 해서 올렸다는 게 뿌듯하고 신기했다ㅎㅎ
다음 글은 라이선스에 대해 작성할 예정이다. 왜냐하면 그 다음 나의 임무가 라이선스 생성이기 때문!