Menu
CoddyTech

앵커 포인트

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

(10, 10)에 그린 점수는 왼쪽 가장자리에서 시작합니다. 대신 오른쪽 가장자리에 맞추려면 너비가 필요하며, 너비는 숫자가 커질수록 달라집니다. Rect가 계산을 대신해 줍니다.

text.get_rect()는 점의 위치를 지정하는 키워드 인수를 받습니다. 사용할 수 있는 인수에는 center, topleft, topright, midtop, midbottom 등이 있습니다. 지정한 점이 말한 위치에 오도록 Rect가 배치됩니다.

score_rect = score_text.get_rect(topright=(470, 10))
screen.blit(score_text, score_rect)

이제 점수가 0이든 1000이든 점수의 오른쪽 가장자리는 470에 고정됩니다.

복잡한 배경 위의 텍스트는 받침판 위에 놓으면 더 읽기 쉽습니다. inflate(12, 8)은 중심을 그대로 유지하면서 너비를 12픽셀, 높이를 8픽셀 늘린 Rect의 복사본을 반환합니다. 받침판을 먼저 그린 다음 그 위에 텍스트를 그립니다.

pygame.draw.rect(screen, PLATE, score_rect.inflate(12, 8))

받침판의 오른쪽 가장자리는 텍스트보다 6픽셀 더 오른쪽인 476에, 위쪽 가장자리는 4픽셀 더 위인 6에 있습니다.

challenge icon

챌린지

중급
  1. PLATE = (60, 60, 90)을 추가합니다.
  2. 점수를 topright=(470, 10) 위치에 배치하고 그 뒤에 PLATE 직사각형을 그립니다. 즉, 점수의 Rect를 (12, 8)만큼 확장합니다.
  3. 메뉴에서 Meteor Dodge 뒤에 PLATE 직사각형을 그립니다. 제목의 Rect를 (240, 140) 중심에 배치하고 (24, 12)만큼 확장합니다.

직접 해보기

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("assets/fonts/pixel.ttf", 24)
big_font = pygame.font.Font("assets/fonts/pixel.ttf", 48)
WHITE = (240, 240, 240)


def reset():
    global player, rock, score
    player = pygame.Rect(220, 300, 40, 40)
    rock = pygame.Rect(random.randint(0, 456), -24, 24, 24)
    score = 0


def draw_menu():
    screen.fill((30, 30, 46))
    title = big_font.render("Meteor Dodge", True, WHITE)
    screen.blit(title, title.get_rect(center=(240, 140)))
    hint = font.render("Press Enter to play", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


def draw_game():
    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, WHITE)
    screen.blit(score_text, (10, 10))


def play_frame():
    global score, state
    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"
    draw_game()


def draw_over():
    draw_game()
    message = big_font.render("Game over", True, WHITE)
    screen.blit(message, message.get_rect(center=(240, 160)))
    hint = font.render("Press R to play again", True, WHITE)
    screen.blit(hint, hint.get_rect(center=(240, 200)))


reset()
state = "menu"

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_RETURN and state == "menu":
                state = "play"
            elif event.key == pygame.K_r and state == "over":
                reset()
                state = "play"

    if state == "menu":
        draw_menu()
    elif state == "play":
        play_frame()
    else:
        draw_over()
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz icon실력 점검

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

게임 규칙의 모든 레슨

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