Membangun Visual Novel dengan Ren'Py & Bantuan AI
Belajar dari nol: dari ide cerita, generate gambar pakai AI (Gemini & Nano Banana 2), sampai jadi game interaktif yang bisa dimainkan di HP. Tidak perlu jago coding dulu — kita mulai dari langkah paling dasar.
A.Apa yang akan kamu buat?
Di akhir semester, setiap mahasiswa (atau kelompok) menghasilkan satu Visual Novel sederhana — game cerita interaktif di mana pemain membaca dialog, melihat karakter & latar, lalu memilih jalan cerita. Minimal ada satu titik percabangan yang memecah cerita menjadi 2 ending berbeda.
B.Peta belajar 14 pertemuan
Klik kartu mana pun untuk langsung membuka materinya.
C.Senjata digital yang dipakai
Semua tool ini mudah diakses mahasiswa. Yang bertanda GRATIS bisa langsung dipakai tanpa bayar.
D.Cara pakai materi ini
- Baca berurutan dari Pertemuan 1Tiap pertemuan dibangun di atas pertemuan sebelumnya. Jangan loncat.
- Tekan tombol salin pada kotak kode & promptSetiap blok kode Ren'Py dan prompt AI punya tombol "Salin". Tempel langsung ke editor / AI-mu.
- Kerjakan kotak "Tugas Praktik" di tiap akhir babBelajar coding itu seperti berenang — harus dipraktikkan, bukan cuma dibaca.
- Tandai pertemuan yang sudah selesaiTombol "Tandai selesai" di bawah tiap halaman akan menandai progresmu di sidebar.
Pengenalan Game Engine & Kekuatan Ren'Py
Memahami apa itu game engine, kenapa kita memilih Ren'Py untuk game naratif, dan menyiapkan ruang kerja.
"Bayangkan game engine seperti dapur. Semua bahan — gambar, suara, kode — dimasak jadi satu hidangan: game. Hari ini kita pilih dapur yang paling cocok untuk pemula yang mau bercerita."
1Apa itu Game Engine?
Game engine adalah perangkat lunak yang dirancang khusus untuk membuat dan mengembangkan video game. Daripada menulis ribuan baris kode dari nol untuk hal-hal mendasar, engine sudah menyediakannya. Fungsi utamanya:
Rendering
Menggambar grafik 2D/3D ke layar.
Physics
Mengatur tabrakan, gravitasi, gerakan.
Sound & Script
Memutar audio & menjalankan logika cerita.
Memory
Mengelola aset agar game tidak berat.
2Spektrum Game Engine
Engine itu banyak, dari yang super berat sampai yang sangat ringan. Posisikan dirimu: kita bukan mau bikin grafik film, tapi mau bercerita.
| Kategori | Engine | Bahasa | Cocok untuk |
|---|---|---|---|
| The Giants (berat) | Unreal, Unity | C++, C# | Game AAA, grafik realistis, butuh PC kencang |
| The Accessible (ringan) | Godot, GDevelop | GDScript / no-code | Indie 2D, prototipe cepat |
| The Specialist | Ren'Py | Python | Visual Novel & cerita interaktif |
3Mengapa Ren'Py? (The "Why")
Entry barrier rendah
Tidak perlu laptop spek tinggi. Jalan di perangkat sederhana.
Berbasis Python
Python = bahasa populer & relevan untuk karier IT. Belajar VN sekalian belajar Python.
Fokus cerita
Sangat efektif menyampaikan edukasi/pesan lewat cerita interaktif.
Multi-platform
Sekali buat → jalan di Windows, Mac, Linux, Android, iOS.
4Struktur Multimedia dalam Game
Sebuah Visual Novel sebenarnya hanya gabungan 4 lapisan. Memahami ini membuat seluruh mata kuliah ini terasa sederhana:
| Lapisan | Isi | Dibahas di |
|---|---|---|
| Visual | Background, sprite karakter, UI | P3, P5, P12 |
| Audio | Musik latar (BGM), efek suara (SFX) | P7 |
| Logic | Alur cerita & percabangan (script) | P4, P6, P9, P10 |
| Interaktivitas | Pilihan (choices) yang mengubah hasil | P4, P9 |
5Langkah Konkret: Instal Ren'Py
- Buka renpy.org → menu DownloadUnduh Ren'Py SDK versi terbaru (8.x) sesuai sistem operasimu.
- Ekstrak ke folder permanenWindows: ekstrak lalu jalankan
renpy.exe. Mac: salin SELURUH folder ke /Applications — jangan pindahkan app keluar foldernya, nanti tidak jalan. - Buka Launcher → "Create New Project"Beri nama proyek (tanpa spasi, misal:
visualnovel_ku). - Pilih resolusi 1280 × 720Ini titik tengah terbaik: tajam tapi tidak membebani memori.
- Pasang Visual Studio Code sebagai editorDi Launcher, set text editor ke VS Code. Penting karena Ren'Py sangat sensitif terhadap spasi (indentasi).
- Instal Ren'Py SDK dan VS Code di perangkatmu.
- Buat satu proyek baru beresolusi 1280×720.
- Tekan tombol "Launch Project" dan mainkan game contoh bawaan ("The Question") sampai tamat.
- Screenshot layar game yang berhasil jalan sebagai bukti.
Desain Naratif: Memilih Topik & Menyusun Premis
Sebelum menyentuh kode, kita tentukan dulu cerita apa yang mau dibuat. Cerita yang baik dibangun di atas pesan yang jelas.
"Game terbaik bukan yang grafiknya paling bagus, tapi yang pesannya paling kena. Kita pakai medium game untuk berbicara soal hal-hal nyata di sekitar kita."
1Lima Topik Dampak Sosial
Mata kuliah ini selaras dengan nilai-nilai Ahlussunnah wal Jama'ah An-Nahdliyah dan isu sosial krusial. Pilih satu topik berikut sebagai jantung ceritamu:
Ke-NU-an
Nilai toleransi, ukhuwah, & tradisi pesantren.
Pencegahan TPKS
Tindak Pidana Kekerasan Seksual & cara melapor.
Wawasan Kebangsaan
Cinta tanah air, Bhinneka Tunggal Ika.
Pencegahan Judi Online
Bahaya slot & pinjol bagi mahasiswa.
Pencegahan Bullying
Perundungan di kampus & media sosial.
2Rumus Premis: 1 Kalimat yang Kuat
Premis adalah inti cerita dalam satu kalimat. Gunakan rumus sederhana ini:
3Bantuan AI untuk Brainstorming Cerita
Bingung mulai dari mana? Pakai AI (Gemini atau ChatGPT) sebagai partner diskusi. Salin prompt ini, ganti bagian kuning sesuai topikmu:
4Output Pertemuan Ini
Yang kamu kumpulkan di akhir P2 adalah satu dokumen Google Docs berisi:
| Elemen | Isi |
|---|---|
| Topik | Satu dari 5 topik sosial |
| Premis | 1–2 kalimat inti cerita |
| Tokoh (min. 2) | Nama, peran (protagonis/antagonis), 1 baris sifat |
| Titik keputusan | 1 pilihan utama → 2 ending berbeda |
- Pilih 1 topik sosial dan tulis premis 1–2 kalimat.
- Daftar minimal 2 tokoh dengan peran & sifatnya.
- Tentukan 1 titik keputusan dan deskripsikan 2 ending-nya (baik & buruk).
- Kirim link Google Docs ke email dosen: indra.surya.permana@unucirebon.ac.id
Desain Karakter AI yang Konsisten & Mindmap Alur
Rahasia karakter game profesional: wajahnya tetap sama di setiap adegan. Kita pakai pipeline AI untuk mengunci identitas karakter, lalu memetakan alurnya.
"Masalah AI gambar nomor satu: minta wajah yang sama dua kali, hasilnya beda orang. Hari ini kalian belajar 'menahan' AI agar karakternya konsisten — pakai JSON sebagai DNA digital."
1Pipeline 3 Tahap: Canvas → Logic → Renderer
Daripada asal generate, kita pakai alur kerja terstruktur. Ini kunci agar karakter Andi di adegan 1 sama persis dengan Andi di adegan 10.
2Tier 1 — Buat "Model Sheet" (Referensi Induk)
Mulai dari satu kalimat identitas. Tujuannya menciptakan "aktor" dasar, bukan adegan. Mahasiswa biasa pakai Gemini (mode buat gambar / Nano Banana 2) atau ChatGPT.
3Tier 2 — Kunci Identitas ke Format JSON
Minta AI menganalisis gambar referensi dan menguncinya jadi data terstruktur. Ini mencegah AI "berhalusinasi" mengubah bentuk wajah. Upload Master_Reference.png ke Gemini lalu kirim prompt ini:
AI akan membalas dengan "DNA digital" karaktermu, kira-kira seperti ini:
{
"character_id": "andi_01",
"facial_geometry": {
"jawline": "soft_v_shape",
"eye_shape": "large_almond",
"eye_color": "dark_brown"
},
"hair": "short_messy_black",
"outfit_base": "grey_hoodie",
"expression": "neutral"
}
4Tier 3 & 4 — Bikin Variasi Ekspresi
Untuk membuat ekspresi baru (sedih, marah, senyum), cukup ubah satu baris di JSON lalu gabungkan dengan gambar induk. Karakter tetap orang yang sama, hanya wajahnya berubah.
5Memetakan Alur dengan Mindmap (XMind)
Sebelum coding, gambar dulu alur ceritamu sebagai peta. Setiap kotak = adegan, setiap garis = perpindahan. Inilah cetak biru yang nanti diterjemahkan ke kode di P4.
- Generate Master_Reference.png untuk minimal 1 tokoh utama pakai Gemini/Nano Banana 2.
- Minta AI membuat profil JSON karaktermu, lalu buat minimal 2 variasi ekspresi (mis. netral & sedih).
- Gambar mindmap alur ceritamu di XMind dengan minimal 1 titik keputusan & 2 ending.
- Pastikan art style karakter konsisten (semua anime, atau semua realistis — jangan dicampur).
Transformasi Mindmap ke Logika Ren'Py
Coding pertamamu! Kita ubah peta cerita (mindmap) menjadi kode yang berjalan. Hanya butuh 3 perintah inti: label, menu, jump.
"Logika yang jernih di atas kertas adalah kunci dari aplikasi yang melesat di layar. Hari ini kalian buktikan: mindmap kemarin tinggal kita 'terjemahkan' satu lawan satu jadi kode."
1Aturan Emas: Pemetaan 1-ke-1
Inilah jembatan ajaib dari gambar ke kode. Setiap elemen mindmap punya padanan kode yang pasti:
| Elemen Mindmap | Perintah Ren'Py | Arti |
|---|---|---|
| Kotak / Node | label nama: | Penanda lokasi adegan (seperti pin GPS) |
| Garis / Edge | jump nama | Pindah ke adegan lain (teleportasi) |
| Cabang / Decision | menu: | Pemain memilih jalan cerita |
label Start berbeda dari label start. Pakai garis bawah: label rute_pinjol. Titik masuk wajib game selalu label start:.2Coba Dulu: Simulator Cerita Bercabang
Sebelum lihat kodenya, mainkan dulu hasil akhirnya. Klik pilihan dan rasakan bagaimana satu keputusan memecah cerita. Inilah yang akan kamu bangun.
Uang semesterku habis buat main slot... besok deadline bayar. Aku harus gimana?
3Bedah Kode: Bagian Pembuka
Buka file script.rpy di proyekmu. Mulai dari titik masuk wajib, label start:. Perhatikan indentasi 4 spasi.
# Definisi tokoh (dibahas detail di P6)
define a = Character("Andi", color="#c8ffc8")
label start:
scene bg kamar # tampilkan latar kamar kost
show andi sedih # tampilkan sprite Andi ekspresi sedih
a "Uang semesterku habis buat main slot... aku harus gimana?"
jump titik_pilihan # lompat ke adegan pilihan
4Bedah Kode: Struktur Menu (Percabangan)
Blok menu: memaksa game berhenti & menunggu pemain memilih. Setiap pilihan diakhiri titik dua, lalu di bawahnya (menjorok) ada perintah jump.
label titik_pilihan:
a "Apa yang harus kulakukan?"
menu:
"Cerita jujur ke teman, minta saran":
jump rute_jujur
"Diam-diam pinjam uang lewat pinjol":
jump rute_pinjol
5Bedah Kode: Dua Rute & Dua Ending
label rute_jujur:
scene bg kampus
show rizki senyum
"Rizki" "Untung kamu cerita. Ayo ke bagian kemahasiswaan, ada keringanan UKT."
show andi lega
a "Terima kasih, Riz. Aku kapok main judi online."
"Andi belajar bahwa jujur & minta bantuan adalah keputusan terkuat."
jump tamat
label rute_pinjol:
scene bg kamar
show andi cemas
a "Pinjol cair... tapi bunganya mencekik. Utangku malah menumpuk."
"Sebulan kemudian, Andi terjebak utang yang jauh lebih besar."
"BAD ENDING: Jalan pintas sering jadi jebakan."
jump tamat
label tamat:
"TAMAT"
return # kembali ke main menu
jump tamat. Menggabungkan kembali alur di satu titik akhir membuat kode efisien. Kamu tidak perlu menulis ending terpisah berkali-kali.6Menjalankan & Membaca Error
- Simpan file (Ctrl+S) di VS CodeRen'Py membaca ulang file setiap kali disimpan.
- Klik "Launch Project" di LauncherKalau ada error, layar akan menampilkan baris & jenis kesalahannya.
- Error paling umum: indentasiPesan seperti
expected a statementatauinconsistent indentation= cek spasimu. Harus 4 spasi konsisten. - Stuck? Salin error ke AITempel pesan error ke NotebookLM/Gemini dengan format terstruktur, minta perbaikan sintaksis.
jump?- Tulis ulang mindmap-mu (dari P3) menjadi kode Ren'Py: minimal 1
menu:dengan 2jump. - Pastikan ada
label start:, 2 rute berbeda, dan ditutupreturn. - Jalankan dan pastikan kedua pilihan menghasilkan ending berbeda.
- Tantangan: tambahkan pilihan ke-3 (mis. "Cari kerja paruh waktu") dengan rute & ending-nya sendiri.
Background & Image Processing dengan AI
Membangun dunia game: bagaimana menghasilkan latar (background) yang indah & konsisten dengan AI, lalu memolesnya agar siap pakai di Ren'Py.
"Karakter butuh panggung. Hari ini kita bangun dunianya. Ingat satu hukum: latar dan karakter harus 'satu nafas' gaya seninya. Anime ketemu anime, jangan anime ketemu foto realistis."
1Alur Kerja: Dari Prompt ke Layar Game
Membuat background bukan sekali jadi. Ada 3 tahap yang harus dilewati setiap aset latar:
.webp ke folder game/images/ proyek Ren'Py.2Rumus Prompt Background yang Ampuh
Background yang bagus lahir dari prompt terstruktur. Gabungkan 4 unsur ini, selalu dengan urutan yang sama:
show di Ren'Py. Background + karakter dipisah supaya bisa dipakai ulang di banyak adegan.3Hukum Konsistensi Gaya Seni
Ini kesalahan nomor satu pemula: mencampur gaya. Game terlihat amatir jika karakter bergaya anime ditempel di latar foto realistis. Pegang teguh matriks ini:
| Aset | Boleh | Jangan |
|---|---|---|
| Karakter Andi | anime style | foto realistis |
| Latar kamar kost | anime style | render 3D / foto |
| Latar kampus | anime style | cat air / kartun barat |
4Rasio 16:9 — Wajib!
Layar game Ren'Py kita 1280×720, yaitu rasio 16:9 (landscape/lebar). Jika kamu generate gambar rasio 1:1 (kotak), hasilnya akan ada garis hitam di kiri-kanan (black bars) saat dipasang.
--ar 16:9 atau pilih rasio Landscape / Widescreen di pengaturan AI. Ukuran ideal 1280×720 atau 1920×1080.5Finishing di Canva
Setelah gambar jadi, poles agar sempurna. Canva gratis dan mudah dipakai:
- Unggah gambar AI ke CanvaBuat desain ukuran 1280×720 px (Custom Size), lalu seret gambarmu ke kanvas.
- Crop pas 16:9Pastikan gambar menutupi seluruh kanvas tanpa ruang kosong.
- Color grading (atur warna)Pakai menu "Edit Photo" → sesuaikan brightness/contrast agar suasana pas (misal kamar kost terasa muram).
- Ekspor sebagai WebP atau PNGDownload → pilih format.
.webpukurannya kecil & ringan, ideal untuk game. - Simpan ke folder proyekLetakkan di
nama_proyek/game/images/. Beri nama jelas:bg_kamar.webp,bg_kampus.webp.
6Memanggil Background di Ren'Py
Setelah file bg_kamar.webp ada di folder images, panggil dengan perintah scene. Ren'Py otomatis menemukan file dari namanya.
label start:
scene bg kamar with fade # file: bg_kamar.webp, muncul dengan transisi fade
"Suasana kamar kost terasa sepi malam itu."
scene bg kampus with dissolve # ganti latar ke kampus
"Keesokan harinya, Andi berangkat ke kampus."
bg_kamar.webp dipanggil dengan scene bg kamar (garis bawah jadi spasi). Huruf kecil semua, tanpa spasi pada nama file. Ren'Py mencocokkan otomatis.- Generate 2 background (mis. kamar kost & kampus) dengan gaya seni yang sama, rasio 16:9.
- Poles di Canva, ekspor
.webp, simpan kegame/images/. - Pasang di script:
scene bg kamardanscene bg kampusdengan transisi. - Tantangan: buat 1 background bernuansa lokal Cirebon.
Scripting Dialog & Visual Acting
Menghidupkan tokoh: bagaimana karakter berbicara, muncul di posisi tertentu, dan berganti ekspresi seiring emosi cerita.
"Karakter yang baik bukan patung. Dia masuk dari kiri, menatap kita, lalu wajahnya berubah sedih saat menceritakan masalahnya. Itulah 'visual acting' — dan kalian sutradaranya."
1Mendefinisikan Tokoh dengan Character()
Sebelum tokoh bisa bicara, dia harus didaftarkan. Letakkan baris ini di ATAS file (sebelum label start:). Warna membantu pemain membedakan siapa yang bicara.
# Daftarkan tokoh di bagian atas file
define a = Character("Andi", color="#7ed0ff")
define r = Character("Rizki", color="#ffd07e")
define n = Character(None) # narator, tanpa nama
label start:
n "Malam itu hujan turun di luar kost."
a "Aku benar-benar bingung, Ki."
r "Tenang, cerita aja dulu masalahnya."
a untuk Andi dan r untuk Rizki agar penulisan dialog cepat. Tokoh n dengan None adalah narator — teks tanpa nama yang menjelaskan suasana.2Menampilkan & Memposisikan Karakter
Perintah show menampilkan sprite karakter. Tambahkan posisi at left, at center, atau at right agar mereka berdiri di tempat yang pas.
label start:
scene bg kamar
show andi senyum at left # Andi muncul di kiri, ekspresi senyum
a "Hai, akhirnya kamu datang juga."
show rizki normal at right # Rizki muncul di kanan
r "Maaf telat, tadi macet."
3Sistem Ekspresi: Tag + Attribute
Inilah kekuatan penamaan dari P3. Jika kamu punya file andi_senyum.webp dan andi_sedih.webp, Ren'Py menganggap "andi" sebagai tag dan "senyum"/"sedih" sebagai ekspresi. Mengganti ekspresi cukup show andi sedih — otomatis menimpa yang lama di posisi yang sama.
show andi senyum at center
a "Awalnya semua baik-baik saja."
show andi sedih # wajah berubah jadi sedih, posisi tetap
a "Tapi lalu aku terjebak judi online..."
show andi nangis with dissolve # ganti ekspresi dengan transisi halus
andi), Ren'Py tahu kamu mengubah karakter yang SAMA, bukan menambah karakter baru. Wajah berganti mulus tanpa karakter berpindah tempat. Inilah hasil dari pipeline karakter konsisten di P3.4Transisi & Jeda Dramatis
Gunakan with untuk transisi visual, dan {w} untuk jeda di tengah kalimat — menciptakan ketegangan.
| Perintah | Efek |
|---|---|
with dissolve | Gambar berganti lembut (memudar) |
with fade | Layar gelap dulu, lalu muncul (ganti adegan) |
hide andi | Sembunyikan karakter (keluar layar) |
"Aku... {w} tidak tahu." | Jeda di tengah kalimat untuk efek dramatis |
5Studi Kasus Lengkap: Adegan Curhat
Gabungan semua: latar, dua tokoh, ekspresi berubah, dan transisi. Inilah satu adegan utuh yang siap pakai.
label adegan_curhat:
scene bg kamar with fade
show andi sedih at center
a "Ki, aku harus jujur... {w} aku kalah banyak di judi online."
show rizki kaget at right with dissolve
r "Apa?! Sejak kapan kamu main begituan?"
show andi nangis
a "Sebulan ini. Uang semesterku habis."
show rizki tegas with dissolve
r "Kita cari jalan keluar bareng. Jangan ambil keputusan gegabah."
return
{w} di tengah dialog?- Daftarkan minimal 2 tokoh dengan
Character()dan warna berbeda. - Buat 1 adegan dialog: karakter muncul di posisi (left/right), bicara, lalu ganti ekspresi minimal sekali.
- Gunakan minimal 1 transisi
with dissolvedan 1 jeda{w}. - Tantangan: buat adegan bertema pencegahan bullying atau TPKS sesuai topikmu.
Audio & Sound Effect dengan AI
Suara mengubah segalanya. Musik latar membangun emosi, efek suara memberi "rasa" pada aksi. Kita buat musik dengan Suno AI dan pasang di Ren'Py.
"Coba tonton film horor tanpa suara — tidak seram, kan? Audio adalah setengah dari emosi. Hari ini kita beri 'jiwa' pada game lewat musik dan efek suara."
1Dua Jenis Suara dalam Game
play music.play sound.2Membuat Musik dengan Suno AI
Suno AI mengubah deskripsi teks menjadi musik utuh. Buka suno.com, login, lalu beri prompt suasana yang kamu mau. Untuk game, minta versi instrumental (tanpa vokal) agar tidak mengganggu dialog.
.mp3 atau .ogg.3Menyiapkan File Audio
- Unduh musik dari SunoPilih hasil yang paling pas, klik Download → format MP3.
- (Opsional) Rapikan di AudacityAudacity gratis untuk memotong bagian awal/akhir, atau menurunkan volume. Ekspor ulang sebagai MP3/OGG.
- Simpan ke folder audioLetakkan di
nama_proyek/game/audio/. Beri nama:bgm_sedih.mp3,sfx_notif.mp3.
4Memasang Audio di Ren'Py
Gunakan play music untuk BGM (otomatis loop) dan play sound untuk efek sekali bunyi. fadein membuat musik masuk perlahan.
label adegan_sedih:
scene bg kamar with fade
play music "bgm_sedih.mp3" fadein 2.0 # musik masuk perlahan 2 detik, loop otomatis
show andi sedih at center
a "Aku merasa sangat sendirian malam ini."
play sound "sfx_notif.mp3" # bunyi notifikasi HP, sekali saja
a "Eh? Ada pesan dari Rizki."
stop music fadeout 3.0 # musik berhenti perlahan saat adegan ganti
return
| Perintah | Fungsi |
|---|---|
play music "x.mp3" | Putar BGM (berulang otomatis) |
fadein 2.0 | Musik masuk perlahan selama 2 detik |
play sound "x.mp3" | Putar efek suara sekali |
stop music fadeout 3.0 | Hentikan musik perlahan 3 detik |
- Buat minimal 1 BGM di Suno (instrumental) yang sesuai suasana ceritamu.
- Cari/buat 1 efek suara (SFX) yang relevan.
- Pasang di script:
play music ... fadeindanplay sound .... - Tantangan: ganti musik saat cerita berpindah dari adegan tegang ke adegan lega.
UTS — Review Prototipe Game
Titik evaluasi tengah semester. Bukan ujian tulis — kamu mempresentasikan prototipe game-mu yang sudah berjalan. Mari pastikan semuanya siap.
"Sampai di sini kalian sudah menempuh separuh jalan. Yang saya nilai bukan kesempurnaan, tapi prototipe yang BERJALAN: cerita bercabang, aset AI, dan logika yang utuh. Tunjukkan progresmu."
1Yang Sudah Kamu Pelajari (P1–P7)
Sebelum review, mari rangkum perjalananmu sejauh ini:
| Pertemuan | Yang dikuasai |
|---|---|
| P1 | Memahami game engine & instal Ren'Py |
| P2 | Merancang premis cerita dari 5 topik sosial |
| P3 | Membuat karakter AI konsisten & mindmap |
| P4 | Menerjemahkan mindmap ke kode (label/menu/jump) |
| P5 | Generate background AI 16:9 yang konsisten |
| P6 | Dialog, posisi karakter, & ekspresi |
| P7 | Musik latar & efek suara |
2Checklist Wajib Prototipe (MVP)
Prototipe yang lulus UTS minimal harus memenuhi semua poin ini. Centang satu per satu:
3Cara Memeriksa Error Sebelum Demo
- Jalankan LintDi Ren'Py Launcher → pilih proyek → klik "Check script (Lint)". Ini menemukan error sebelum kamu jalankan.
- Tekan Shift+O untuk konsolSaat game jalan, Shift+O membuka konsol debug untuk melihat nilai variabel.
- Uji KEDUA ruteMainkan dari awal, pilih rute A. Ulangi, pilih rute B. Pastikan dua-duanya selesai tanpa macet.
show. Periksa dua hal ini lebih dulu jika game error.4Format Presentasi Demo
- Pastikan SEMUA poin checklist MVP tercentang.
- Jalankan Lint & uji kedua rute hingga tanpa error.
- Siapkan penjelasan singkat tentang topik sosial & pesan moralmu.
- Kumpulkan folder proyek sesuai format penamaan (lihat halaman Proyek Akhir).
Menu Lanjutan & Subrutin (Call)
Naik level percabangan: membuat pilihan yang benar-benar bermakna, dan menggunakan call agar satu adegan bisa dipakai berulang tanpa menulis ulang.
"Di P4 kalian belajar jump — pergi dan tak kembali. Sekarang kenalan dengan call — pergi, selesaikan tugas, lalu PULANG ke tempat semula. Seperti makmum masbuk yang menyelesaikan rakaat lalu kembali ke barisan."
1jump vs call: Perbedaan Inti
Keduanya berpindah ke label lain, tapi nasibnya beda. jump pindah permanen. call pindah sementara, lalu return membawanya pulang ke baris setelah pemanggilan.
jump label | call label | |
|---|---|---|
| Setelah selesai | Tetap di tujuan | Kembali ke pemanggil (via return) |
| Analogi | Pindah rumah | Pergi ke warung lalu pulang |
| Cocok untuk | Percabangan cerita utama | Adegan berulang (cek status, mini-event) |
2Contoh call: Adegan yang Dipakai Ulang
Bayangkan ada adegan "cek saldo dompet" yang muncul beberapa kali. Daripada menyalin kodenya berulang, buat sekali lalu call kapan pun dibutuhkan.
label start:
a "Aku mau beli buku, tapi cek uang dulu."
call cek_dompet # pergi ke subrutin...
a "Oke, sekarang aku lanjut ke toko." # ...lalu lanjut DI SINI
return
label cek_dompet:
"Kamu membuka dompet."
"Isi: Rp 50.000."
return # pulang ke baris setelah 'call'
call kamu harus copy-paste
Jika adegan cek dompet muncul 5 kali, dengan call kamu cukup menulisnya SEKALI. Hemat tenaga, dan jika perlu mengubah, cukup ubah di satu tempat. Inilah "DRY" — Don't Repeat Yourself.3Pilihan Bermakna vs Pilihan Kosmetik
Tidak semua pilihan harus mengubah cerita. Pahami dua jenis ini:
jump.label warung:
menu:
"Pesan kopi":
a "Satu kopi hitam, ya." # kosmetik: lalu lanjut sama
"Pesan teh":
a "Teh manis hangat satu." # kosmetik: lalu lanjut sama
"Andi duduk menunggu pesanan." # kedua pilihan bertemu di sini
jump lanjut_cerita
jump di dalamnya, sehingga otomatis lanjut ke baris di bawah menu — bertemu kembali. Teknik ini disebut konvergensi, menghemat penulisan.4Memecah Script Jadi Beberapa File
Saat cerita membesar, satu file script.rpy jadi penuh. Ren'Py membaca SEMUA file .rpy di folder game/. Pisahkan agar rapi:
| File | Isi |
|---|---|
script.rpy | label start & alur utama |
characters.rpy | Semua define ... Character() |
rute_baik.rpy | Adegan-adegan rute good ending |
rute_buruk.rpy | Adegan-adegan rute bad ending |
- Buat 1 subrutin dengan
call+returnyang dipanggil minimal 2 kali. - Tambahkan 1 pilihan kosmetik (konvergen) ke ceritamu.
- Pisahkan definisi karakter ke file
characters.rpyterpisah. - Tantangan: buat subrutin "narasi pesan moral" yang dipanggil di kedua ending.
Variabel & State (Sistem Poin)
Membuat game "mengingat" keputusan pemain. Dengan variabel, ending bisa ditentukan oleh kumpulan pilihan — bukan satu pilihan saja.
"Game cerdas mengingat. Setiap kebaikan menambah poin, setiap kesalahan menguranginya. Di akhir, jumlah poinlah yang menentukan nasib tokoh. Ini membuat cerita terasa hidup & adil."
1Apa itu Variabel?
Variabel adalah "kotak penyimpan" nilai. Bisa berisi angka (skor), benar/salah (sudah ketemu seseorang?), atau teks. Game membacanya untuk mengambil keputusan.
# Deklarasi variabel di awal (sebelum start), beri nilai awal default poin = 0 # skor kebaikan, mulai dari 0 default sudah_jujur = False # apakah Andi sudah jujur? awalnya belum
default vs $
Pakai default untuk MEMBUAT variabel pertama kali (di luar label). Pakai $ untuk MENGUBAH nilainya di tengah cerita, contoh $ poin = poin + 1.2Mengubah Nilai dengan $
Setiap pilihan baik menambah poin. Tanda $ memberi tahu Ren'Py: "ini perintah Python, jalankan."
label start:
menu:
"Cerita jujur ke Rizki":
$ poin = poin + 1 # +1 poin kebaikan
$ sudah_jujur = True
r "Bagus kamu mau terbuka."
"Diam saja, simpan sendiri":
$ poin = poin - 1 # -1 poin
a "Aku tak sanggup cerita..."
jump cek_ending
3Mengambil Keputusan dengan if / else
Di akhir cerita, game memeriksa poin. Jika cukup tinggi → good ending. Jika rendah → bad ending. Inilah inti "sistem poin".
label cek_ending:
if poin >= 1:
scene bg kampus with fade
a "Aku memilih jujur, dan teman-temanku membantuku bangkit."
"TAMAT - Good Ending"
elif poin == 0:
a "Aku masih ragu, jalan ini abu-abu."
"TAMAT - Netral Ending"
else:
scene bg kamar with fade
a "Aku menyimpan semuanya sendiri, dan terjerumus makin dalam."
"TAMAT - Bad Ending"
return
| Operator | Arti | Contoh |
|---|---|---|
== | sama dengan | if poin == 0 |
>= | lebih besar / sama | if poin >= 1 |
< | lebih kecil | if poin < 0 |
and / or | dan / atau | if poin >= 1 and sudah_jujur |
= vs dua ==
$ poin = 5 berarti "isi poin dengan 5" (memberi nilai). if poin == 5 berarti "apakah poin sama dengan 5?" (memeriksa). Tertukar = error logika yang sulit dilacak!4Menampilkan Variabel ke Layar
Kamu bisa menyisipkan nilai variabel ke dalam dialog dengan kurung kurawal [ ].
a "Poin kebaikanku sekarang [poin]."
"Status jujur: [sudah_jujur]"
if poin >= 1: akan dijalankan jika?- Buat variabel
poindengandefault. - Buat minimal 2 pilihan yang menambah/mengurangi poin.
- Buat
label cek_endingdenganif/elif/else— minimal 2 ending berdasarkan poin. - Tantangan: tambah variabel
True/False(mis.sudah_minta_maaf) sebagai syarat tambahan good ending.
Visual Effects dengan ATL
Membuat karakter "hidup": bergerak masuk, melompat kaget, atau bergetar marah. ATL (Animation & Transformation Language) adalah bahasa gerak Ren'Py.
"Karakter diam itu kaku. Tapi yang masuk dari samping sambil bergeser halus? Terasa sinematik. ATL membuat aset statismu seolah dianimasikan tangan profesional."
1Posisi Bawaan Ren'Py
Sebelum animasi, kenali posisi siap pakai. Cukup tambahkan at + nama posisi.
| Posisi | Letak |
|---|---|
at left | Kiri layar |
at right | Kanan layar |
at center | Tengah (kaki menyentuh bawah) |
at truecenter | Benar-benar tengah layar |
2Membuat Transform (Gerakan Kustom)
Blok transform mendefinisikan gerakan. ease membuat perpindahan halus (melambat di ujung). Letakkan di atas, sebelum label start.
# Gerakan: masuk dari luar layar kiri, meluncur ke posisi kiri
transform masuk_kiri:
xpos -0.3 yalign 1.0 # mulai dari luar layar
ease 0.8 xpos 0.15 # meluncur ke kiri layar dalam 0.8 detik (halus)
# Gerakan: efek bergetar (kaget/marah)
transform getar:
block:
ease 0.05 xoffset 8
ease 0.05 xoffset -8
repeat 4 # ulangi 4 kali
3Memakai Transform di Adegan
label start:
scene bg kampus
show andi senyum at masuk_kiri # Andi meluncur masuk dari kiri
a "Hai, aku baru sampai!"
show andi kaget at getar # Andi bergetar kaget
a "Eh?! Kok bisa begitu?!"
ease vs linear
linear bergerak datar dengan kecepatan tetap (terasa robotik). ease mulai pelan, cepat di tengah, melambat di akhir (terasa alami & halus). Untuk gerakan karakter, hampir selalu pakai ease.4Transisi Layar Kustom
Selain dissolve dan fade bawaan, kamu bisa membuat transisi sendiri, misalnya kilatan putih untuk momen mengejutkan.
# Definisi transisi kilat putih
define flash = Fade(0.1, 0.0, 0.5, color="#fff")
label kejutan:
scene bg kamar with flash # layar berkedip putih lalu muncul
"PETIR menyambar di luar jendela!"
repeat 4 dalam transform?- Buat 1
transformkemunculan karakter (meluncur masuk denganease). - Buat 1
transformefek emosi (getar/melompat). - Terapkan keduanya di adegan ceritamu.
- Tantangan: buat 1 transisi layar kustom (mis. kilat) untuk momen dramatis.
Kustomisasi UI/UX
Mengubah tampilan antarmuka game agar bercirikan karyamu sendiri: kotak dialog, menu utama, dan tombol — bukan lagi bawaan standar.
"Sampai sekarang game kalian masih memakai 'baju seragam' bawaan Ren'Py. Hari ini kita jahit baju sendiri — antarmuka yang mencerminkan identitas karyamu. Inilah yang membuatnya terlihat profesional."
1Apa itu Screen Language?
Semua elemen antarmuka (kotak teks, menu, tombol) didefinisikan dalam blok screen. Ren'Py sudah punya screen bawaan di file screens.rpy — kita tinggal memodifikasinya.
| Wadah | Fungsi |
|---|---|
vbox | Menyusun elemen secara vertikal (atas ke bawah) |
hbox | Menyusun elemen secara horizontal (kiri ke kanan) |
frame | Kotak berbingkai sebagai wadah |
textbutton | Tombol berisi teks yang bisa diklik |
2Mengubah Warna Kotak Dialog
Cara termudah memberi ciri khas: ganti warna teks & latar kotak dialog. Buka game/gui.rpy dan ubah nilai warnanya.
## Warna aksen utama (tombol, judul) define gui.accent_color = '#0B6E4F' # hijau ## Warna teks dialog define gui.text_color = '#ffffff' ## Warna nama tokoh define gui.name_text_color = '#D99A2B' # emas
screens.rpy & gui.rpy sebagai cadangan. Jika tampilan rusak, kamu bisa kembalikan. Ubah satu nilai, jalankan, lihat hasilnya — baru lanjut.3Membuat Tombol Menu Utama Kustom
Contoh screen menu utama sederhana dengan tombol vertikal. action menentukan apa yang terjadi saat diklik.
screen main_menu():
add "bg_judul.webp" # gambar latar menu
vbox:
xalign 0.5 yalign 0.7 # posisikan di tengah-bawah
spacing 12
textbutton "Mulai Cerita" action Start()
textbutton "Muat" action ShowMenu("load")
textbutton "Pengaturan" action ShowMenu("preferences")
textbutton "Keluar" action Quit()
| Action | Fungsi |
|---|---|
Start() | Mulai game baru (ke label start) |
ShowMenu("load") | Buka layar muat simpanan |
Quit() | Keluar dari game |
Return() | Kembali ke game |
4Menyimpan Pengaturan dengan persistent
Variabel biasa hilang saat game ditutup. persistent menyimpan data SELAMANYA (lintas sesi) — cocok untuk galeri terbuka, achievement, atau pengaturan.
label good_ending:
a "Aku berhasil bangkit!"
$ persistent.good_ending_terbuka = True # tersimpan selamanya
"Achievement terbuka: Jalan Kebaikan"
return
- Ubah minimal 2 warna di
gui.rpy(mis. aksen & warna nama tokoh) sesuai temamu. - Modifikasi teks tombol di menu utama.
- Buat 1 variabel
persistentyang terbuka saat mencapai good ending. - Tantangan: tambahkan gambar latar kustom untuk menu utama.
Python Lanjutan dalam Ren'Py
Membuka kekuatan penuh: karena Ren'Py adalah Python, kamu bisa menulis logika kompleks — inventory, sistem stat, hingga mekanik mirip RPG.
"Selama ini kalian memakai Python 'tersembunyi' lewat $. Hari ini kita buka pintunya lebar-lebar. Dengan blok init python, game kalian bisa melakukan apa pun yang Python bisa."
1Blok init python
Untuk kode Python yang panjang (lebih dari satu baris), gunakan blok init python:. Diletakkan di atas, dijalankan saat game dimuat — sebelum cerita mulai.
init python:
# fungsi untuk menghitung level dari poin
def hitung_level(poin):
if poin >= 10:
return "Bijak"
elif poin >= 5:
return "Berkembang"
else:
return "Pemula"
$ vs init python:?
Pakai $ untuk 1 baris cepat di tengah cerita. Pakai blok init python: untuk mendefinisikan fungsi, class, atau logika banyak baris yang ingin dipakai berulang.2Memanggil Fungsi di Cerita
label akhir:
$ level = hitung_level(poin) # panggil fungsi, simpan hasil
a "Perjalananku membuatku jadi pribadi yang [level]."
return
3Class: Membuat Objek Sendiri (Inventory)
Untuk fitur kompleks seperti inventory (daftar barang), class sangat berguna. Contoh sederhana sistem item:
init python:
class Item:
def __init__(self, nama, deskripsi):
self.nama = nama
self.deskripsi = deskripsi
# buat daftar inventory
default inventory = []
label start:
$ inventory.append(Item("Surat", "Surat dari ibu Andi"))
"Kamu mendapatkan sebuah Surat."
"Isi tasmu sekarang: [len(inventory)] barang."
4Logika Kondisi Kompleks
Gabungkan beberapa variabel untuk ending yang lebih bernuansa — misalnya good ending sejati hanya terbuka jika DUA syarat terpenuhi.
label cek_ending:
if poin >= 5 and sudah_minta_maaf and not pernah_bohong:
jump ending_sejati # syarat ketat: ending terbaik
elif poin >= 1:
jump ending_baik
else:
jump ending_buruk
if poin >= 5 and sudah_minta_maaf: dijalankan jika?- Buat 1 fungsi dengan
init python:(mis. menghitung level/gelar dari poin). - Panggil fungsi itu di cerita & tampilkan hasilnya.
- Buat 1 ending dengan kondisi kompleks (
and/orminimal 2 variabel). - Tantangan (lanjutan): buat sistem inventory sederhana dengan
class.
Build & Distribusi Game
Garis finis! Mengubah folder proyek menjadi aplikasi nyata: file .exe untuk PC dan .apk untuk Android yang bisa dibagikan ke siapa saja.
"Karya yang tersimpan di laptop sendiri belum benar-benar 'lahir'. Hari ini kita kemas game kalian jadi aplikasi yang bisa diinstal teman, keluarga, siapa pun. Inilah momen kalian menjadi developer sungguhan."
1Persiapan Sebelum Build
Jangan langsung build. Bersihkan dulu agar hasil rilis bebas error:
- Jalankan LintLauncher → "Check script (Lint)". Pastikan TIDAK ada error merah.
- Uji semua rute & endingMainkan setiap percabangan sampai selesai. Pastikan tidak ada gambar/suara yang hilang.
- Isi informasi gameLauncher → "Options" → atur nama game & versi (mis. 1.0).
- Siapkan ikon (opsional)Ganti
icon.icodi folder game dengan logo karyamu.
2Build untuk PC (Windows / Mac / Linux)
1. Buka Ren'Py Launcher 2. Pilih proyekmu 3. Klik "Build Distributions" 4. Centang: Windows, Mac, Linux (sesuai kebutuhan) 5. Klik "Build" 6. Tunggu... hasil ada di folder proyek (file .zip per platform)
.exe (Windows) lengkap dengan semua aset. Penerima cukup ekstrak & jalankan — tidak perlu menginstal Ren'Py. Game-mu mandiri sepenuhnya.3Build untuk Android (.apk)
Ren'Py bisa menghasilkan APK Android. Butuh sekali setup awal (RAPT/Android SDK), lalu seterusnya tinggal klik.
- Install Android supportLauncher → "Android" → ikuti wizard untuk mengunduh komponen Android (sekali saja, butuh internet).
- KonfigurasiIsi nama paket (mis.
com.namamu.gameku) & ikon. - Build APKKlik "Build" → pilih Universal APK. Tunggu proses (bisa beberapa menit).
- Transfer ke HPPindahkan file
.apkke HP Android, install (izinkan "sumber tidak dikenal"), mainkan!
4Checklist Rilis Final
- Build game-mu menjadi distribusi PC (
.exe). - Build versi Android (
.apk) & uji di HP. - Lengkapi semua checklist rilis final.
- Kumpulkan sesuai format penamaan & email (lihat halaman Proyek Akhir).
Bank Prompt AI
Kumpulan prompt siap pakai untuk seluruh proyek — karakter, latar, audio, hingga debugging. Salin, sesuaikan kata di dalam kurung, dan tempel ke AI pilihanmu.
AKarakter (P3)
BBackground (P5)
CAudio (P7)
DCerita & Premis (P2)
EDebugging & Belajar Mandiri
Checklist & Format Proyek Akhir
Satu halaman rangkuman untuk memastikan proyekmu lengkap, rapi, & dikumpulkan dengan benar. Cek semuanya sebelum mengirim.
"Karya hebat yang dikumpulkan asal-asalan akan kehilangan nilainya. Rapikan, beri nama dengan benar, dan kirim sesuai aturan. Profesionalisme dimulai dari hal kecil seperti ini."
1Checklist MVP Wajib
Proyek akhir minimal harus memenuhi semua poin ini agar lulus standar:
2Format Penamaan Folder
Kompres seluruh folder proyek menjadi ZIP, lalu beri nama dengan format berikut (tanpa spasi, gunakan garis bawah):
VN_Multimedia_[NIM]_[NamaLengkap].zip Contoh: VN_Multimedia_2021010101_BudiSantoso.zip
game/ beserta semua aset gambar & audio) DAN hasil build (file .exe / .apk). Tanpa folder aset, game tidak bisa dijalankan ulang oleh penilai.3Cara Mengumpulkan
- Rapikan folder proyekPastikan semua gambar di
game/images/& audio digame/audio/. - Build distribusi finalHasilkan minimal versi PC (.exe). Android (.apk) sebagai nilai tambah.
- Kompres jadi ZIPBeri nama sesuai format
VN_Multimedia_NIM_Nama.zip. - Kirim via emailJika file besar, unggah ke Google Drive lalu kirim TAUTAN-nya (set akses: siapa saja yang punya link).
4Kontak Dosen
Klik tombol di bawah untuk membuat laporan progres belajarmu — berisi checklist MVP, pertemuan yang selesai, dan riwayat kunjungan. Laporan terbuka di tab baru dan bisa disimpan sebagai PDF via browser (Ctrl+P / Cmd+P).
Progress tersimpan otomatis di browser ini (localStorage). Setiap mahasiswa menyimpan data masing-masing.