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_modemenerima 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. Setelahset_mode, Surfacescreenlama tidak lagi valid. Selalu gunakan nilai baliknya. - Menggunakan
pygame.KEYUPalih-alihpygame.KEYDOWN.KEYDOWNterpicu sekali saat tombol ditekan;KEYUPterpicu sekali saat dilepas. Keduanya bisa dipakai di sini, tapiKEYDOWNadalah pilihan yang lebih tepat untuk aksi satu kali.
Selesai?
Bab 32 membahas menggambar bentuk dan warna di layar di dalam game loop.