기본기

jurin·2020년 9월 15일
0
post-thumbnail

##################################################################
나도 코딩 강의를 듣고 정리한 내용입니다.
출처 : 나도코딩 https://www.youtube.com/channel/UC7iAOLiALt2rtMVAWWl4pnw
##################################################################





pygame 설치

  • pygame 모듈을 사용하기 위해 터미널에서 설치해준다.

환경설정 & 프레임

import pygame

pygame.init()  # 초기화 (반드시 필요)

# 화면 크기 설정
screen_width = 480  # 가로
screen_height = 640  # 세로
screen = pygame.display.set_mode((screen_width, screen_height))

# 화면 타이틀 설정
pygame.display.set_caption("Nado Game")  # 게임 이름

# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    for event in pygame.event.get():  # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:  # 창이 닫히는 이벤트가 발생하였는가?
            running = False  # 게임이 진행중이 아님

# pygame 종료
pygame.quit()
  • 실행창

배경

  • 그림판에서 크기 조절 후 배경색 칠하여 pygame_basic 파일에 저장

  • pygame.image.load()에 background.png 파일을 copy path한 후 ""안에 적어줘서 이미지를 불러오고, 그 후 이벤트 루프 안에 screen.blit을 통해 배경을 그린다.
# 배경 이미지 불러오기
background = pygame.image.load(
    "D:/바탕화면/개인 공부/game/pygame_basic/background.png")

# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    for event in pygame.event.get():  # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:  # 창이 닫히는 이벤트가 발생하였는가?
            running = False  # 게임이 진행중이 아님

    screen.blit(background, (0, 0))  # 배경 그리기

    pygame.display.update()  # 게임화면을 다시 그리기!
  • 실행창

캐릭터

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("D:/바탕화면/개인 공부\
/game/pygame_basic/character.png")

# 이미지의 크기를 구해온다.
character_size = character.get_rect().size  
character_width = character_size[0]  # 캐릭터의 가로 크기
character_height = character_size[1]  # 캐릭터의 세로 

# 화면 가로의 가운데에 위치
character_x_pos = (screen_width/2) - (character_width/2)  
# 화면 세로의 가장 아래에 위치
character_y_pos = screen_height - character_height  


# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    for event in pygame.event.get():  # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:  # 창이 닫히는 이벤트가 발생하였는가?
            running = False  # 게임이 진행중이 아님

    screen.blit(background, (0, 0))  # 배경 그리기
    
# 캐릭터 그리기
    screen.blit(character, (character_x_pos, character_y_pos))  

    pygame.display.update()  # 게임화면을 다시 그리기!
  • 실행창

키보드 이벤트

# 이동할 좌표
to_x = 0
to_y = 0

# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    for event in pygame.event.get():  # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:  # 창이 닫히는 이벤트가 발생하였는가?
            running = False  # 게임이 진행중이 아님

        if event.type == pygame.KEYDOWN:  # 키가 눌러졌는지 확인
            if event.key == pygame.K_LEFT:  # 캐릭터를 왼쪽으로
                to_x -= 5
            elif event.key == pygame.K_RIGHT:  # 캐릭터를 오른쪽으로
                to_x += 5
            elif event.key == pygame.K_UP:  # 캐릭터를 위쪽으로
                to_y -= 5
            elif event.key == pygame.K_DOWN:  # 캐릭터를 아래쪽으로
                to_y += 5

        if event.type == pygame.KEYUP:  # 방향키를 떼면 멈충
            if event.key == pygame.K_LEFT or event.key== pygame.K_RIGHT:
                to_x = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                to_y = 0

    character_x_pos += to_x
    character_y_pos += to_y

    # 가로 경계값 처리
    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width

    # 세로 경계값 처리
    if character_y_pos < 0:
        character_y_pos = 0
    elif character_y_pos > screen_height - character_height:
        character_y_pos = screen_height - character_height

fps

# 이동 속도
character_speed = 0.6

# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    # 프레임 높을수록 빠르고 낮을수록 느리다.
    dt = clock.tick(60)  # 게임 화면의 초당 프레임 수를 설정
  • 캐릭터가 100만큼 이동을 해야함
  • 10 fps : 1초 동안 10번 동작 -> 1번에 10만큼 이동하니까 10번 동작
  • 20 fps : 2초 동안 20번 동작 -> 1번에 5만큼 이동하니까 20번 동작 -> 더 잘게 잘게 작은 동작을 여러번 움직이니까 더 부드러운 연출이 가능하다.

  • dt를 곱해 값을 고정해줘서 fps가 바뀌어도 이동속도는 비슷하도록 한다.
  • fps가 높아질수록 버벅임이 사라진다.
    character_x_pos += to_x * dt 
    character_y_pos += to_y * dt

충돌처리

  • 적enemy 캐릭터 만들어주기
# 적 enemy 캐릭터

enemy = pygame.image.load("D:/바탕화면/개인 공부/ 
game/pygame_basic/enemy.png")
enemy_size = enemy.get_rect().size  # 이미지의 크기를 구해온다.
enemy_width = enemy_size[0]  # 캐릭터의 가로 크기
enemy_height = enemy_size[1]  # 캐릭터의 세로 크기

# 화면 가로의 가운데에 위치
enemy_x_pos = (screen_width/2) - (enemy_width/2)  
# 화면 세로의 가장 아래에 위치
enemy_y_pos = (screen_height/2) - (enemy_height/2)  
  • 이벤트 loop에 만들어준 enemy 표시
    screen.blit(enemy, (enemy_x_pos, enemy_y_pos))
  • 이벤트 loop에 충돌 처리 구문 작성
# 충돌 처리를 위한 rect 정보 실시간 업데이트
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    enemy_rect = enemy.get_rect()
    enemy_rect.left = enemy_x_pos
    enemy_rect.top = enemy_y_pos

 # 충돌 처리
    if character_rect.colliderect(enemy_rect):
        print("충돌했어요")
        running = False

텍스트

  • 폰트 정의
game_font = pygame.font.Font(None, 40)  # 폰트 객체 생성 (폰트, 크기)
  • 시간 정의
# 총 시간
total_time = 10  # 10초 안에 게임을 해야한다고 가정

# 시작 시간 정보. 보통 시간 계산은 현재 tick을 받았다가 나중에 빼는식
start_ticks = pygame.time.get_ticks()  # 현재 tick을 받아옴
  • 이벤트 루프에 시간 표시
    # 타이머 집어 넣기
    # 경과 시간 계산
    elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
    # 경과 시간(ms)을 1000으로 나누어서 초(s) 단위로 표시

    timer = game_font.render(
        str(int(total_time - elapsed_time)), True, (255, 255, 255))
    # render(출력할 글자, True, 글자 색상)
    screen.blit(timer, (10, 10))

    # 만약 시간이 0 이하이면 게임 종료
    if total_time - elapsed_time <= 0:
        print("타임아웃")
        running = False
  • 종료 전 2초정도 대기 시켜주기 ( 이벤트 루프 밖에 작성 )
# 잠시 대기
pygame.time.delay(2000)  # 2초 정도 대기(ms) 

게임 개발 프레임

  • 어떤 게임을 만들더라도 꼭 작성해야 하는 것들
import pygame
##############################################
# 기본 초기화 (반드시 해야 하는 것들)

pygame.init()  # 초기화 (반드시 필요)

# 화면 크기 설정
screen_width = 480  # 가로
screen_height = 640  # 세로
screen = pygame.display.set_mode((screen_width, screen_height))

# 화면 타이틀 설정
pygame.display.set_caption("Ju Game")  # 게임 이름

# FPS
clock = pygame.time.Clock()
##############################################


# 1. 사용자 게임 초기화 (배경 화면, 게임 이미지, 좌표, 속도, 폰트 등)


running = True
while running:
    dt = clock.tick(60)

    # 2. 이벤트 처리 (키보드, 마우스 등 )
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 3. 게임 캐릭터 위치 정의

    # 4. 충돌 처리

    # 5. 화면에 그리기

    pygame.display.update()  # 게임화면을 다시 그리기!


pygame.quit()

최종 코드

import pygame

pygame.init()  # 초기화 (반드시 필요)

# 화면 크기 설정
screen_width = 480  # 가로
screen_height = 640  # 세로
screen = pygame.display.set_mode((screen_width, screen_height))

# 화면 타이틀 설정
pygame.display.set_caption("Nado Game")  # 게임 이름

# FPS
clock = pygame.time.Clock()

# 배경 이미지 불러오기
background = pygame.image.load(
    "D:/바탕화면/개인 공부/game/pygame_basic/background.png")

# 캐릭터(스프라이트) 불러오기
character = pygame.image.load("D:/바탕화면/개인 공부/game/pygame_basic/character.png")
character_size = character.get_rect().size  # 이미지의 크기를 구해온다.
character_width = character_size[0]  # 캐릭터의 가로 크기
character_height = character_size[1]  # 캐릭터의 세로 크기
character_x_pos = (screen_width/2) - (character_width/2)  # 화면 가로의 가운데에 위치
character_y_pos = screen_height - character_height  # 화면 세로의 가장 아래에 위치


# 이동할 좌표
to_x = 0
to_y = 0

# 이동 속도
character_speed = 0.6

# 적 enemy 캐릭터

enemy = pygame.image.load("D:/바탕화면/개인 공부/game/pygame_basic/enemy.png")
enemy_size = enemy.get_rect().size  # 이미지의 크기를 구해온다.
enemy_width = enemy_size[0]  # 캐릭터의 가로 크기
enemy_height = enemy_size[1]  # 캐릭터의 세로 크기
enemy_x_pos = (screen_width/2) - (enemy_width/2)  # 화면 가로의 가운데에 위치
enemy_y_pos = (screen_height/2) - (enemy_height/2)  # 화면 세로의 가장 아래에 위치

# 폰트 정의
game_font = pygame.font.Font(None, 40)  # 폰트 객체 생성 (폰트, 크기)

# 총 시간
total_time = 10  # 10초 안에 게임을 해야한다고 가정

# 시작 시간 정보. 보통 시간 계산은 현재 tick을 받았다가 나중에 빼는식
start_ticks = pygame.time.get_ticks()  # 현재 tick을 받아옴

# 이벤트 루프
running = True  # 게임이 진행중인가?
while running:
    # 프레임 높을수록 빠르고 낮을수록 느리다.
    dt = clock.tick(60)  # 게임 화면의 초당 프레임 수를 설정

# 캐릭터가 100만큼 이동을 해야함
# 10 fps : 1초 동안 10번 동작 -> 1번에 10만큼 이동하니까 10번 동작
# 20 fps : 2초 동안 20번 동작 -> 1번에 5만큼 이동하니까 20번 동작

    for event in pygame.event.get():  # 어떤 이벤트가 발생하였는가?
        if event.type == pygame.QUIT:  # 창이 닫히는 이벤트가 발생하였는가?
            running = False  # 게임이 진행중이 아님

        if event.type == pygame.KEYDOWN:  # 키가 눌러졌는지 확인
            if event.key == pygame.K_LEFT:  # 캐릭터를 왼쪽으로
                to_x -= character_speed
            elif event.key == pygame.K_RIGHT:  # 캐릭터를 오른쪽으로
                to_x += character_speed
            elif event.key == pygame.K_UP:  # 캐릭터를 위쪽으로
                to_y -= character_speed
            elif event.key == pygame.K_DOWN:  # 캐릭터를 아래쪽으로
                to_y += character_speed

        if event.type == pygame.KEYUP:  # 방향키를 떼면 멈충
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                to_x = 0
            if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                to_y = 0

# dt를 곱해 값을 고정해줘서 fps가 바뀌어도 이동속도는 비슷하도록 한다.
# fps가 높아질수록 버벅임이 사라진다.
    character_x_pos += to_x * dt
    character_y_pos += to_y * dt

    # 가로 경계값 처리
    if character_x_pos < 0:
        character_x_pos = 0
    elif character_x_pos > screen_width - character_width:
        character_x_pos = screen_width - character_width

    # 세로 경계값 처리
    if character_y_pos < 0:
        character_y_pos = 0
    elif character_y_pos > screen_height - character_height:
        character_y_pos = screen_height - character_height

    # 충돌 처리를 위한 rect 정보 실시간 업데이트
    character_rect = character.get_rect()
    character_rect.left = character_x_pos
    character_rect.top = character_y_pos

    enemy_rect = enemy.get_rect()
    enemy_rect.left = enemy_x_pos
    enemy_rect.top = enemy_y_pos

    # 충돌 처리
    if character_rect.colliderect(enemy_rect):
        print("충돌했어요")
        running = False

    screen.blit(background, (0, 0))  # 배경 그리기
    screen.blit(character, (character_x_pos, character_y_pos))  # 캐릭터 그리기
    screen.blit(enemy, (enemy_x_pos, enemy_y_pos))

    # 타이머 집어 넣기
    # 경과 시간 계산
    elapsed_time = (pygame.time.get_ticks() - start_ticks) / 1000
    # 경과 시간(ms)을 1000으로 나누어서 초(s) 단위로 표시

    timer = game_font.render(
        str(int(total_time - elapsed_time)), True, (255, 255, 255))
    # render(출력할 글자, True, 글자 색상)
    screen.blit(timer, (10, 10))

    # 만약 시간이 0 이하이면 게임 종료
    if total_time - elapsed_time <= 0:
        print("타임아웃")
        running = False

    pygame.display.update()  # 게임화면을 다시 그리기!

# 잠시 대기
pygame.time.delay(2000)  # 2초 정도 대기(ms)

# pygame 종료
pygame.quit()
profile
anaooauc1236@naver.com

0개의 댓글