어제부터 집중해서 진행하고 있는 개인프로젝트 - 파이게임을 이용한 간단한 게임 개발을 진행하고 있다.
오늘의 틸은 하루종일 주석을 달았던 코드들을 뒤돌아볼려고 한다.
import pygame
import random
# pygame 모듈 초기화
pygame.init()
# 화면 크기 세팅
screen_width = 600
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
# bg = pygame.image.load("bg1.png")
# 제목 설정
pygame.display.set_caption("별을 피해라!")
# FPS 세팅
clock = pygame.time.Clock()
# 게임 폰트 정의
game_font = pygame.font.Font(None, 50) # 폰트 객체 생성(폰트, 크기)
# 총 시간
total_time = 20
# 시작 시간 정보
start_ticks = pygame.time.get_ticks() # 시작 tick을 받아옴
# 색상 세팅
BLUE = (0, 0, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
# 초기 점수 및 레벨
total_score = 0
level_control = 5 # 레벨을 나누는 변수로 사용할 예정
total_level = 0
total_level_list = [10, 30, 50, 70, 90, 100, 120, 150, 180, 200, 250, 300, 350, 400, 10000000]
# 플레이어(스프라이트) 불러오기
player = pygame.image.load("spaceship.png")
player_size = player.get_rect().size
player_width = player_size[0]
player_height = player_size[1]
# 플레이어(우주선) 초기 위치: 화면 정중앙으로 세팅
player_x_pos = (screen_width / 2) - (player_width / 2)
player_y_pos = (screen_height / 2) - (player_height / 2)
# 플레이어(우주선) 이동속도 세팅
player_speed = 0.3
# 플레이어(우주선) 이동할 좌표
player_to_x = 0
player_to_y = 0
# 적을 넣을 리스트
enemy_list = list()
# 적을 클래스를 사용하여 정의
class EnemyClass:
enemy_image = pygame.image.load("star.png")
enemy_size = enemy_image.get_rect().size
enemy_width = enemy_size[0]
enemy_height = enemy_size[1]
enemy_spawnPoint = None
enemy_speed = 0
enemy_x_pos = 0
enemy_y_pos = 0
enemy_rad = 0
# 충돌 처리(적)
enemy_rect = enemy_image.get_rect()
enemy_rect.left = enemy_x_pos
enemy_rect.top = enemy_y_pos
# 적 클래스의 속도, 스폰위치를 정의
def __init__(self):
self.enemy_speed = random.choice([1.0, 1.5, 2.0, 2.5, 3.0])
self.enemy_spawnPoint = random.choice(['UP', 'DOWN', 'LEFT', 'RIGHT'])
# 적 이동속도 및 영역 지정
def enemy_move(self):
self.enemy_x_pos += self.enemy_speed * self.enemy_rad[0]
# 이벤트 루프
running = True # 게임이 진행중인가?
while running:
dt = clock.tick(60) # 게임 화면의 초당 프레임 수를 설정
for event in pygame.event.get(): # 게임이 진행되는 동안 이벤트가 발생한다면
if event.type == pygame.QUIT: # 이벤트가 창의 엑스표시를 누른경우
running = False # 게임이 진행중이 아님
if event.type == pygame.KEYDOWN: # 키가 눌렸는지 확인
if event.key == pygame.K_LEFT: # 플레이어 왼쪽으로
player_to_x -= player_speed # player_to_x = player_to_x - player_speed 와 같음
if event.key == pygame.K_RIGHT: # 플레이어 오른쪽으로
player_to_x += player_speed # x값이 플러스되면서 오른쪽으로 스피드만큼 이동
if event.key == pygame.K_UP: # 플레이어 위쪽으로
player_to_y -= player_speed # y값이 마이너스되면서 위쪽으로 스피드만큼 이동
if event.key == pygame.K_DOWN: # 플레이어 아래쪽으로
player_to_y += player_speed
if event.type == pygame.KEYUP: # 키를 떼면
if event.key in [pygame.K_LEFT, pygame.K_RIGHT]:
player_to_x = 0 # 좌우방향키 떼면 x좌표를 0으로
if event.key in [pygame.K_UP, pygame.K_DOWN]:
player_to_y = 0 # 위아래방향키 떼면 y좌표를 0으로
player_x_pos += player_to_x * dt # 플레이어 x좌표를 키보드 누른 값의 델타값만큼 보정하여 저장
player_y_pos += player_to_y * dt # 플레이어 y좌표를 키보드 누른 값의 델타값만큼 보정하여 저장
# 플레이어 경계값 설정
if player_x_pos < 0: # 가로 경계값 : 플레이어 x좌표가 0보다 작으면 0으로 설정
player_x_pos = 0
elif player_x_pos > screen_width - player_width: # 플레이어 x좌표가 가로길이보다 크면
player_x_pos = screen_width - player_width # 가로길이-캐릭터가로 위치에 설정
if player_y_pos < 0: # 세로 경계값 설정
player_y_pos = 0
elif player_y_pos > screen_height - player_height:
player_y_pos = screen_height - player_height
# 적 생성
if total_score >= total_level_list[total_level]: # 레벨리스트의 레벨보다 이상인 경우 레벨 1 올림
total_level += 1
if total_level + level_control >= len(enemy_list): # 레벨과 컨트롤의 합이 적의 수보다 이상인 경우
enemy_list.append(EnemyClass()) # 적을 1개 더 추가
# 충돌 처리(플레이어)
player_rect = player.get_rect()
player_rect.left = player_x_pos
player_rect.top = player_y_pos
# 충돌 체크(버티기 실패)
for i in enemy_list:
i.enemy_coll()
if player_rect.colliderect(i.enemy_rect): # 충돌했을시
game_result = f"Game Over : {total_score} Point" # 게임오버 표시
running = False # 루프종료
# 화면 그리기
# screen.blit(bg, (0, 0))
screen.fill(WHITE) # 배경에 흰색 채움처리
screen.blit(player, (player_x_pos, player_y_pos)) # 플레이어 그리기
for i in enemy_list:
i.enemy_move()
screen.blit(i.enemy_image, (i.enemy_x_pos, i.enemy_y_pos))
score = game_font.render("SCORE : {}".format(int(total_score)), True, GREEN)
screen.blit(score, (screen_width - 220, 10))
# 타이머 집어 넣기
# 경과 시간 계산
elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000 # 경과 시간(ms)을 1000으로 나누어서 초(s) 단위로 표시
timer = game_font.render("Time : {}".format(int(total_time - elapsed_time)), True, BLACK) # 랜더링할 글자, True, 색상
screen.blit(timer, (30, 10))
# 미션 성공 처리(버티기 성공)
if total_time - elapsed_time <= 0:
game_result = f"Mission Complete : {total_score} Point"
running = False
pygame.display.update() # 화면에 다시 그리기
# 게임 오버 메세지
msg = game_font.render(game_result, True, BLUE)
msg_rect = msg.get_rect(center=(int(screen_width / 2), (int(screen_height / 2))))
screen.blit(msg, msg_rect)
pygame.display.update()
# 종료 전 잠시 대기 3000ms = 3s
pygame.time.delay(3000)
# pygame 종료
pygame.quit()
남은 시간동안은 레벨을 나눠서 메인메뉴의 제작에 힘쓸 예정이다! 잠은 다 잤다..
'Python > Pygame' 카테고리의 다른 글
| Wil - 2week (0) | 2022.05.01 |
|---|---|
| Til - 10day (1) | 2022.04.27 |
| Til - 8day (0) | 2022.04.25 |