32. Menggambar di layar
Dengan jendela terbuka dan game loop berjalan, langkah selanjutnya adalah meletakkan sesuatu yang terlihat di layar. pygame menyediakan function menggambar untuk persegi panjang, lingkaran, garis, dan poligon. Semuanya mengikuti pola yang sama: beri tahu pygame surface mana untuk digambar, warna apa yang digunakan, dan di mana meletakkannya.
Sistem koordinat
pygame menggunakan sistem koordinat di mana (0, 0)
adalah sudut kiri atas jendela. Sumbu x bertambah ke
kanan dan sumbu y bertambah ke bawah. Ini umum dalam
grafis 2D tapi berlawanan dengan konvensi matematika di mana y bertambah
ke atas.
(0,0) ──────────────────► x
│
│
│
▼
y
Untuk jendela 800x600:
- Sudut kiri atas:
(0, 0) - Sudut kanan atas:
(799, 0) - Sudut kiri bawah:
(0, 599) - Sudut kanan bawah:
(799, 599) - Tengah:
(400, 300)
Saat kamu memposisikan bentuk, kamu memberikan koordinat piksel dalam sistem ini.
Warna sebagai tuple RGB
Setiap warna di pygame adalah tuple tiga integer:
(red, green, blue). Setiap komponen berkisar dari 0 (tidak
ada) hingga 255 (penuh).
| Warna | Tuple |
|---|---|
| Hitam | (0, 0, 0) |
| Putih | (255, 255, 255) |
| Merah | (255, 0, 0) |
| Hijau | (0, 255, 0) |
| Biru | (0, 0, 255) |
| Kuning | (255, 255, 0) |
| Cyan | (0, 255, 255) |
| Magenta | (255, 0, 255) |
| Oranye | (255, 165, 0) |
| Abu-abu gelap | (64, 64, 64) |
Kombinasikan komponen untuk mendapatkan warna apa pun yang kamu
inginkan. (200, 100, 50) adalah oranye kecokelatan;
(30, 30, 80) adalah biru tua gelap.
Simpan warna dalam variable di bagian atas file kamu untuk menghindari pengulangan tuple di mana-mana:
RED = (255, 0, 0)
GREEN = (0, 200, 0)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
SKY = (135, 206, 235)Function menggambar
Semua function menggambar ada di pygame.draw. Panggil
mereka di dalam game loop, setelah
screen.fill(...) (yang membersihkan kanvas) dan
sebelum pygame.display.flip() (yang
menampilkan frame).
Persegi panjang
pygame.draw.rect(screen, color, (x, y, width, height))x,y— posisi sudut kiri atas persegi panjang.width,height— ukuran dalam piksel.
pygame.draw.rect(screen, (255, 0, 0), (100, 150, 200, 80))Menggambar persegi panjang merah dengan sudut kiri atas di
(100, 150), lebar 200 piksel dan tinggi 80 piksel.
Tambahkan argumen kelima untuk ketebalan garis. Ketebalan
0 (default) mengisi bentuk; nilai positif apa pun hanya
menggambar garis tepi:
pygame.draw.rect(screen, (255, 255, 255), (100, 150, 200, 80), 3)Lingkaran
pygame.draw.circle(screen, color, (center_x, center_y), radius)center_x,center_y— posisi pusat.radius— radius dalam piksel.
pygame.draw.circle(screen, (255, 255, 0), (400, 300), 50)Menggambar lingkaran kuning terisi berpusat di
(400, 300) dengan radius 50. Sama seperti persegi panjang,
argumen ketebalan opsional menggambar garis tepi saja.
Garis
pygame.draw.line(screen, color, (x1, y1), (x2, y2), thickness)pygame.draw.line(screen, (255, 255, 255), (0, 0), (799, 599), 2)Menggambar garis putih dari sudut kiri atas ke sudut kanan bawah, tebal 2 piksel.
Poligon
pygame.draw.polygon(screen, color, [(x1,y1), (x2,y2), (x3,y3), ...])Menerima list tuple titik sudut dan menggambar bentuk terisi yang menghubungkannya secara berurutan. Bagus untuk segitiga:
pygame.draw.polygon(screen, (200, 100, 50), [(400, 100), (300, 250), (500, 250)])Ini menggambar segitiga yang mengarah ke atas.
Urutan menggambar itu penting
pygame menggambar bentuk sesuai urutan kamu memanggil function menggambar. Bentuk yang digambar belakangan muncul di atas bentuk yang digambar lebih awal. Tidak ada konsep lapisan z — hanya urutan pemanggilan.
screen.fill((0, 0, 0))
# Draw the background rectangle first
pygame.draw.rect(screen, (0, 100, 200), (50, 50, 300, 200))
# Draw the circle on top of it
pygame.draw.circle(screen, (255, 255, 0), (200, 150), 60)Lingkaran kuning sebagian menutupi persegi panjang biru. Tukar dua panggilan tersebut dan persegi panjang akan menutupi lingkaran.
Menggunakan variable untuk posisi dan ukuran
Menulis angka langsung di pemanggilan draw membuat kode menjadi rapuh. Simpan posisi dan ukuran dalam variable:
x = 100
y = 200
width = 60
height = 60
color = (255, 0, 0)
pygame.draw.rect(screen, color, (x, y, width, height))Sekarang kamu bisa memindahkan kotak dengan mengubah x
dan y. Bab-bab selanjutnya akan memperbarui variable ini
setiap frame untuk membuat benda bergerak.
Buka exercises/32/01-scene.py. Gambar adegan rumah
sederhana:
- Persegi panjang besar untuk badan rumah.
- Segitiga (poligon) untuk atap di atasnya.
- Persegi panjang kecil untuk pintu.
- Lingkaran kuning untuk matahari di salah satu sudut.
Sesuaikan koordinat dan warna hingga adegan terlihat wajar. Tidak perlu bakat seni — mendapatkan koordinat dalam urutan yang benar adalah latihannya.
Contoh menggambar lengkap
import pygame
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Drawing")
clock = pygame.time.Clock()
SKY = (135, 206, 235)
GROUND = (34, 139, 34)
BROWN = (139, 90, 43)
RED = (200, 50, 50)
YELLOW = (255, 220, 0)
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# Clear
screen.fill(SKY)
# Ground
pygame.draw.rect(screen, GROUND, (0, 450, 800, 150))
# House body
pygame.draw.rect(screen, BROWN, (300, 280, 200, 170))
# Roof (triangle)
pygame.draw.polygon(screen, RED, [(280, 280), (400, 160), (520, 280)])
# Sun
pygame.draw.circle(screen, YELLOW, (700, 80), 50)
pygame.display.flip()
clock.tick(60)
pygame.quit()Pekerjaan Rumah
Soal 1 — Bendera
Buka exercises/32/homework/01-flag.py. Gambar bendera
tiga garis sederhana yang mengisi sebagian besar jendela. Setiap garis
harus berwarna berbeda. Gunakan pygame.draw.rect untuk
setiap garis.
Soal 2 — Sasaran
Buka exercises/32/homework/02-target.py. Gambar sasaran:
tiga lingkaran konsentris (satu di dalam yang lain, berpusat di titik
yang sama) dengan warna bergantian — misalnya merah, putih, merah, atau
warna apa pun yang kamu pilih. Lingkaran terluar harus yang terbesar;
yang terdalam yang terkecil.
Soal 3 — Grid
Buka exercises/32/homework/03-grid.py. Gambar grid 4x4
kotak-kotak yang menutupi jendela. Gunakan nested for loop
untuk menghitung posisi setiap kotak. Semua kotak bisa berwarna sama,
tapi gambar garis tepinya (gunakan argumen ketebalan positif) agar kamu
bisa melihat garis gridnya.
Tantangan — Papan catur
Buka exercises/32/homework/04-chessboard.py. Gambar
papan catur 8x8. Kotak di posisi di mana
(row + col) % 2 == 0 berwarna putih; sisanya gelap. Gunakan
nested for loop. Papan harus mengisi jendela dengan
rapi.
Macet atau sudah selesai? Buka halaman solusi pekerjaan rumah.