31. Dari Python ke pygame
Selama ini setiap program yang kamu tulis berjalan di terminal, mencetak beberapa output, lalu selesai. Mulai sekarang, program akan membuka sebuah jendela dan terus berjalan sampai pengguna menutupnya. Alat untuk ini adalah pygame, sebuah library Python untuk membuat game 2D dan program grafis interaktif.
Apa itu pygame
pygame adalah library gratis dan open-source yang membungkus sistem grafis dan input SDL. Library ini memberi program Python kemampuan untuk:
- Membuka jendela yang bisa diubah ukurannya.
- Menggambar bentuk, gambar, dan teks.
- Membaca input keyboard dan mouse.
- Memainkan suara.
- Mengontrol frame rate.
Kamu menggunakan Python yang sudah kamu kenal — if,
for, function, class — dan pygame menyediakan jendela serta
alat untuk mengisinya.
Menginstal pygame
Buka terminal (Command Prompt atau PowerShell di Windows) dan jalankan:
pip install pygame
Kalau gagal dengan error "permission denied", coba:
pip install pygame --user
Setelah terinstal, coba uji:
import pygame
print(pygame.version.ver)Kalau nomor versi muncul (misalnya 2.5.2), instalasi
berhasil.
Program pygame minimal
Ini adalah program pygame terkecil yang membuka sebuah jendela, mempertahankannya tetap terbuka, dan menutup dengan bersih saat kamu mengklik tombol X.
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("My Game")
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()Jalankan dengan:
python exercises/31/01-minimal-window.py
Jendela hitam berukuran 800x600 akan muncul. Tutup dengan tombol X.
Apa yang dilakukan setiap baris
pygame.init()
Memulai semua subsistem pygame — display, input, suara. Panggil sekali sebelum yang lain.
screen = pygame.display.set_mode((800, 600))
Membuka jendela selebar 800 piksel dan setinggi 600 piksel. Nilai
baliknya adalah objek Surface — bayangkan sebagai
kanvas kosong yang bisa kamu gambar. Argumennya adalah tuple
(width, height), jadi tanda kurung ganda
((800, 600)) adalah: yang luar untuk pemanggilan function,
yang dalam membuat tuple.
pygame.display.set_caption("My Game")
Mengatur teks title bar. Ubah ini sesuai nama game kamu.
clock = pygame.time.Clock()
Membuat objek clock yang digunakan untuk mengontrol frame rate. Kamu
akan memanggil clock.tick(60) di akhir setiap frame.
running = True dan
while running:
Game loop. Loop ini berjalan sekali per frame,
ribuan kali per detik jika tidak dibatasi. Mengatur
running = False keluar dari loop dan mengakhiri
program.
for event in pygame.event.get():
Setiap event input yang terjadi sejak frame terakhir — penekanan tombol, klik mouse, event jendela — dikumpulkan di sini. Kamu me-loop melaluinya dan merespons yang mana pun yang penting.
if event.type == pygame.QUIT:
pygame.QUIT terpicu saat pengguna mengklik tombol X.
Mengatur running = False memberi tahu loop untuk berhenti
setelah frame ini.
screen.fill((0, 0, 0))
Melukis seluruh kanvas dengan warna hitam. Argumennya adalah tuple
warna RGB: (red, green, blue), masing-masing 0-255. Ini
membersihkan apa pun yang digambar frame sebelumnya, sehingga frame baru
dimulai dengan kondisi bersih. Ubah tuple untuk mengubah warna latar
belakang.
pygame.display.flip()
pygame menggambar ke buffer di luar layar terlebih dahulu.
flip() menyalin buffer tersebut ke jendela sebenarnya
sehingga pemain bisa melihatnya. Tanpa flip(), jendela
tetap kosong. Panggil sekali di akhir setiap frame, setelah semua gambar
selesai.
clock.tick(60)
Membatasi loop ke 60 frame per detik. Tanpa ini, loop berjalan dengan
kecepatan penuh CPU — ribuan frame per detik pada mesin modern — yang
memboroskan daya dan membuat kecepatan gerakan tidak dapat diprediksi.
60 adalah target; pada mesin yang lambat, loop akan
berjalan lebih lambat, tapi tidak akan pernah lebih cepat dari 60
fps.
pygame.quit()
Mematikan pygame setelah loop selesai. Di beberapa platform, melewatkan ini membuat jendela tetap terbuka atau menyebabkan error.
Pola game loop
Setiap program pygame mengikuti siklus empat langkah yang sama di setiap frame:
1. Proses event (baca keyboard, mouse, event jendela)
2. Perbarui state (gerakkan objek, cek tabrakan, perbarui skor)
3. Gambar (isi latar belakang, gambar semua objek)
4. Flip (tampilkan frame; batasi frame rate)
Ulangi sampai running = False.
Ini adalah perbedaan mendasar antara game dan skrip terminal:
- Skrip terminal berjalan dari atas ke bawah sekali, lalu selesai.
- Game loop menjalankan empat langkah yang sama berulang-ulang — 60 kali per detik — memperbarui dunia sedikit demi sedikit setiap kali.
Semua logika game yang menarik ada di langkah 2 dan 3.
Mengubah ukuran jendela
Untuk mendapatkan ukuran jendela yang berbeda, ubah tuple yang
dilewatkan ke set_mode:
screen = pygame.display.set_mode((1024, 768)) # larger
screen = pygame.display.set_mode((400, 300)) # smallerLebar dan tinggi dalam piksel. Ukuran umum: 640x480 (klasik), 800x600, 1280x720 (HD).
Pekerjaan Rumah
Soal 1 — Ukuran jendela berbeda
Buka exercises/31/homework/01-window-size.py. Ubah
jendela menjadi 1024x768. Tambahkan caption yang bertuliskan
"Big Window". Jalankan dan konfirmasi bahwa jendelanya jauh
lebih besar.
Soal 2 — Warna latar belakang
Buka exercises/31/homework/02-background-colour.py. Ubah
screen.fill(...) menjadi warna selain hitam. Coba
setidaknya dua warna berbeda dengan menjalankan program dua kali dengan
nilai yang berbeda.
Soal 3 — Dua fill
Buka exercises/31/homework/03-two-fills.py. Di dalam
game loop, panggil screen.fill dua kali sebelum
pygame.display.flip() — pertama dengan merah
(255, 0, 0), kemudian dengan biru (0, 0, 255).
Jalankan dan amati warna latar belakangnya. Jelaskan alasannya dalam
sebuah komentar.
Tantangan — Jendela menyusut
Buka exercises/31/homework/04-shrinking-window.py. Mulai
dengan jendela 500x500. Setiap kali pengguna menekan spasi, kurangi
ukuran jendela sebesar 50 piksel di kedua dimensi, hingga minimum
100x100. Gunakan pygame.KEYDOWN dan
event.key == pygame.K_SPACE untuk mendeteksi penekanan
tombol, dan pygame.display.set_mode(...) untuk mengubah
ukuran.
Macet atau sudah selesai? Buka halaman solusi pekerjaan rumah.