31. Dari Python ke pygame — Solusi pekerjaan rumah

Untuk menjalankan salah satu dari ini, buka terminal di folder solusi dan jalankan python dengan nama file. Jendela terbuka; tutup dengan tombol X.

Soal 1 — Ukuran jendela berbeda

Soal. Buka jendela 1024x768 dengan caption "Big Window".

Cara memikirkannya. Hanya dua baris yang berubah dari program minimal: tuple di set_mode dan string di set_caption.

Solusi.

import pygame

pygame.init()
screen = pygame.display.set_mode((1024, 768))
pygame.display.set_caption("Big Window")
clock = pygame.time.Clock()

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

    screen.fill((0, 0, 0))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Kesalahan umum.

  • Menulis set_mode(1024, 768) tanpa tuple bagian dalam. set_mode menerima satu argumen — sebuah tuple (width, height) — bukan dua angka terpisah.

Soal 2 — Warna latar belakang

Soal. Isi latar belakang dengan warna selain hitam.

Cara memikirkannya. screen.fill menerima tuple (R, G, B). Setiap komponen berkisar dari 0 hingga 255. Bereksperimenlah sampai menemukan warna yang kamu suka.

Solusi (latar belakang biru tua gelap):

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Coloured Background")
clock = pygame.time.Clock()

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

    screen.fill((30, 30, 80))   # dark navy
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Beberapa warna untuk dicoba: (200, 100, 50) oranye kecokelatan, (0, 128, 0) hijau, (128, 0, 128) ungu.

Kesalahan umum.

  • Memberikan tiga argumen terpisah: screen.fill(30, 30, 80). Argumennya harus satu tuple.

Soal 3 — Dua fill

Soal. Panggil screen.fill dua kali (merah, lalu biru) sebelum flip(). Amati hasilnya dan jelaskan dalam sebuah komentar.

Cara memikirkannya. screen.fill menimpa seluruh kanvas. Panggilan kedua menimpa apa yang dilukis panggilan pertama. Hanya warna kedua yang terlihat saat flip() menampilkan frame.

Solusi.

import pygame

pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Two Fills")
clock = pygame.time.Clock()

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

    screen.fill((255, 0, 0))   # paint red...
    screen.fill((0, 0, 255))   # ...then overwrite with blue
    # Result: the window is blue.
    # The red fill is never shown because flip() has not been called yet.
    # The second fill replaces every pixel the first fill set.
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Ide kunci. Function menggambar menulis ke buffer di luar layar. Tidak ada yang dilihat pemain berubah sampai flip() dipanggil. Karena kedua fill terjadi sebelum flip(), hanya kondisi akhir buffer — biru — yang ditampilkan.

Tantangan — Jendela menyusut

Soal. Mulai 500x500. Setiap penekanan spasi menyusutkan jendela sebesar 50 di setiap dimensi, minimum 100x100.

Cara memikirkannya. Simpan ukuran saat ini dalam variable. Pada K_SPACE, kurangi 50 dari keduanya, clamp ke 100, kemudian panggil pygame.display.set_mode lagi dengan ukuran baru.

Solusi.

import pygame

pygame.init()
width = 500
height = 500
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("Shrinking Window")
clock = pygame.time.Clock()

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_SPACE:
                width = max(100, width - 50)
                height = max(100, height - 50)
                screen = pygame.display.set_mode((width, height))

    screen.fill((50, 50, 50))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

max(100, width - 50) mencegah ukuran turun di bawah 100. Nilai balik set_mode adalah Surface baru untuk ukuran baru, jadi menetapkan ulang screen membuat variable tetap menunjuk ke kanvas yang tepat.

Kesalahan umum.

  • Tidak menetapkan ulang screen. Setelah set_mode, Surface screen lama tidak lagi valid. Selalu gunakan nilai baliknya.
  • Menggunakan pygame.KEYUP alih-alih pygame.KEYDOWN. KEYDOWN terpicu sekali saat tombol ditekan; KEYUP terpicu sekali saat dilepas. Keduanya bisa dipakai di sini, tapi KEYDOWN adalah pilihan yang lebih tepat untuk aksi satu kali.

Selesai?

Bab 32 membahas menggambar bentuk dan warna di layar di dalam game loop.