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))    # smaller

Lebar 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.