Game Webcam: Cara Saya Membuat Game Lari dari Dinosaurus
Saya ingin membuat game lari yang tidak menganggap pencet tombol sebagai berlari. Kalau pemain berhenti bergerak, karakternya harus ikut berhenti. Kalau pemain menemukan tenaga tambahan, pelarian harus terasa lebih ringan. Dan kalau mereka cuma melambai-lambai ke kamera, game harus tahu bedanya.
Ide itu jadi Dino Survival, game browser tempat kamu berlari di tempat untuk kabur dari T-Rex. Ditulis dalam satu kalimat, kedengarannya enteng. Padahal membuatnya berarti menjawab pertanyaan yang jauh lebih sulit: bagaimana caranya webcam mengubah tubuh yang bergerak menjadi controller yang terasa adil?
Kenapa game webcam butuh controller yang lain
Kebanyakan game endless runner menyederhanakan gerakan menjadi tombol, usapan layar, atau kecepatan maju otomatis. Itu praktis karena inputnya pasti. Tombol cuma punya dua keadaan: ditekan atau dilepas.
Tubuh jauh lebih berantakan. Tinggi badan, ukuran ruangan, sudut kamera, dan gaya lari tiap orang berbeda. Lutut bisa hilang dari bawah frame, pakaian bisa menutupi sendi, dan kamera di tempat remang bisa membuat titik tubuh bergoyang walau orangnya berdiri diam.
Jadi saya tidak bisa begitu saja memetakan satu pose ke satu kecepatan. Saya butuh alur yang mengamati gerakan dari waktu ke waktu, menepis noise, dan tetap bereaksi cukup cepat supaya terasa nyambung:
- Minta izin akses kamera ke browser.
- Perkirakan titik-titik tubuh di setiap frame video.
- Ukur gerakan kaki yang bergantian dan gerakan seluruh tubuh.
- Ubah langkah per menit terbaru menjadi tempo game yang stabil.
- Pakai tempo itu untuk menggerakkan pelari dan mengubah jarak ke dinosaurus.
Izin kamera diurus browser lewat MediaDevices.getUserMedia(). Dino Survival hanya meminta video dan memakai kamera depan kalau ada. Frame langsungnya lalu diproses model pose di browser.
Titik pose belum tentu berarti berlari
Dino Survival memakai MediaPipe Pose Landmarker dalam mode video. Modelnya bisa mengembalikan 33 titik tubuh, tapi data yang lebih banyak tidak otomatis membuat controller game lebih bagus.
Untuk cadence, saya hanya memperhatikan sekelompok kecil titik: bahu, pinggul, lutut, dan pergelangan kaki. Bahu dan pinggul memberi gambaran kasar sumbu badan, sedangkan lutut dan pergelangan kaki menunjukkan bagaimana kaki bergerak terhadap sumbu itu.
Ukuran relatif ini penting. Kalau saya hanya mengukur setinggi apa lutut tampak di layar, ponsel yang miring atau pemain yang berdiri tidak di tengah bisa mengubah hasilnya. Dengan memproyeksikan gerakan kaki sepanjang sumbu badan pemain sendiri, detektor jadi tidak terlalu bergantung pada cara kamera dipasang.
Game juga memeriksa apakah kedua pinggul dan kedua lutut terlihat. Kalau tidak, game meminta kamu mundur, bukan diam-diam mengarang tempo dari data yang tidak lengkap. Di game kendali gerak, umpan balik yang jujur lebih baik daripada berpura-pura inputnya bisa dipercaya.
Mengubah kaki yang bergantian menjadi cadence
Lari di tempat menciptakan pola yang berulang. Satu lutut naik, mencapai puncak, lalu turun. Kemudian kaki yang satunya melakukan hal yang sama. Detektor mengamati gerakan lutut dan pergelangan kaki, lalu mencari puncak-puncak bergantian itu.
Saya memakai ambang adaptif untuk tiap kaki, karena satu angka tetap tidak cocok untuk semua tubuh dan semua kamera. Pemain yang tinggi bisa menghasilkan gerakan jauh lebih besar di layar daripada pemain yang lebih pendek dan berdiri lebih jauh. Detektor mempelajari rentang lokal yang berguna, sementara batas atas yang tegas menjaga penyesuaian itu agar tidak terlalu longgar.
Setelah satu puncak valid, kaki yang sama masuk masa refrakter singkat 130 milidetik. Tujuannya agar getaran titik tubuh di sekitar puncak angkatan lutut tidak berubah jadi dua atau tiga langkah khayalan. Langkah yang valid masuk ke jendela tiga detik yang terus bergeser: cukup panjang untuk menghaluskan angka, tapi cukup pendek untuk menangkap perubahan usaha yang nyata.
Kalau tidak ada langkah selama sekitar 1,1 detik, cadence langsung kembali ke idle. Saya lebih suka reset yang tegas ini daripada penurunan pelan yang berlarut-larut. Begitu pemain berhenti, game harus berhenti.
Supaya lambaian tangan tidak jadi sprint
Sistem gerak generasi awal sering memberi hadiah untuk aktivitas apa pun di dalam frame. Akibatnya ada jalan pintas yang jelas: diamkan kaki, gerakkan tangan. Guncangan kamera pun bisa dikira olahraga.
Dino Survival menambahkan gerbang kedua berdasarkan pinggul. Gerbang ini mencari pantulan tubuh vertikal yang asli dalam jendela waktu singkat. Cadence baru dihitung kalau pola kaki yang bergantian dan sinyal gerakan tubuh yang lebih besar ini sama-sama setuju.
Ini bukan upaya menilai bentuk lari siapa pun. Saya hanya meminta bukti bahwa tubuh bagian bawahlah yang bekerja. Gerakan lengan saja tidak membuka gerbang, dan noise kecil dari estimasi pose tidak membuat pelari maju.
Ini salah satu pelajaran terbesar saya saat membuat game webcam: input yang bagus bukan soal mendeteksi gerakan sebanyak mungkin, melainkan mendeteksi gerakan yang tepat dan menjelaskan dengan jelas saat kamera tidak bisa melihatnya.
Dari langkah per menit jadi kejar-kejaran dengan dinosaurus
Detektor cadence menghasilkan langkah per menit, tapi game tidak butuh ukuran selevel laboratorium. Yang dibutuhkan adalah sinyal yang jelas dan enak dimainkan. Hasilnya saya petakan ke tiga rentang usaha yang gampang dipahami: jogging sekitar 70 langkah per menit, lari 120, dan sprint 160.
Rentang itu menjadi tempo yang dinormalisasi. Mesin survival memakai tempo tersebut untuk memajukan pemain menuju target pelarian sejauh 50 unit. Sementara itu, dinosaurus punya kecepatannya sendiri yang terus naik selama lari.
Jarak berubah sesuai selisih kedua kecepatan itu. Lari lebih kencang dari dinosaurus, dan kamu menciptakan ruang. Mengendur sedikit, dan ia mulai mendekat. Sampai ke jip berarti kamu lolos. Biarkan jaraknya habis, dan kejaran pun selesai.
Bagian inilah yang membuat game ini terasa lain dari game lari dinosaurus biasa. Dinosaurusnya bukan sekadar timer bergigi, melainkan penjelasan visual tentang seberapa keras kamu berusaha saat ini.
Dunia hanya bergerak kalau kamu bergerak
Jalurnya dibuat dari rangkaian frame hutan. Saya membaca frame itu berdasarkan jarak yang terkumpul, bukan waktu jam. Kalau kamu berhenti berlari, lingkungan membeku. Mulai lagi, dan jalur kembali bergulir di bawah kaki pelari.
Ukuran dan posisi dinosaurus yang tampak terikat pada jarak. Makin dekat, makin besar bagian layar yang ia isi. Debu, garis kecepatan, dan tampilan tempo menyampaikan pesan yang sama. Beberapa petunjuk kecil itu menjawab satu pertanyaan: aku berhasil kabur nggak?
Putaran render memakai requestAnimationFrame(), yang meminta browser menjalankan pekerjaan animasi sebelum penggambaran ulang berikutnya. Saya memakai timestamp dari callback untuk menghitung waktu yang berlalu, jadi gerakan didasarkan pada waktu, bukan pada anggapan bahwa semua perangkat menggambar jumlah frame per detik yang sama.
Saya juga memakai pelari yang sudah dirender lebih dulu, bukan memotong sosok pemain secara langsung ke dalam adegan di tiap frame. Pilihan ini mengurangi beban pemrosesan visual di perangkat mobile dan memberi game karakter yang konsisten. Webcam adalah controller, bukan karya seni akhirnya.
Kenapa kalibrasi adalah bagian dari desain game
Pengaturan kamera bukan layar teknis yang bisa saya sembunyikan dari pemain. Ia adalah level pertama.
Dino Survival menampilkan panduan framing dan menunggu sampai titik tubuh yang diperlukan terlihat. Game menjelaskan kapan kamu harus mundur, lalu memberi hitung mundur singkat sebelum kejaran dimulai. Momen itu menetapkan kesepakatannya: jaga tubuh bagian bawah tetap terlihat, berlari di tempat, dan game akan mengikuti.
Ada juga mode demo keyboard. Dengan mode ini, orang bisa menjajal game tanpa izin kamera, mencobanya di perangkat yang tidak didukung, atau sekadar memahami aturannya dulu. Pengalaman penuhnya tetap versi kamera, karena hubungan fisik antara usaha dan pelarian itulah intinya.
Yang saya pelajari dari membuat Dino Survival
Bagian tersulitnya bukan menggambar T-Rex, melainkan memutuskan apa yang dihitung sebagai satu langkah.
Controller tubuh yang andal butuh beberapa pemeriksaan sederhana yang bekerja bersama. Titik tubuh menentukan di mana posisi badan. Puncak lutut dan pergelangan kaki yang bergantian menunjukkan cadence. Gerakan pinggul memastikan pemain benar-benar berlari. Jendela yang bergeser menghaluskan hasilnya. Reset idle yang cepat menjaga agar berhenti tetap jujur. Lalu mesin game mengubah sinyal itu menjadi jarak yang bisa dimengerti pemain tanpa membaca buku petunjuk.
Itulah daya tarik kendali gerak berbasis browser bagi saya. Kalau umpan baliknya pas, teknologinya seolah menghilang. Kamu tidak memikirkan titik tubuh, ambang batas, atau timestamp frame. Kamu cuma melihat dinosaurus, mendengarnya makin dekat, dan berlari.
Kalau ingin tahu sisi desain dan risetnya, baca kenapa menurut saya Dino Survival adalah game olahraga yang tepat.
Kamu bisa memainkan Dino Survival gratis di browser. Tanpa download. Kalau penasaran bagaimana alur webcam yang sama menangani gerakan tubuh bagian atas, baca cara saya membuat Monster Punch sebagai game tinju online. Dan untuk game lain yang bisa langsung dimainkan, lihat panduan saya tentang game gratis tanpa download.