Bagaimana cara menangani platform bergerak dalam game platform?


15

Saya tidak ingin menggunakan box2d atau apa pun, saya hanya ingin platform bergerak sederhana (atas-bawah, kiri-kanan, jalur diagonal dan melingkar). Pertanyaan saya adalah menangani hierarki urutan pembaruan / kontrol agar pemain tetap terpaku pada platform dengan kokoh, tanpa memantul atau goyah?

Jawaban:


16

Solusi saya adalah memperlakukan setiap entitas fisik di peta permainan sebagai simpul pohon , dan peta itu sendiri sebagai simpul akar . Node dapat berisi node lain. Setiap node terkandung (langsung atau tidak langsung) di dalam node peta.

Misalnya, katakanlah karakter Anda berdiri di atas platform. Node platform berisi node karakter. Jadi, setiap kali platform bergerak, node yang dikandungnya (dalam hal ini karakter) akan bergerak juga.

Agar ini terjadi, setiap node harus memiliki posisi (x, y) relatif terhadap node induk . Misalnya, karakter Anda dapat berada di (1,0) relatif terhadap platform, yang itu sendiri dapat berada di (10,10) relatif terhadap peta game. Dengan begitu, jika platform bergerak, karakter Anda akan bergerak bersama secara implisit.

Dalam hierarki pohon ini, posisi setiap simpul sama dengan jumlah posisinya ditambah setiap posisi simpul orang tuanya. Katakanlah kita ingin mendapatkan posisi karakter di peta. Kami menghitung:

(posisi karakter) + (posisi simpul orangtua) + (posisi simpul akar) = (1,0) + (10,10) + (0,0) = (11,0)

OK, jadi selama ini karakter Anda telah berdiri di platform. Bagaimana dengan melompat? Nah, saat dia melompat, Anda melepaskannya dari platform dan melampirkannya ke node yang berisi platform ; dalam hal ini, peta (node ​​root).

Ketika dia mendarat lagi, lekatkan dia ke simpul mana pun dia mendarat.


1
Saya juga akan menggunakan kecepatan x dan y dari node untuk mempengaruhi pemain. Contoh 1: platform bergerak sangat cepat dan berhenti, pemain memiliki momentum ke atas dan diluncurkan. Contoh 2: platform bergerak sedikit lebih lambat daripada pemain yang jatuh dengan kecepatan mematikan. Platform harus aman untuk mendarat daripada SPLUT
AttackingHobo

itu pendekatan yang menarik tetapi tampaknya perubahan penuh pada mesin saya hanya untuk memungkinkan platorms bergerak. Mungkin jika saya membuat objectOnPlatform sebagai komponen yang saya bisa untuk objek yang hanya sementara memberikan efek ini?
Iain

10

Saya akan menyarankan memperlakukan ini sebagai masalah pseudo-fisika dan menyelesaikannya dengan menggunakan gesekan tanah.

Anda sudah menggunakan gravitasi untuk menahan karakter di tanah, ini menangani situasi di mana platform bergerak naik dan turun. Untuk menangani gerakan kiri dan kanan, tanah harus memberikan banyak gesekan pada karakter. Biasanya tingkat gesekan ini adalah 1,0, atau 100%.

Jika karakter berdiri diam, maka kecepatannya adalah 0, dan mereka sebaliknya mewarisi 100% dari kecepatan platform karena gesekan. Sesuatu seperti yang berikut ini:

character_velocity = friction * platform_velocity

Manfaat dari pendekatan ini adalah bahwa ia dengan mudah cocok untuk mekanika platform tambahan, seperti mampu mengatasi gesekan pada lereng curam, memungkinkan karakter Anda untuk meluncur. Ini juga memungkinkan Anda untuk dengan mudah mengurangi gesekan untuk membuat es yang akan digeser oleh karakter.

Juga lebih mudah untuk menangani masalah seperti dinding yang menggantung rendah yang dapat menjatuhkan pemain Anda dari platform yang bergerak. Jika Anda hanya memperlakukan karakter sebagai anak dari platform induk, ada kemungkinan ia tidak akan berinteraksi dengan mudah dengan sisa deteksi tabrakan Anda tanpa banyak pekerjaan.


0

Anda mungkin memperbaiki posisi pemain bukan "absolut dalam level" tetapi "relatif terhadap platform", lalu memiliki fungsi yang memberikan posisi aktualnya. Saya tidak suka ini.

Mungkin akan lebih baik (dan lebih sederhana) untuk mengikat pemain ke platform sehingga ketika platform bergerak + x / + y, pemain bergerak sebanyak mungkin.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.