Blog Metlivi

Cara Memisahkan Status Diam (Idle) dan Interaktif dalam Game Loop Hewan Peliharaan Virtual

Untuk game hewan peliharaan virtual, pisahkan jalur pembaruan antara perilaku otonom dan aksi pemain, lalu biarkan keduanya memodifikasi satu status hewan peliharaan bersama melalui transisi eksplisit. Perilaku diam (idle) harus berjalan berdasarkan waktu yang berlalu; perilaku interaktif harus merespons peristiwa input atau status input saat ini. Hal ini mempermudah proses jeda (pause), pengujian, dan mencegah animasi hewan peliharaan atau timer kebutuhan bertabrakan dengan perintah pemain.

15 Oktober 2026Waktu baca 6 mntOleh Metlivi Editorial Team
Bagian 1

Tentukan arti "diam" (idle) dan "interaktif"

Perlakukan hal ini sebagai mode perilaku, bukan berarti scene yang berbeda atau loop yang terpisah. Dalam status diam (idle), hewan peliharaan menjalankan rutinitasnya: memilih aksi sekitar (ambient) kecil, melanjutkan timer, atau memutar animasi nonesensial. Dalam status interaktif, game sedang menangani aksi yang disengaja seperti ketukan, seretan, atau perintah yang dipilih. Hewan peliharaan mungkin masih beranimasi selama interaksi; perbedaannya terletak pada sistem mana yang diizinkan untuk membuat keputusan dan mengubah status gameplay.

Mulailah dengan daftar singkat aksi yang dapat dilakukan pemain dan perilaku otonom yang dapat dilakukan hewan peliharaan. Tandai variabel status mana yang dapat diubah oleh masing-masing aksi tersebut. Misalnya, kedipan mata ambient mungkin hanya memengaruhi presentasi visual, sedangkan aksi bermain yang dipilih dapat mengubah aktivitas hewan peliharaan saat ini dan memulai timer. Peta kepemilikan sederhana ini membantu mendeteksi konflik sebelum kode menjadi semakin kompleks.

Bagian 2

Jaga agar loop luar independen dari perilaku hewan peliharaan

Callback frame dari engine harus mengoordinasikan pekerjaan, bukan menampung semua aturan hewan peliharaan. Urutan yang berguna adalah: kumpulkan input, terapkan perintah yang valid, jalankan simulasi, lalu render status terbaru. Pisahkan pengumpulan input dari simulasi agar ketukan tidak sengaja dianggap sebagai tick timer, dan jaga agar proses rendering bebas dari perubahan gameplay. Game Programming Patterns menggambarkan pemisahan ini sebagai pemrosesan input, pembaruan game, dan rendering dalam loop yang berulang; pembaruan fixed-step berguna ketika simulasi membutuhkan interval yang stabil. Game Loop, Game Programming Patterns

Untuk game web, requestAnimationFrame menjadwalkan pekerjaan sebelum pengecatan ulang (repaint) dan memberikan timestamp yang dapat Anda gunakan untuk mengukur waktu yang berlalu. Peramban umumnya menjeda callback ini pada tab yang tersembunyi, jadi jangan berasumsi bahwa callback tersebut terus berjalan sebagai jam dinding yang andal saat game berada di latar belakang. Window.requestAnimationFrame(), MDN

Bagian 3

Arahkan input pemain melalui perintah (commands)

Konversikan input mentah menjadi perintah kecil seperti start_play, stop_play, atau pet_tap. Handler perintah akan memeriksa apakah aksi tersebut valid untuk mode saat ini, memperbarui model bersama satu kali, dan memunculkan petunjuk presentasi yang dihasilkan. Ini mencegah penempatan logika aksi di callback tombol, callback animasi, dan rutinitas diam secara bersamaan.

Misalnya, jika pemain mengetuk saat hewan peliharaan sedang bermain, tentukan hasilnya secara sengaja: abaikan ketukan, pilih aktivitas lain, atau hentikan aktivitas. Hindari membiarkan pemilih idle dan handler ketukan menetapkan aktivitas baru secara bersamaan dalam pembaruan yang sama. Pada engine dengan propagasi event, tangani input gameplay pada tahap yang sesuai dan hormati konsumsi UI; dokumentasi Node Godot mencatat bahwa input yang belum tertangani (unhandled input) biasanya lebih cocok untuk gameplay ketika kontrol GUI membutuhkan prioritas. Node class, Godot documentation

Bagian 4

Jalankan waktu diam dengan jam yang jelas

Untuk perilaku yang harus berlangsung terus-menerus selama sesi yang terlihat, akumulasikan waktu simulasi yang telah berlalu dan picu keputusan idle saat intervalnya tercapai. Jangan menghitung frame: frekuensi frame bervariasi. Di Godot, _process(delta) menerima waktu sejak frame idle sebelumnya, sedangkan _physics_process(delta) mengikuti tick fisika; dokumentasi juga mencatat bahwa akumulasi delta dapat menyimpang dari detik di dunia nyata dalam beberapa kondisi. Node class, Godot documentation

Pilih jam sesuai dengan perilakunya. Gerakan kosmetik biasanya dapat menggunakan waktu frame yang berlalu. Gerakan yang berkaitan dengan tabrakan (collision) harus masuk dalam pembaruan fisika engine. Timer "pilih aksi ambient setiap beberapa detik" milik hewan peliharaan dapat menggunakan timer simulasi, tetapi putuskan apa yang terjadi setelah frame yang panjang atau jeda (pause): batasi jumlah waktu yang berlalu, lakukan satu keputusan, atau kejar ketertinggalan dalam langkah-langkah yang dibatasi. Pengejaran tanpa batas dapat membuat hewan peliharaan melompati banyak status ketika game dilanjutkan.

Bagian 5

Buat transisi mode secara eksplisit

Tuliskan tabel transisi kecil sebelum menambahkan lebih banyak status. Misalnya, idle → playing memulai aktivitas yang dipilih pemain; playing → idle terjadi saat aktivitas berakhir atau pemain membatalkannya; idle → resting dapat dipilih oleh rutinitas otonom. Tentukan efek masuk dan keluar di satu tempat, seperti memulai atau menghapus timer dan memilih animasi yang relevan. Jangan hanya mengandalkan penyelesaian animasi sebagai bukti bahwa mode gameplay telah berubah: pemutaran visual dapat terganggu atau dilewati.

Fungsi transisi harus memvalidasi mode saat ini, memperbarui model, dan mengembalikan hasil yang dapat ditampilkan oleh perender. Hal ini memisahkan "apa yang sedang dilakukan hewan peliharaan" dari "bagaimana aksi tersebut digambarkan." Ini juga memberikan target yang jelas untuk pengujian: kirim perintah, periksa mode yang dihasilkan, lalu verifikasi bahwa rutinitas diam tidak lagi menimpanya.

Bagian 6

Tentukan bagaimana waktu di latar belakang harus berperilaku

Ada dua kebijakan umum, dan pilihan yang tepat tergantung pada desain game. Hewan peliharaan yang hanya aktif selama sesi (session-only) dapat menghentikan simulasi saat ditangguhkan dan melanjutkan dari status sebelumnya. Game yang ditujukan agar timer terus berjalan saat ditutup harus mencatat referensi waktu dan merekonsiliasi waktu yang berlalu saat pemain kembali. Perlakukan hal itu sebagai perhitungan pelanjutan yang terpisah, alih-alih mencoba menjalankan loop frame di latar belakang; callback animasi browser mungkin dijeda untuk tab yang tersembunyi. Window.requestAnimationFrame(), MDN

Untuk hewan peliharaan sederhana, rekonsiliasi hanya nilai-nilai yang benar-benar harus berjalan—mungkin satu timer aktivitas—dan berikan batas atas yang wajar untuk mengejar ketertinggalan. Kemudian uji dengan menutup dan membukanya kembali setelah interval singkat maupun panjang. Pemilihan jam, perilaku penangguhan, dan batas pengejaran adalah keputusan desain; callback frame engine tidak memutuskannya untuk Anda.

Bagian 7

Periksa pembaruan yang saling bertabrakan dan input yang terlewat

Uji loop dengan beberapa skenario yang dapat diulang: biarkan game diam selama beberapa interval; berikan perintah tepat sebelum keputusan idle diambil; tahan atau ulangi input; jeda dan lanjutkan; serta picu aksi baru saat animasi masih diputar. Verifikasi bahwa setiap perintah mengubah model satu kali, logika idle tidak menggantikan status yang dipilih pemain, dan perilaku waktu yang berlalu sesuai dengan kebijakan jeda yang dipilih.

Jika menggunakan fixed update untuk simulasi, ingatlah bahwa fungsi tersebut dapat berjalan nol, satu, atau beberapa kali di antara frame yang dirender. Unity mendokumentasikan perilaku ini untuk FixedUpdate dan merekomendasikannya untuk perhitungan fisika; input dan pembaruan visual memiliki pertimbangan timing yang berbeda. FixedUpdate(), Unity documentation Sistem Input Unity juga mengantrekan event perangkat dan memprosesnya sesuai dengan mode pembaruan yang dikonfigurasi, jadi selaraskan penanganan input dengan loop yang mengonsumsi perintah tersebut. Input event queue, Unity Input System

Bagian 8

Pemisahan praktis yang perlu dipertahankan

Pertahankan arsitektur tetap ringkas: satu model hewan peliharaan bersama, satu jalur input-ke-perintah, satu pembaruan perilaku idle, satu fungsi transisi eksplisit, dan satu perender yang membaca model. Tambahkan langkah simulasi tetap (fixed simulation step) hanya ketika perilaku yang sensitif terhadap waktu membutuhkannya; jangan membuat setiap animasi atau pilihan ambient bergantung pada tick fisika. Saat bug muncul, periksa siapa yang terakhir mengubah mode dan jam mana yang menjalankannya. Hal ini memberikan tugas yang jelas pada setiap pembaruan dan membuat perilaku diam maupun interaktif dapat diprediksi seiring bertambahnya aksi hewan peliharaan.

Bagian 9

Sumber

Bacaan terkait

Lanjutkan topik ini