Menu
CoddyTech

Satu Fungsi untuk Setiap Status

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

Perulangan mencampur tiga layar, dan setiap keadaan baru akan menambahkan lapisan if lain di dalam proses menggambar dan memperbarui. Kode awal memberi setiap keadaan fungsinya sendiri, lalu perulangan memilih salah satunya:

if state == "menu":
    draw_menu()
elif state == "play":
    play_frame()
else:
    draw_over()

play_frame() menggerakkan objek, memeriksa tabrakan, lalu menggambar. draw_menu() dan draw_over() hanya menggambar. Layar game over menampilkan game yang membeku di bawah pesannya, jadi keduanya menggunakan draw_game() bersama untuk menggambar pemain, batu, dan skor.

Fungsi yang mengubah keadaan atau skor perlu mencantumkannya setelah global:

def play_frame():
    global score, state

Menggerakkan player.x tidak memerlukan global: tindakan itu mengubah Rect, bukan menetapkan yang baru.

Dengan bentuk ini, keadaan baru hanya memerlukan satu fungsi dan satu elif. Tambahkan layar jeda dengan cara itu.

challenge icon

Tantangan

Sedang
  1. Tambahkan state "paused": tekan P saat bermain untuk menjeda, lalu tekan P lagi untuk kembali bermain.
  2. Tulis draw_paused(): game yang dibekukan dengan Paused di tengah pada (240, 160).
  3. Panggil fungsi ini dari perulangan saat state bernilai "paused", dengan satu elif lagi.

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(None, 32)
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 = 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 = 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