본문 바로가기
Python/Pygame

Til - 9day

by K-밍키 2022. 4. 26.

어제부터 집중해서 진행하고 있는 개인프로젝트 - 파이게임을 이용한 간단한 게임 개발을 진행하고 있다.

오늘의 틸은 하루종일 주석을 달았던 코드들을 뒤돌아볼려고 한다.

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