Menu
CoddyTech

Titik Jangkar

Termasuk bagian Aturan Game dalam perjalanan Pygame di Coddy. Pelajaran 7 dari 29.

Skor yang digambar di (10, 10) dimulai dari tepi kiri. Agar posisinya berada di tepi kanan, kamu memerlukan lebarnya, dan lebar itu berubah seiring bertambahnya angka. Rect menghitung semuanya untukmu.

text.get_rect() menerima argumen kata kunci untuk titik mana pun: center, topleft, topright, midtop, midbottom, dan lainnya. Rect ditempatkan sehingga titik itu berada di lokasi yang kamu tentukan:

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

Sekarang tepi kanan skor tetap berada di 470, baik nilainya 0 maupun 1000.

Teks di atas latar belakang yang ramai lebih mudah dibaca jika diletakkan di atas pelat. inflate(12, 8) menghasilkan salinan Rect yang lebarnya bertambah 12 piksel dan tingginya bertambah 8 piksel, dengan titik tengah yang sama. Gambar pelat terlebih dahulu, lalu teks di atasnya:

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

Tepi kanan pelat berada 6 piksel melewati teks, yaitu di 476, dan bagian atasnya berada 4 piksel di atas teks, yaitu di 6.

challenge icon

Tantangan

Sedang
  1. Tambahkan PLATE = (60, 60, 90).
  2. Tempatkan skor dengan topright=(470, 10) dan gambar persegi panjang PLATE di belakangnya: Rect-nya diperbesar sebesar (12, 8).
  3. Di menu, gambar persegi panjang PLATE di belakang Meteor Dodge: Rect judul, dipusatkan di (240, 140), diperbesar sebesar (24, 12).

Coba sendiri

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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Aturan Game

Latihan sendiri: Playground Pygame