Menu
CoddyTech

메뉴 화면

Coddy Pygame 여정의 게임 규칙 섹션에 포함된 레슨. 29개 중 2번째.

대부분의 게임은 메뉴로 시작합니다. 제목과 시작 방법을 알려 주는 문구가 표시됩니다. 메뉴도 하나의 상태입니다. state = "menu"로 시작하고 메뉴 상태가 유지되는 동안 다른 화면을 그리세요.

게임을 시작하는 것은 키를 한 번 누르는 동작이므로 이벤트에서 읽어 오세요. KEYDOWN 이벤트는 키를 누를 때마다 한 번 발생하고, event.key는 어떤 키를 눌렀는지 알려 줍니다.

if event.type == pygame.KEYDOWN:
    if event.key == pygame.K_RETURN and state == "menu":
        state = "play"

state == "menu" 부분이 중요합니다. Enter 키는 메뉴에서만 시작을 의미합니다. 이후 다른 화면에서 Enter 키를 눌러도 아무 일도 일어나지 않습니다.

이제 그리는 내용도 상태에 따라 달라집니다.

screen.fill((30, 30, 46))
if state == "menu":
    # 제목과 플레이하려면 Enter 키를 누르라는 안내
else:
    # 플레이어, 바위, 점수, 게임 오버

업데이트 코드는 여전히 if state == "play": 아래에 있으므로 메뉴가 표시되는 동안에는 아무것도 움직이지 않습니다.

challenge icon

챌린지

쉬움
  1. state = "menu"로 시작합니다.
  2. 이벤트 루프에서 Enter를 눌렀을 때 상태가 "menu"이면 "play"로 설정합니다.
  3. 상태가 "menu"인 동안 어두운 배경에 Meteor Dodge를 (240, 140)에 가운데 정렬하고 Press Enter to play를 (240, 200)에 가운데 정렬하여 그립니다.
  4. 그렇지 않으면 이전과 같이 게임을 그립니다.

직접 해보기

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Meteor Dodge")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

player = pygame.Rect(220, 300, 40, 40)
rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
score = 0
state = "play"

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    if state == "play":
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 6
        if keys[pygame.K_RIGHT]:
            player.x += 6
        player.clamp_ip(screen.get_rect())

        rock.y += 4
        if rock.top > 360:
            rock.y = -24
            rock.x = random.randint(0, 456)
            score += 1
        if rock.colliderect(player):
            state = "over"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (255, 196, 0), player)
    pygame.draw.rect(screen, (235, 80, 80), rock)
    score_text = font.render(f"Score: {score}", True, (240, 240, 240))
    screen.blit(score_text, (10, 10))
    if state == "over":
        message = font.render("Game over", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(240, 160)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

게임 규칙의 모든 레슨

직접 연습해 보세요: Pygame 플레이그라운드