Bagaimana saya bisa dengan mudah menerapkan swinging di game platformer?

9

Saya mengembangkan permainan di mana pemain dapat menggunakan tali untuk berayun (seperti yang dilakukan Spiderman atau Bionic Commando ) dan saya mengalami masalah dalam menerapkan perilaku ini. Adakah yang bisa membantu saya bagaimana melakukan ini, maksud saya rumus fisika dan lain-lain. Sampai sekarang saya telah menghasilkan 3 ide. Salah satunya menggunakan pegas, tetapi menghabiskan banyak waktu dan kadang-kadang gelisah. Dua lainnya sedang mencoba menghitung langkah berikutnya (satu melalui menghitung energi potensial dan satu melalui menghitung torsi) dan keduanya hampir menabrak setiap kali aktor mencoba untuk mengayun.

Berikut adalah kode yang saya tulis untuk menghitung torsi:

float dx = Runner->getPosition().x - ancher.x; 
float dy = Runner->getPosition().y - ancher.y;
float t0 = atan2(dy,dx); //my current angle
float k = ((dy) *vx - (dx) * vy) / (dx * dx+dy * dy); //previus angular velocity
k -= gravity * cos(t0) *dt; // new angular velocity (gravity is positive)
t0 += k * dt - acc * cos(t0) *dt * dt / 2; // rotate the rope
float dx1 = r0 * cos(t0); // new position (r0 is rope length)
float dy1 = r0 * sin(t0);
vx = (dx1 - dx) / dt; //calculate velocity
vy = (dy1 - dy) / dt;
Ali1S232
sumber
Relevan (membuat tali): Deteksi Tabrakan Tali 2D
doppelgreener
@JonathanHobbs jawaban dalam pertanyaan itu adalah persis bagaimana saya mencoba menerapkan tali saya dengan satu pengecualian, karena tabrakan tidak diinginkan dalam kasus saya, saya mengatur setiap bagian tali sebagai sensor sehingga mereka dapat bergerak bebas tanpa terjebak di satu sama lain.
Ali1S232
Bagaimana dengan bandul sederhana untuk tali + beberapa animasi yang tampak seperti tali? Saya tidak percaya bahwa game lama seperti Bionic Commando memiliki sesuatu yang lain daripada pendulum.
user712092
@ Pengguna yang ide pendulum harus bekerja dengan baik. tetapi dalam kasus saya baik karena pergerakan pemain yang cepat atau implementasi saya yang buruk, itu tidak memberikan hasil yang baik.
Ali1S232
@ Gajet coba lakukan beberapa gambar debug sampai Anda benar? Garis pendulum ini mungkin dilakukan sebagai kotak yang cukup tipis di Box2D untuk mendapatkan tabrakan (dan mungkin mengecualikannya dari fisika dan bergerak dengan tangan?).
user712092

Jawaban:

6

Jika Anda menginginkan ayunan kaku, sehingga jarak ke titik rotasi konstan, cukup perlakukan karakter sebagai titik pada lingkaran yang berpusat di titik rotasi. Beri dia kecepatan sudut satu dimensi (sepanjang lingkaran). Setiap frame percepatan sudut harus accelerationDueToGravity * cos(angleOfPlayerOnCircle)(dengan 0-derajat menunjuk ke kanan).

Jika Anda ingin tali menjadi lebih panjang / lebih pendek, Anda bisa menggunakan skema di atas dan hanya memvariasikan jari-jari setiap frame.

BlueRaja - Danny Pflughoeft
sumber
Anda menjawab adalah percobaan kedua saya tetapi bergerak dengan lebih cepat sehingga harus saya edit pertanyaan saya dan tambahkan kode saya mungkin Anda bisa melihat di mana masalahnya.
Ali1S232
3

setelah banyak upaya saya pergi dengan box2d.

ada umumnya dua pendekatan untuk simulasi ini atau setidaknya saya menemukan 2:

  1. satu adalah menggunakan beberapa bentuk lingkaran dan menghubungkannya menggunakan sambungan yang jauh.
  2. dan yang lainnya adalah persegi panjang untuk rantai itu sendiri dan kemudian melampirkannya menggunakan sambungan revolute

di setiap senario Anda harus memiliki ancher (yang dalam kasus saya adalah kotak statis). lebih baik jika Anda menurunkan berat bagian tali (baik Anda menggunakan bentuk lingkaran atau bentuk persegi panjang), misalnya untuk memiliki fisika yang lebih realistis saya mengatur kerapatan mereka menjadi 0,1 dan untuk kotak yang terhubung di ujung tali saya menggunakan kerapatan 10.

Hal lain yang perlu Anda khawatirkan bagaimana segmen tali Anda bereaksi satu sama lain. Saya hanya ingin tali saya bergerak bebas dalam adegan jadi saya menandai semua perlengkapan tali sebagai sensor. Anda mungkin perlu pendekatan yang berbeda.

hal berikutnya yang harus Anda khawatirkan adalah jumlah iterasi yang Anda ikuti untuk pembaruan dunia: untuk segmen tali yang rendah (mungkin paling banyak 8) tidak perlu menggunakan nilai iterasi tinggi, mungkin 10/10 yang disarankan oleh box2d sendiri sudah cukup tetapi jika Anda meningkatkan jumlah segmen misalnya saya mencoba 30 segmen, dengan jumlah iterasi yang rendah, tali Anda tampaknya bertambah panjang lebih dari yang seharusnya, jadi Anda mungkin perlu 40 atau 40 iterasi untuk menyelesaikan situasi tersebut.

setelah beberapa pengujian tampaknya kotak 2d dirancang untuk adegan dengan ukuran objek 0,1 m hingga 10 m dan ukuran maksimum yang disarankan untuk adegan besar adalah sekitar 50 mx 50 m. jadi pada dasarnya Anda perlu menurunkan skala objek Anda untuk mencocokkan parameter ini. dalam kasus saya, saya pertama kali mencoba untuk mengirimkan posisi piksel langsung ke box2d tetapi sepertinya ada beberapa batas kecepatan yang mencegah dunia untuk bergerak secepat yang seharusnya, jadi saya harus skala adegan saya sekitar 64 kali untuk mendapatkan hasil terbaik. Meskipun saya tidak menguji diri saya sendiri ada beberapa batasan dalam box2d yang mencegah Anda menggunakan adegan yang lebih besar. misalnya ada nilai yang ditentukan dalam b2Setting.hfile #define b2_maxTranslation 2.0fAnda dapat mengubah pengaturan box2d tetapi tampaknya tidak dianjurkan.

Ali1S232
sumber
mengapa salah dengan box2d untuk memberi saya downvote ??
Ali1S232
Ini tidak menjawab pertanyaan. Setidaknya tulis bagaimana Anda membuatnya bekerja menggunakan Box2D.
bummzack
@bummzack: ok saya akan menambahkannya ke jawaban saya
Ali1S232
Jika Anda menerima ini sebagai jawaban Anda, pertanyaan Anda jika cacat. Fisika tali tersegmentasi jauh berbeda dari yang Anda gambarkan.
AttackingHobo
@attackingHobo: quesiton itu benar pada waktu itu tetapi ketika saya mengubah kode saya ke box2d, saya menemukan di luar sana tanpa banyak usaha saya dapat menerapkan fisika tali tersegmentasi. dan tidak jauh berbeda, anggap pertanyaan saya hanya satu segmen dari tali yang tersegmentasi. dan hampir semua solusi saya adalah cara untuk menerapkan tali gaya lingkaran tanpa box2d.
Ali1S232
2

Sudahkah Anda mempertimbangkan memperlambat kecepatan gerakan ayun berdasarkan seberapa jauh talinya dari garis tegak lurus (tengah)?

Randolf Richardson
sumber
untuk semua 3 pendekatan panjang tali adalah salah satu parameter yang saya gunakan untuk menghitung kecepatan ayun. Tetapi saya tidak dapat menjamin bahwa saya telah menggunakannya dengan benar. Saya baru saja membuat beberapa perhitungan fisik dan menerapkan versi penyelesaiannya ke permainan.
Ali1S232
Semakin jauh dari pusat, semakin lama penundaan sebelum gerakan berikutnya dari ayunan tali. Anda juga bisa mengalikan nilai ABSolute dari penundaan dengan sesuatu seperti 0,28 (Anda harus bereksperimen dengan ini).
Randolf Richardson
Saya tidak bisa mendapatkan apa yang ingin Anda katakan, ketika saya menghitung langkah selanjutnya saya memiliki nilai konstan untuk delta_time, dan menggunakan semua parameter yang saya miliki (seperti kecepatan previus, posisi previus, panjang tali, dll.) Untuk menghitung kecepatan baru, dan kemudian tambahkan kecepatan ini dikalikan dengan delta_time ke posisi terakhir untuk menghasilkan posisi baru. jika Anda bermaksud hal lain, berikan detail lengkap dalam jawaban Anda.
Ali1S232
1

Ketika pemain lebih jauh dari panjang tali, pemain akan segera didorong kembali dengan kekuatan yang sama dengan jarak yang telah dia lewati. Ini harus bekerja tanpa rasa kenyal, dan harus terasa intuitif bagi pemain. Anda mungkin harus mengubah fisika Anda untuk mendapatkan hasil terbaik untuk gim Anda.

Saat talinya terpasang. Simpan maxLengthnilai.

Setiap pembaruan, periksa distanceantara player, danattachPoint

Jika distancekurang dari maxLengthpembaruan biasanya, tidak ada efek dari tali.

Jika jaraknya lebih besar dari maxLength, temukan normaldari attachPointke pemain. Dapatkan perbedaan antara distancedan maxLength. Tambahkan ke playerVelocity, normaldikalikan dengan perbedaannya.

Kode semu:

dx = (attachPoint.x - player.x)
dy = (attachPoint.y - player.y)

distance = sqrt(dx*dx+dy*dy);

if (distance > maxDistance)
{
    float dx1 = dx / distance * maxDistance;
    float dy1 = dy / distance * maxDistance;
    v.x += (dx1 - dx) / dt;
    v.y += (dy1 - dy) / dt;
}

playerVel += v * dt;
SerangHobo
sumber
jadi apakah kode yang saya edit ke dalam jawaban Anda (maaf tentang itu tetapi saya tidak menemukan tempat yang lebih baik untuk menambahkannya) yang Anda sarankan?
Ali1S232
Saya menyetujui suntingan, dan ya saya pikir itu harusnya. Meskipun saya menggunakan fisika tali sebelumnya dan menggunakan cara yang jauh lebih berbelit-belit untuk melakukan hal yang sama, karena itu saya tidak sepenuhnya yakin kode ini akan berfungsi dengan baik, tetapi saya pikir itu harus, dan bahkan jika tidak, itu membuat Anda lebih baik. % perjalanan ke sana.
AttackingHobo
setelah beberapa kali mencoba saya kira saya akan mencoba box2d untuk masalah ini dan dengan cara Anda harus mengubah kode itu sehingga Anda memiliki dx = player.x - attachpoint.xdan dy = player.y - attachpoint.y.
Ali1S232
1

Jika Anda melihat http://www.cocos2d-iphone.org/archives/1112 ada penerapan tali dengan tubuh kaku yang melekat pada ujung tali. Menggunakan Box2D untuk mesin fisika. Jika Anda melihat kode sumbernya, saya yakin Anda bisa menerapkannya dalam bahasa apa pun yang Anda suka.

Juga, tautan di atas ke pertanyaan Rope adalah milik saya dan demo ini (tautan disediakan) di atas sangat membantu.

Joey Green
sumber