Buku Ajar · Grafika Game · IT9103
Dari representasi data dan evolusi visual, menuju proyek pertama dengan HTML5 Canvas.
Apa yang sebenarnya dilakukan komputer ketika menampilkan sebuah game? Apakah komputer hanya "menggambar", ataukah ia juga mengelola data, ruang, waktu, perubahan kondisi, dan interaksi pemain?
Setelah mempelajari bab ini, mahasiswa mampu:
Computer graphics adalah bidang yang mempelajari cara merepresentasikan, membentuk, memanipulasi, dan menampilkan informasi visual dengan bantuan komputer. Grafika komputer tidak identik dengan kegiatan "menggambar" di layar — komputer harus menyimpan representasi objek, menghitung transformasi, menentukan warna, lalu menyusun hasil perhitungan menjadi piksel, berulang kali.
Contoh — data karakter sederhana
| posisi x | 240 |
| posisi y | 160 |
| lebar | 48 |
| tinggi | 72 |
| arah gerak | kanan |
| status animasi | idle |
Nilai-nilai ini belum berbentuk gambar — program grafika menggunakannya untuk menentukan tampilan pada tiap frame.
Alur konseptual sistem grafika interaktif pada game:
Keyboard, mouse, controller — mengubah scene state secara langsung.
Aturan, collision, dan state mempengaruhi data yang dirender pada frame berikutnya.
Ketiganya berhubungan dengan informasi visual, tetapi arah pemrosesan berbeda.
| Bidang | Masukan Utama | Keluaran Utama | Pertanyaan Utama | Contoh dalam Game |
|---|---|---|---|---|
| Computer graphics | Data, model, geometri, state | Citra / frame sintetis | "Bagaimana data divisualkan?" | Merender karakter, lingkungan, UI, efek |
| Image processing | Citra atau frame | Citra yang telah diubah | "Bagaimana citra ditransformasi?" | Blur, sharpening, color grading |
| Computer vision | Citra atau video | Informasi, fitur, pose | "Informasi apa dari citra ini?" | Mengenali pose, wajah, marker |
| Karakteristik | Grafika Statis | Grafika Interaktif |
|---|---|---|
| Perubahan tampilan | Tidak berubah setelah dihasilkan | Diperbarui sesuai input, waktu, atau state |
| Kontrol pengguna | Terbatas atau tidak ada | Pengguna memengaruhi kondisi visual |
| Proses rendering | Dapat dilakukan sekali | Dilakukan berulang kali |
| Kebutuhan waktu | Tidak selalu ketat | Sering memiliki batas waktu per frame |
| Contoh | Ilustrasi digital, poster, hasil render | Game, simulator, aplikasi AR/VR |
Perbedaannya bukan hanya soal gambar bergerak — sebuah animasi video dapat bergerak tetapi urutan framenya sudah ditentukan sebelumnya, sehingga tidak interaktif.
Grafika waktu-nyata cukup cepat sehingga sistem memberi respons visual langsung terhadap perubahan input dan state.
Rumus dasar: waktu per frame (ms) = 1000 / FPS
| Target FPS | Waktu per Frame | Implikasi Umum |
|---|---|---|
| 30 FPS | ≈ 33,33 ms | Anggaran lebih longgar, respons lebih jarang diperbarui |
| 60 FPS | ≈ 16,67 ms | Target umum untuk interaksi yang terasa halus |
| 90 FPS | ≈ 11,11 ms | Perlu pemrosesan lebih cepat, relevan untuk aplikasi imersif |
| 120 FPS | ≈ 8,33 ms | Respons sangat sering diperbarui, frame budget sangat ketat |
Frame rate ≠ refresh rate: frame rate adalah seberapa sering aplikasi menghasilkan frame; refresh rate adalah seberapa sering layar memperbarui tampilan.
Entitas pemain, NPC, atau lawan — sprite 2D, primitif, atau model 3D dengan posisi, animasi, dan state.
Latar, terrain, bangunan, batas arena — membentuk ruang dan mengarahkan aturan permainan.
Menu, tombol, health, skor — memfasilitasi interaksi dan informasi yang relevan selama bermain.
Partikel, kilatan, screen shake — umpan balik visual bahwa sebuah peristiwa telah terjadi.
| Representasi Matematis | Representasi Visual | Konsekuensi Gameplay |
|---|---|---|
| Posisi (x, y) | Objek tampil di lokasi tertentu | Jangkauan, navigasi, target |
| Ukuran / skala | Objek tampak besar atau kecil | Keterbacaan, hitbox, prioritas |
| Transformasi | Berpindah, berputar, berubah ukuran | Gerak, orientasi, animasi |
| Bounding volume | Batas abstrak objek | Collision dan hit testing |
| Layer / depth | Urutan atau kedalaman tampilan | Occlusion dan fokus visual |
Contoh: sebuah koin memiliki posisi & ukuran untuk digambar; sistem collision memakai bounding circle-nya untuk mendeteksi sentuhan pemain — mengubah skor dan state koin menjadi "diambil", yang lalu tidak dirender lagi pada frame berikutnya.
Saat pemain menekan tombol panah kanan:
Mekaniknya dapat diuraikan menjadi komponen yang jelas — tanpa kompleksitas engine, aset 3D, atau shader.
Posisi + arah + proyektil
Gerak + rotasi + collision
Pantulan + collision + skor
Grid + state + collision
Canvas bukan game engine — ia tidak "mengerti" bahwa sebuah bentuk adalah pemain, peluru, atau tombol. Program JavaScript-lah yang menyimpan state dan memanggil fungsi drawing.
| Aspek | Canvas 2D | SVG | WebGL |
|---|---|---|---|
| Model | Bitmap; perintah drawing | Objek vektor dalam DOM | Pipeline berbasis GPU |
| Cocok untuk | Game 2D, animasi, visualisasi | Diagram, ikon, grafika vektor | Grafika 2D/3D performa tinggi |
| Pengelolaan objek | Dikelola sendiri oleh program | Setiap elemen dapat diakses via DOM | Buffer, shader, tekstur, state grafika |
| Kompleksitas awal | Rendah | Rendah–menengah | Lebih tinggi |
| Fokus buku ini | Ya | Sebagai pembanding | Pengayaan |
VS Code atau editor lain dengan syntax highlighting dan pemeriksaan kurung.
Console, Elements/Inspector, Sources, Performance untuk debugging.
Disarankan agar modul JS dan aset dimuat konsisten, tidak lewat protokol file://.
| Aturan | Contoh |
|---|---|
| Huruf kecil | player-ship.png |
| Hindari spasi | game-over.png |
| Nama deskriptif | asteroid-large.png |
| Ekstensi sesuai isi | main.js · style.css |
Path bersifat relatif terhadap file pemanggil: dari index.html, stylesheet diakses via css/style.css.
Tiga file terpisah — HTML (struktur), CSS (tampilan), JS (logika) — membuktikan bahwa browser dapat menemukan elemen canvas, memperoleh konteks 2D, dan menggambar scene.
Titik asal (0,0) berada di sudut kiri atas. Nilai x bertambah ke kanan, nilai y bertambah ke bawah — berbeda dari koordinat Kartesian matematika.
Pesawat bergerak kiri–kanan; asteroid masih statis. Belum ada collision, skor dinamis, atau kondisi menang/kalah — jembatan menuju bab berikutnya.
index.html berada di root proyekcss/ & js/ sesuai nama filegetContext('2d') tidak null| Komponen | Draf Awal |
|---|---|
| Gameplay | Pemain mengendalikan pesawat untuk menghindari atau menembak asteroid |
| Objek utama | Pemain, asteroid, bintang latar, peluru opsional |
| Kontrol | Keyboard; mouse/touch pada tahap lanjut |
| Kriteria menang | Bertahan durasi tertentu atau mencapai skor target |
| Kriteria kalah | Bertabrakan dengan asteroid atau health habis |
10 pertanyaan — mis. menghitung frame time untuk 50/60/75 FPS, membedakan frame rate vs refresh rate.
4 kasus — mis. menganalisis apakah target 60 FPS bertahan jika update 5 ms + render 14 ms.
4 tugas — modifikasi Hello Canvas, tambah primitif baru, susun draf spesifikasi Asteroid Dodger.
Rubrik penilaian mencakup struktur proyek, keberhasilan eksekusi, ketepatan koordinat, modifikasi visual, dan kelengkapan spesifikasi.
Satu citra lengkap yang ditampilkan pada satu momen.
Jumlah frame yang dihasilkan/ditampilkan tiap detik (FPS).
Proses menghasilkan tampilan visual dari data atau state.
Citra 2D untuk merepresentasikan objek game.
Program pada tahap tertentu dalam pipeline grafika terprogram.
Kumpulan data yang menggambarkan kondisi sistem pada saat tertentu.
Selesai — Bab 1
Bab berikutnya melanjutkan ke fungsi drawing dan struktur game loop secara lebih sistematis, membangun di atas Asteroid Dodger.