본문 바로가기

Python/Python 초등 교육

12. 장애물 넘기 게임 - 5부

반응형

앞에서 공룡과 장애물을 이동하거나 점프 할 수 있게 만들어 보았습니다. 이제 장애물과 공룡이 부딪쳤을때 게임이 종료되록해보고 

스코어 넣어서 장애물을 잘 피했을때 스코어가 올라가도록 해보아요.

 

먼저 공룡과  장애물이 부딪혔을때 게임이 종료 되게 하려면 어떻게 방식으로 부딪혔다를 알 수 있게 되는지 알아야 합니다.

위에 이미지를 보면 사각형의 모야이 보이고 있죠? 검정색 사각형과 분홍색 사각형은 각각 공룡과 장애물을 나타내고 있고 실제로 게임상에서 공룡과 장애물이 차지하는 공간을 사각형으로 표시를 한것입니다. 

 

pygame에서 충돌은 저 공룡과 사각형이 차지하고 있는 공간과 공간끼리의 부딪혔는지를 체크를 하게 되는데요. 

이때 두 공간이 겹쳤는지 체크하는 방법은 아래와 같습니다. 

if dino_character.colliderect(tree_character):
    print("충돌")

사각형끼리의 겹쳤는지 체크외에도 여러가지 기능들이 있으니 궁금하신분들은 찾아보길 바래요. 

 

이제 충돌코드를 어디에 어떻게 넣어야 하는지 볼까요? 아래 코드가 충돌 코드를 넣어서 완성된 코드 입니다. 

충돌시 "충돌" 이라는 문자를 콘솔 화면에서 print하게 되어 있어요. 요 부분에 여러분이 원하는 코드를 만들어 넣으면 됩니다.

 

여러가지를 할 수 있을거 같아요. 라이프의 개념이 있다면 라이프가 하나씩 줄어 든다던지 , 거리의 개념이 있다면 거리가 초기화 되어서 처음 부터 다시 도전을 하다던지 하는 기능을 넣을수 있을것 같아요.

 

 

import sys
import pygame
from datetime import datetime
import time

pygame.init()
pygame.display.set_caption("데브라쿤 파이썬게임 연습1")
MAX_WIDTH = 800
MAX_HEIGHT = 400
# 게임에서 필요한 색상표
RED = (255, 0, 0)
ORANGE = (255, 153, 51)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
SEAGREEN = (60, 179, 113)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
VIOLET = (204, 153, 255)
PINK = (255, 153, 153)

# 폰트 설정
font = pygame.font.SysFont('Tahoma', 60)  # 기본 폰트 및 사이즈 설정(폰트1)
small_font = pygame.font.SysFont('Malgun Gothic', 20)  # 작은 사이즈 폰트(폰트2)
game_over = font.render("Game Over", True, BLACK)  # 게임 종료시 문구

def main():
    # 게임 화면의 사이즈 설정
    screen = pygame.display.set_mode((MAX_WIDTH, MAX_HEIGHT))

    # #공룡 이미지 로드
    image_dino1 = pygame.image.load("images/dino1.png")
    image_dino2 = pygame.image.load("images/dino2.png")

    dino_height = image_dino1.get_size()[1]
    # 공룡이 바닥에 붙어 있는 모양을 만들고 싶음
    dino_bottom = MAX_HEIGHT - dino_height
    leg_swap = True
    is_jumping = False
    max_jumping_height = dino_bottom - 120

    # 공룡 좌표
    dino_x = 50
    dino_y = dino_bottom

    image_tree = pygame.image.load("images/tree.png")
    # 화면의 제일 우측에 장애물을 위치하게 해준다.
    tree_height = image_tree.get_size()[1]
    tree_x = MAX_WIDTH - 30
    tree_y = MAX_HEIGHT - tree_height

    tree_move_by_tick = 5
    # 게임 화면의 프레임 설정 ( 1초의 몇번을 깜빡일것인가)
    fps = pygame.time.Clock()
    check_time = 0

    dino_character = image_dino1.get_rect()
    tree_character = image_tree.get_rect()
    while True:
        tick = fps.tick(30)
        check_time = check_time + 1
        print("time : ", datetime.now(), "초당 frame 수 :", check_time)
        screen.fill((255, 255, 255))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            elif event.type == pygame.KEYUP:
                if not is_jumping:
                    is_jumping = True
        # 공룡이미지를 화면에 나오게 하는 부분 , dino_x , dino_y 좌표에 나오게됨
        if leg_swap:
            screen.blit(image_dino1, (dino_x, dino_y))
            leg_swap = False
        else:
            screen.blit(image_dino2, (dino_x, dino_y))
            leg_swap = True

        if is_jumping:
            dino_y = dino_y - 10
            if dino_y <= max_jumping_height:
                is_jumping = False
        else:
            dino_y = dino_y + 10
            if dino_y >= dino_bottom:
                dino_y = dino_bottom

        # 장애물의 x 위치값을 화면이 한번 깜빡일때 마다 tree_move_by_tick만큼 왼쪽으로 이동
        # 왼쪽으로 이동은 x값이 작아지게 만들어야 하니까 원래 장애물의 위치에서 계속 minus를 해준다.
        tree_x = tree_x - tree_move_by_tick
        # 장애물나무의 위치를 설정해서 화면에 나오게 함.
        screen.blit(image_tree, (tree_x, tree_y))
        #장애물이 왼쪽 화면 끝까지 가면 다시 처음으로 가서 이동되게 한다.
        if tree_x < 0:
            tree_x = MAX_WIDTH - 5
            
        # 공룡과 장애물의 충돌 감지를 위해 위치 정보를 업데이트해줘야 한다.
        dino_character.left = dino_x
        dino_character.top = dino_y
        tree_character.left = tree_x
        tree_character.top = tree_y
        if dino_character.colliderect(tree_character):
            print("충돌")

        pygame.display.update()


if __name__ == '__main__':
    main()

이제 게임을 실행해 보면 공룡과 장애물이 충돌시 충돌이라는 문자를 출력되는것이 보일거에요. 

그럼 이제 장애물과 충돌을 하게 되면 저는 Game Over라는 화면이 보이게 해 보겠습니다. 

 

충돌이 체크하는 부분에 아래 코드를 추가 합니다.

time.sleep(0.5)
screen.fill(SEAGREEN)
screen.blit(game_over, (280, 200))
time.sleep(1)

위 코드를 간단하게 설명을 하면 충돌을 하게 되면

  • 게임이 약 0.5초 정도 멈춤
  • 화면이 초록색으로 채워짐
  • 게임오버라는 글자를 화면의 x: 280 , y: 200 인 좌표에 표시 한다.
  • 게임을 약 1초 동안 정지

이렇게 넣은 완성 코드를 실행하게 되면 장애물과 충돌시 게임이 멈추고 초록 화면에 Game over가 표시 되게 됩니다. 

그리고 특별히 게임을 종료하거나 하지 않았기 때문에 다시 게임이 시작되게 될 거에요.

 

이부분은 완성되지 않았기에 여러분이 어떻게 완성하면 좋을지 생각해 보고 여러분만의 게임을 완성시켜 보도록해요.

 

최종 소스는 아래 링크에 있습니다.

https://github.com/devraccon/PracticeGame1