Kategori
Devlog/Studlog

Best Practices Need Practices (part 3)

“Studi literatur” terakhir sebelum benar-benar melakukan “practices”. Sudah kuterima saja kalau manualnya perlu dibaca berulang kali biar ngerti dan kalaupun sudah ngerti ada saja pemahaman yang berubah saat baca bagian lain.

Bab III: When to use scenes versus scripts

Aku belum sepenuhnya paham kenapa ada pertanyaan: “Pilih scene atau script?”. Mungkin karena di Godot kita bisa membuat scene yang merupakan instance dari tipe node tertentu, juga bisa membuat script dengan class_name yang keduanya dapat digunakan sebagai class. Namun, perbedaan keduanya cukup jelas bukan?

Secara umum, scene lebih cepat dan bagus performanya. Namun, script bisa bikin tipe node baru yang mempermudah pengembangan, khususnya kalau mau bikin tool internal atau plugin.

Kesimpulannya sih katanya begini:

  • Kalau perlu bikin tool internal atau plugin yang bakal dipake oleh non-programmer, bikin class pakai script.
  • Kalau perlu bikin suatu class atau konsep sistem yang cuma berlaku di game ini, bikin scene aja. Scene lebih mudah diedit dan lebih “secure”.

Selebihnya, hanya bisa dipahami dengan praktik. Mungkin belajar “best practices” dengan baca manual secara berurutan bukan cara terbaik. Nanti aku belajar bikin game jenis tertentu lewat ngikutin tutorial lalu dibandingkan dengan “best practices” aja.

Kategori
Devlog/Studlog

Best Practices Need Practices (part 2)

Masih melanjutkan materi tentang Scene organization, masih di bagian koneksi antar node.

Intinya ada dua:

  1. Seperti di postingan sebelumnya, usahain suatu scene atau script bisa berdiri sendiri tanpa perlu memiliki reference di luar scene nya. Ini dilakukan agar kalau ada perubahan di objek reference-nya, scene tersebut tidak terlalu terpengaruh. Kalau tidak memungkinkan, usahakan scene tersebut terhubung dengan scene lain secara anonim (pakai signal atau semacamnya) alias ‘loose-coupling’.
  2. Semua aturan Object Oriented Programming (OOP) berlaku pada scene dan script, termasuk:
    • SOLID, aturan-aturan biar kodenya rapih, fleksibel, dan gampang di -maintain (artinya lebih mudah buat diutak-atik). Bisa baca wikipedia buat penjelasannya, tapi kalau mau dengan contoh langsung, cek ini.
    • DRY, akronim dari “Don’t Repeat Yourself”. Intinya sebisa mungkin jangan nulis dua kode dengan fungsi yang sama.
    • KISS, alias “Keep It Simple, Stupid!”. Aku memahaminya sebagai: “Tulis kode yang bisa dipahami tanpa mikir”. Mungkin begitu.
    • YAGNI, akronim dari “You Aren’t Gonna Need It”. Tahan diri dari godaan buat nulis kode yang fungsinya belum dibutuhkan saat ini agar kodenya gak terlalu kompleks dan sulit di-maintain.

Bagian selanjutnya dari bab ini adalah tentang menentukan struktur SceneTree, atau hirarki node dalam game. Sebaiknya saya tuliskan berurutan:

  1. Buat sebuah node “Main” dengan script (misalnya main.gd). Ini akan menjadi “entry point” atau titik awal saat kita mau mulai menelusuri logika game. Node utama ini akan menjadi parent dari node lainnya seperti “World” dan “GUI”.
  2. Pergantian level atau layar dapat dilakukan dengan mengganti objek scene di bawah “World”. Dibanding bikin scene utama dan pindah-pindah ke scene lain saat ganti level, kita bisa punya kontrol lebih, seperti yang pernah saya lakukan di sini.
  3. Tentukan apakah suatu script atau scene menggunakan Autoload atau node biasa. Perhatikan bagaimana data di simpan dan dengan scene lain.
  4. Pastikan masing-masing subsistem punya tempat khusus di hirarki. Dengan kata lain, kelompokkan dengan rapih.
  5. Sebaiknya, hubungan parent-child ditentukan bukan karena relasi posisi (misal, child ngikutin posisi parent), tapi hubungan dependensi. Dengan kata lain, jadikan suatu node child atau parent hanya jika ia tidak akan berfungsi kecuali seperti itu. Ini dimaksudkan agar jika node diubah, parent atau childnya ga terpengaruh.
  6. Player sebaiknya juga tidak menjadi child dari suatu level. Tempatkan di posisi lain dalam hirarki.
  7. Jika posisi suatu node tergantung node lain, pakai RemoteTransform saja.

Meski sudah ditulis pun, sejujurnya saya kurang paham konsep-konsep di atas. Semuanya teori abstrak yang masih ambigu. Seperti ada rasa gatal untuk mempraktikkan atau memvisualisasikannya sebelum bisa paham.

Atau seperti tiba-tiba bahasa Inggrisku jadi payah dan kalimat-kalimat penjelasannya jadi sulit dipahami. Mungkin memang perlu mengenal dulu praktik-praktiknya baru bisa memahami “praktik terbaik”.

Jadi, sebaiknya memang saya mulai bikin proyek buat praktik teori-teori ini dulu. Mungkin satu bab lagi deh.

Kategori
Devlog/Studlog

Best Practices Need Practices (part 1)

Paska mengerjakan proyek di pelatihan Game Development Professional Program, saya menyadari bahwa untuk memahami teori-teori pemrograman yang baik memerlukan praktek dan pengalaman. Selain itu, saat membaca kriteria rekrutmen dalam iklan lowongan kerja, saya merasa bisa ngoding saja tidak cukup; harus paham tata cara pemrograman yang baik dan benar. Karenanya, saya terpikir, mungkin saya perlu belajar ‘best practices’. Dan karena aku masih ingin ngulik Godot, saya belajar dari sini.

Saya masih percaya kalau ‘praktik terbaik’ itu bukan segalanya. Ada yang bilang, kode pemrograman dengan praktik terbaik adalah: yang jalan. Namun, saya yakin bahwa menguasai ‘praktik terbaik’ bisa menjadi nilai tambah yang membuat kita dipandang lebih mampu bekerja dalam tim dan dalam proyek besar. Kebanyakan ‘praktik terbaik’ dibuat agar enak buat temen kerja. Meskipun solo, tata cara membuat kode yang baik, khususnya yang membuat kode bisa dipahami dan mudah dikembangkan sendiri adalah bentuk self-love yang sebaiknya dilakukan programmer.

Maka untuk beberapa hari ke depan, saya coba meringkas (sepahamnya) dan mempraktikkan satu per satu bab-bab dari manual ‘best practices’ Godot tersebut.

Bab I: Applying object-oriented principles in Godot

Scene dalam Godot adalah Class.

Itu saja yang benar-benar kupahami dari bagian itu. Namun, ini mengubah mindset saya yang menganggap scene di Godot itu ibarat scene dan prefab di Unity. Mungkin di class diagram, tiap blok class bisa dianggap scene. Setiap objek di hirarki dalam scene bisa dianggap sub-class yang diperlukan oleh method atau property dari class. Mindset ini perlu diuji.

Hal lain yang perlu diingat:

  • Node adalah instance dari tipe node (Node2D, Control, Button, dll.) yang juga merupakan class
  • Tiap membuat script dalam node, maka ia menjadi ekstensi (atau child?) dari class tipe node tersebut
Bab II: Scene organization

Saya baru baca bagian pertama yang menjelaskan tentang bagaimana hubungan antar node dilakukan. Pada dasarnya, mengulang tentang hal yang selalu saya ingat di Godot: Dari parent ke child pakai method, dari child ke parent pakai signal. Namun, selain itu ada beberapa cara spesifik yang menarik untuk diuji.

Sesuai dengan prinsip ‘loose coupling’, tiap class sebaiknya bisa digunakan tanpa dependensi. Bahkan, manual ini menyarankan agar tiap scene memuat data dan node yang diperlukan tanpa bergantung pada scene lain. Ini dilakukan agar programmer tidak perlu terlalu banyak bikin dokumentasi biar tidak lupa hubungan antar scene atau node. Agar tidak susah-susah seperti itu, disarankan juga pakai tool script seperti _get_configuration_warnings() yang dapat memberi tanda peringatan di samping node pada hirarki jika scene tidak merujuk pada node tipe tertentu.

Dan di sini saya mulai keluar jalur.

Karena tool script ini gak jalan, saya jadi cari-cari di dokumentasi dan juga googling. Susah dapat artikel yang membahas ini. Sampai akhirnya nemu video dari while(free) yang merupakan video kedua dari seri “Godot 4 Editor Scripting Series“. Playlist tersebut intinya membahas penggunaan @tool untuk memanipulasi inspector objek di editor Godot. Aku jadi tertarik meski tidak terlalu penting untuk saat ini.

Video kedua menjawab pertanyaan saya, namun tidak mungkin dipahami tanpa menonton video pertama. Video ketiga menunjukkan cara membuat dropdown menu seperti isian enum tapi menggunakan item-item dari array yang diinput dari inspector juga. Namun, pilihan dropdown menu itu hanya diperbaharui jika kita men-deselect node dan memilihnya lagi. Video keempat hasilnya kira-kira sama dengan video ketiga, tapi caranya lebih ribet tapi mungkin lebih terstruktur.

Belum kepikiran kapan aku akan mengimplementasikan teknik manipulasi editor ini, tapi mungkin saat diperlukan aku akan ingat video-video ini.

Kembali ke jalur.

Sebaiknya saya coba dulu mempraktikkan teori-teori di atas sebelum lanjut ke bagian berikutnya. Namun, aku sebaiknya juga menyelesaikan membaca Bab 2 ini.

Kategori
Devlog/Studlog Gaming Diary

Game Seed Asal Jadi – Gaming Diary #35

Secara nekat dan tidak terencana masak-masak, aku daftar Game Seed 2025 dan ikutan Game Jam-nya yang dimulai dari 25 Juli sampai 4 Agustus. Aku daftar sebagai solo developer, karena tahu kemampuanku yang belum bisa nge-carry orang lain malah bakal jadi beban.

Ga ada niat menang. Meski kadang ngayal bisa beruntung lolos ke tahap selanjutnya. Niatku hanya agar ada dorongan buat belajar: Deadline yang jelas dan sedikit arahan dari batasan tema. Aku juga bikin batasan sendiri dengan menetapkan kalau aku harus pakai 3D karena pingin belajar itu.

Tantangan pertama muncul dari bikin ide dari tema yang ditetapkan. Ada 3 tema: 1) Remake gameplay game lama, 2) Gabungin 2 genre, 3) Bikin game terinspirasi dari kehidupan. Aku cuma kepikiran tema yang pertama dengan coba bikin game beat-em-up ala Street of Rage (alias Bare Knuckle) tapi dibikin 3D. Sudah kebayang sih ini bakal susah, tapi daripada mikir terus ga mula-mulai, jadi aku hajar saja. Tentu, setelah jalan, ini lebih-lebih-lebih susah daripada yang dibayangkan.

Setidaknya ada arahan, sih. Di akhir menjelang deadline, aku mulai kepikiran konsep yang bisa dieksekusi berdasarkan aset yang tersedia, kemampuan, dan batas waktu. Seenggaknya, bisa bikin sesuatu yang bisa dimainin dan ada kondisi selesainya. Akhirnya jadilah Baaaaare Knuckle, game 3D beat-em-up dan pemain menghajar penghalang berupa balok-balok baja hingga mencapai bos terakhir: Pocong Hitler.

Shoutout buat Tirto Suwondo yang menyediakan model pocong 3D di Sketchfab.

Melihat game-game yang dibikin orang lain di game jam ini, membuatku makin pasrah. Bukan soal memenangkan game jam-nya, tapi juga soal menjadi game developer. Aku ngerasa ga punya keunikan atau kemampuan yang bisa membuatku menonjol di antara ratusan game developer yang muncul tiap tahunnya. Tapi, eh, bodo amat lah.

Gamenya, kalau bisa dibilang game, bisa dimainkan di Itch.io dan dijalankan di web, karena lupa upload file .pck yang harusnya di-zip bareng file .exe nya dan ga bisa edit lagi lewat deadline. Eh, sudahlah.

Pelajaran:

  • Yup, ikut game jam, apalagi yang online, ga perlu jago. Kalau persyaratannya ga terlalu strict, bisa jadi motivasi belajar. Kasian jurinya sih jadi kudu ngekurasi kiriman ‘sampah’, tapi di sisi aku pribadi, yang penting memanfaatkan motivasi yang muncul karena ikut game jam untuk berusaha sebaik mungkin.
  • Mikir sendirian itu susah. Lol. Ngonsep di awal itu penting buat acuan atau arahan pas bikin game. Namun, terlebih kalau solo, biarkan konsep itu berkembang dengan sendirinya sesuai dengan kondisi dan batasan yang ada.
  • Laman game kita di Itch.io bisa dihias. Baru tahu. Bahkan untuk nampilin screenshot perlu setting sendiri.
  • Cek proyek-proyek lain yang sudah kamu kerjain buat nyari ide dan bantuan! Kemarin aku agak panik dan terlalu fokus buat belajar 3D sehingga males buat ngecek. Apalagi ngecek kodingan yang di Godot jadi perlu buka 2 project bersamaan buat liat konteksnya. Agak berat, tapi setelah lihat proyek 1 Day 1 Tutorial yang aku kerjain di bulan Maret, kedepannya harus aku lakukan.

Meski jadinya ngasal, aku tetap coba share. Sudah susah-susah kok disimpan sendiri UwU.

Sekarang aku lagi ikutan Untitled Game Jam #114 – itch.io. Aku ga tahu ini legit atau ga, tapi timeline nya pas sebelum mulai Brackeys Game Jam 2025.2 – itch.io jadi… cobain aja. Semoga ide dan eksekusinya lebih mantap. Eh, semoga gamenya selesai.

Kategori
Devlog/Studlog Gaming Diary

Ulik Unreal – Gaming Diary #34

Habis ngikutin workshop bikin efek cel-shading di Unreal, aku masih kesulitan memahami cara kerjanya dan menjelaskan hasilnya. Jadi, aku mau cerita soal Unreal-nya saja. Ini bukan pertama kali aku mencoba Unreal, tapi ini pertama kalinya ikut workshop Unreal dan niat buat beresin tugasnya. Workshop kalau berbayar memang jadi lebih niat diikutin.

Fitur di Unreal ini sangat buanyak dan tersebar dalam UI yang sulit diikuti kalau baru mulai. Ibaratnya masuk ke belantara yang dipenuhi keanekaragaman hayati. Memang banyak manfaat, tapi bisa bikin kita bingung dan tersesat. Satu-satunya hal yang menghentikan kebingungan saat lihat UI-nya adalah saat engine-nya crash dan force closed. Yup, sangat berat dan banyak makan kapasitas memori serta CPU.

Namun, dengan panduan yang baik dan tujuan yang jelas, kita bisa menjelajahi belantara ini. Ibaratnya, kita harus datang dengan tujuan. Misalnya cari jamur. Maka, tinggal ikuti instruksi, kita bisa menemukan jamur tanpa perlu peduli soal hewan atau tanaman lain di sekitar. Kalau kamu ingin melakukan manipulasi material objek agar menjadi stylized dengan efek cel-shading, misalnya, maka tinggal cari panduannya di internet (atau lewat bantuan temen), ikuti instruksinya, maka kamu bisa lebih mudah bernavigasi di belantara UI dan fitur hingga mencapai hasil yang diinginkan.

Hal lain yang ingin kukomentari adalah blueprints, yang dibilang no-code programming language. Pada workshop ini, aku diajari menggunakan blueprints untuk mengubah tekstur pada objek 3D. Aku kurang paham sebenarnya bagaimana blueprints ini bisa mengubah tekstur material. Ini tidak dijelaskan oleh pemateri (atau dijelasin saat aku tidak fokus), tapi yang kupahami, ini mirip seperti pemrograman shader pakai OpenGL yang dulu kucoba di Godot. Kalau di shader, ada bagian code yang mengubah warna pixel dan posisinya. Di blueprints ini aku belum paham bagian mana yang kira-kira mirip seperti itu.

Blueprints memang memudahkan dalam hal menghindari eror karena typo dan memperjelas penggambaran proses alur algoritma (kalau dibikin rapih). Namun, ga bisa salin-tempel kode, jadi sepertinya kurang fleksibel.

Aku cukup puas dengan hasil workshop yang kulakukan, meski rasanya bisa di-tweak lebih bagus. Efek cel-shading yang kuhasilkan sudah punya rim light dan outline yang berubah sesuai sudut pandang kamera dan arah sumber cahaya. Namun, mengubah warna tekstur menjadi flat dengan beberapa level shade yang berbeda masih kurang dan sepertinya perlu ngulik teksturnya. Sepertinya dalam bikin style visual apapun, aset tekstur, material, dan mesh perlu diulik dan disesuaikan.

Secara umum, aku merasa kalau bikin game pake Unreal tidak bisa sendirian. Engine ini seperti dibuat untuk tim yang mengerjakan bagian-bagian berbeda dari visual, game design, dan logic dalam satu engine yang sama. Aku masih berharap sempat belajar Unreal buat melanjutkan karir. Meskipun begitu, saat ini sepertinya masih Godot dulu.

Kategori
Devlog/Studlog

1 Hari 1 Tutorial: Hari 31 – Splash Screen Manager

Untuk yang terakhir ini tadinya mau curang dengan pilih tutorial super singkat; cuma ngilangin splash screen. Lagian lagi sibuk lebaran.

Tapi rasanya terlalu singkat dan ternyata ga ngilangin splash screen/pre-loader Godot Engine saat export HTML. Jadinya ngikutin tutorial splash screen manager ini.

Kelihatannya akan berguna kalau kita perlu nampilin banyak splash screen statis yang bisa di-skip pakai input keyboard (dan aku tambahin input mouse juga). Seenggaknya, tutorial ini nunjukin beberapa node yang jarang aku pakai dan fungsi-fungsi tween yang belum aku tahu.

Sedikit tambahan, fungsi _unhandled_input(event) hanya bisa deteksi input keyboard. Entah memang begitu perilakunya atau ada yang perlu di-setting. Kalau diganti jadi _input(event) kita bisa deteksi input tombol mouse.

Aku juga baru nyadar kalau gambarnya agak jagged atau pecah. Entah kenapa. Mungkin karena resize. Kemaren-kemaren rasanya dapat masalah yang sama, tapi rasanya masalahnya beda (dan lupa solusinya). Tapi, sudahlah.

Oke, ini hari terakhir. Lalu apa? Bikin proyek harian dalam kurun waktu seperti ini buatku sudah tidak asing, dan sejauh ini aku selalu berhasil melakukannya. Kurang lebih. Rasanya aku sudah meyakinkan diri bahwa aku bisa konsisten melakukan sesuatu yang rutin dalam jangka waktu tertentu. Mungkin kalau lebih lama lagi lain cerita.

Namun, tantangan yang jarang aku berhasil taklukkan adalah: konsisten menyelesaikan 1 proyek mengikuti timeline. Mungkin kedepannya itu yang harus aku lakukan. Seperti membuat target menyelesaikan game dalam 1 minggu atau 1 bulan dengan GDD dan sebagainya. Ya, sepertinya itu yang akan aku coba.

Akhir kata, taqbbalallahu minnaa wa minkum shiyaamanaa wa shiyaamakum. Semoga shaum kita sebulan terakhir ini diterima. Semoga tutorial-tutorial yang sudah dikerjakan ini tetap diterima di kepala (halah).

Github: OneDay-OneTut: Latihan ngerjain 1 tutorial Godot tiap hari selama bulan Maret

Asset: Kenney Topdown Shooter (pixel) Pack

Kategori
Devlog/Studlog

1 Hari 1 Tutorial: Hari 30 – SoftBody2D Plugin

Tiba-tiba muncul tutorial buat plugin yang bisa bikin objek physics yang bouncy kayak jelly. Kalau ga salah ini bikinan developer game yang pake mekanik softbody gitu dan ngebagiin hasil kerjaannya sebagai plugin. Menarik sih. Seenggaknya ini bisa jadi tutorial pake plugin yang seharusnya bakal sering dilakukan dalam development game.

Hmm… agak sulit dibikin bagus. Yang pertama harus diperhatikan adalah tutorial ini ternyata agak jadul. Plugin SoftBody2D bisa didownload dari AssetLib di editor Godot dan sekarang sudah versi 1.7. Yang di tutorial masih versi 1.4. Jadi apa yang ditunjukin di tutorial kadang ga ngefek atau sesuai di prakteknya.

Beberapa hal yang saya temukan:

  • Texture hanya bisa pakai ImageTexture. Ga bisa pake Atlas. Btw exclude texture untuk bikin objek bolong memerlukan ImageTexture yang ukurannya sama dengan texture utama, tapi hanya menampilkan bagian yang dilubanginya saja. Usahakan ukuran sprite sudah sesuai dengan ukuran objek yang akan dipakai (jangan resize/rescale).
  • SoftBody ini pada dasarnya satu objek dipecah jadi beberapa segmen Rigidbody yang dihubungkan pakai berbagai joint (cek tutorial hari 13). Jadi seberapa bouncy objeknya dan seberapa bagus objeknya kalau bisa rusak/patah, tergantung dari jumlah segmen-segmen tersebut. Ini diatur di properti Vertex Interval di inspector node SoftBody; semakin besar nilainya, semakin sedikit jumlah segmennya, dan akan terlihat semakin padat. Perlu perhatikan juga ukuran objeknya. Btw sepertinya plugin ini lebih optimal pada objek berukuran kecil.
  • Fitur Pickable Rigidbody agak glitchy. Kalau mau pake, coba banyakin segmennya.
  • Tidak seperti yang disebut tutorial, Breakable Object tidak pakai material, tapi dengan ubah properti SoftBody2D > Joint > Break Distance Ratio. Atur-atur biar terlihat bagus.
  • Ngubah nama node bikin error. Seperti segmennya kehilangan reference ke parent node. Setiap ubah nama, coba ubah nilai Vertex Interval.
  • Untuk bikin platform polygon seperti di tutorial, bikin StaticBody2D, lalu kasih child CollisionPolygon2D dan kasih child Polygon 2D. Gambar platformnya di Polygon2D. Kalau sudah, cek inspector di node Polygon2D > Data > Polygon. Klik kanan di nama properti tersebut dan pilih ‘copy value’. Pilih node CollisionPolygon2D, di inspektor bagian Polygon, klik kanan, dan pilih paste value. Harusnya collision yang bentuknya sama .

Selebihnya sih, mending ikutin tutorial di sini: Getting Started | SoftBody2D .. yang baru aku temukan pas lagi ngetik ini.

Yah, ini kasus salah pilih tutorial tapi nanggung udah ngerjain.

Github: OneDay-OneTut: Latihan ngerjain 1 tutorial Godot tiap hari selama bulan Maret

Asset:
– Kenney Donuts Pack
– Kenney Jumper Pack

Kategori
Devlog/Studlog

1 Hari 1 Tutorial: Hari 29 – Light and Shadow

Tutorial kali ini cukup singkat dan to the point. Ngebahas lagi soal PointLight2D, tapi kali ini pake efek shadow dari node ini. Ditambah dengan LightOcclusion2D dan Occlusion Layer pada Tilemap Layer (di tutorial masih pake Tile Map, tapi sama saja), kita bisa bikin efek bayangan yang cukup oke dengan mudah.

Aku pingin pake proyek baru dari nol untuk ini biar bisa pake aset-aset yang lebih cocok. Juga nambahin karakter yang nanti dikasih LightPoint2D sehingga jadi kayak bawa senter. Bentuk cahayanya ga oke sih karena males bikin tekstur sendiri, tapi cukup okelah.

Di sini aku juga baru tahu ada node Canvas Modulate yang ngubah warna seluruh layar buat ngasih kesan gelap atau malam yang kayaknya lebih baik daripada pake DirectionalLight2D waktu kemaren-kemaren. Di tutorial ini juga pake World Environment yang aku masih belum terlalu ngerti cara makenya (ngubah-ngubah slidernya ga banyak ngasih efek).

Yang agak kurang memuaskan, dengan teknik pake 2 PointLight2D pada tutorial, kita bisa memberi bayangan pada objek tapi juga tetap menyinari objek sehingga kelihatan. Masalahnya, kalau masuk ke ruangan atau objek yang dibatasi tembok, salah satu PointLight2D yang dipake buat menyinari objek bakal menyinari objek di luar tembok juga.

Mungkin ada teknik lain biar bisa begitu. Mungkin pakai properti height atau pakai OcclusionLayer tambahan. Perlu cari tutorialnya. Penasaran.

Github: OneDay-OneTut: Latihan ngerjain 1 tutorial Godot tiap hari selama bulan Maret

Asset: Kenney Topdown Shooter (pixel) Pack

Kategori
Devlog/Studlog

1 Hari 1 Tutorial: Hari 28 – Unique Card and Flip

Ga ngelanjutin dulu soal game programming pattern. Soal implementasi singleton dan observer di Godot sudah cukup mudah dan sering aku pakai, meski definisi dan konsep dasarnya masih banyak yang kurang aku pahami. Sedangkan soal state pattern bakal lama implementasinya di proyek yang sudah ada (pingin ada waktu buat ngerjain yang lain, seperti beli baju lebaran hehe). Plus, pingin beres sebelum Jumatan. Jadinya balik lagi ke seri tutorial bikin game kartu.

Ga ngenalin fitur baru, tapi beberapa trik yang dipakai cukup baru buat saya. Hanya saja memang cara penulisan kodenya mungkin bukan best practice. Atau seenggaknya ga cocok aja. Misalnya, aku lebih cocok buat bikin reference untuk akses child node dari suatu scene daripada pakai get_node(). Dan, setelah kemarin ngerjain command pattern kerasa banget enaknya ngedeklarasiin script sebagai class pakai class_name, yang jarang dipakai di tutorial ini.

Tutorialnya sendiri tidak ada masalah. Mungkin ada beberapa modifikasi yang kurasa bakal lebih bagus:

  • Kalau aset gambar kartu pakai AtlasTexture, bisa bikin masing-masing resourcenya dulu.
  • Kalau ingin animasi flip selesai pas kartu yang di-draw nyampe ‘player hand’, pas bikin animasi flip, bikin dengan durasi 1 detik, lalu saat manggil animasi di skrip deck.gd, ubah speed_scale dari Animation Player jadi 1/draw_speed yang sudah didefinisikan dari tutorial sebelumnya.
  • Ada baiknya saat nge-flip, saat animasi mencapai tengah-tengahnya, selain scale.x = 0.1, ubah juga scale.y menjadi sedikit lebih besar biar ada efek seperti kartunya keangkat waktu di-flip (dapet tips dari komen di YouTube tutorialnya).

Beberapa hal lain yang saya temukan:

  • Otakku hanya bisa melihat kalau kartunya nge-flip ke kiri ._. padahal kalau cuma di-stretch atau diubah scale-nya ga akan ada bedanya di-flip ke kiri atau kanan.
  • Nemu bug yang bikin kartu pindah ke belakang slot jika dilepas saat mouse di tengah slot. Mungkin gara-gara sistem drop di slot aku modifikasi kemaren. Tapi, ternyata kalau Collision Shape si kartu ga di-disabled saat habis dilepas, bugnya hilang. Tetep sih, collision-nya harus disabled agar tidak bisa di-klik saat kartu sudah masuk slot. Setelah diulik-ulik, akhirnya ubah collision_mask di Collision Shape-nya aja agar tidak kena Raycast dari mouse.

Gara-gara bug yang terakhir, ngerjain ini jadi nambah 1 jam lebih.

Github: OneDay-OneTut: Latihan ngerjain 1 tutorial Godot tiap hari selama bulan Maret

Asset: Kenney Playing Card Pack

Kategori
Devlog/Studlog

1 Hari 1 Tutorial: Hari 27 – Command Pattern

Ngerasa perlu lagi belajar teori-teori dasar dalam pemrograman, aku ngecek tutorial tentang command pattern. Kalau yang kupahami sih, ini adalah struktur pemrograman yang misahin fungsi pergerakan karakter (atau tipe fungsi lain untuk tipe objek lain) agar fungsi itu bisa dipake dengan input yang berbeda atau pada objek berbeda yang tipe atau class nya sama. Jadi, selama aku bisa bikin salah satu proyek yang kubikin kemarin dengan struktur command pattern, kuanggap beres deh.

Ternyata cukup mudah diikuti. Bedanya yang di tutorial dengan praktek-ku, di tutorial ada command buat attack, sedangkan di punyaku adanya command buat jump. Keduanya mirip, jadi implementasinya bisa tinggal jiplak dari tutorial.

Beda dengan tutorial, aku coba implementasi non-human controller (kurang tepat sih disebut AI controller), pada NPC alih-alih karakter player. Implementasinya sih tidak terlalu beda. Namun, memang sepertinya untuk pergerakan otomatis ini yang di tutorial masih terlalu kasar. Mungkin ada pola struktur yang tepat untuk jadi template pergerakan otomatis? Mungkin pakai Animation Player biar timing dan pengaturan posisinya lebih visual?

Di praktek-ku juga masih ada bug. Setelah lompatan NPC yang ketiga, seharusnya dia langsung diam. Namun, di sini dia seperti masih mau lompat karena sepertinya requirement jumlah loncat yang membatasi gerak loncat masih bisa lolos. Entahlah, yang penting ini sudah nunjukkin implementasi konsep command pattern sederhana.

Github: OneDay-OneTut: Latihan ngerjain 1 tutorial Godot tiap hari selama bulan Maret

Asset:
– Kenneys Pixel Platformer
– Kenneys Platformer Pack Industrial