Membuat hal yang cepat terlihat lambat (Box2D)

9

Saya sedang mengerjakan game yang Anda kendalikan trebuchet untuk melempar bola ke lawan.

Ini seperti permainan yang disebut 'Pengepungan Abad Pertengahan'. Ketika trebuchet mengayunkan lengannya, pemain harus memanfaatkan momen terbaik untuk menekan tombol dan melepaskan bola. Kemudian bola akan terbang pada sudut singgung. masukkan deskripsi gambar di sini Masalah saya saat ini adalah lengan trebuchet berayun terlalu cepat bagi pemain untuk memanfaatkan momen yang tepat. Sementara itu harus secepat ini kalau tidak bisa melempar cukup jauh. Dan ada tali kecil yang menghubungkan bola dan lengan trebuchet, jika lengannya berayun terlalu lambat, bola hanya tergantung di tali saat lengan bergerak.

Saya memecahkan masalah dengan mengubah ukuran langkah, setiap kali lengan diayunkan, saya mengubah ukuran langkah dari 1/60 ke 1/200. Dan begitu pemain melepaskan bola, itu kembali ke 1/60.

Ini berfungsi cukup baik kecuali permainan saya adalah untuk multi pemain dengan jaringan. Jadi mengubah langkah dapat menyebabkan masalah.

Solusi lain yang bisa saya pikirkan adalah membiarkannya bergerak lambat, tetapi ketika pemain melepaskan bola, saya secara manual menambahkan kecepatan ke bola sambil tetap menjaga arahnya. Saya tidak terlalu menyukai solusi ini karena terlihat palsu dan saya masih memiliki masalah bahwa bola hanya menggantung di tali, kecuali jika saya membuat tali sangat pendek ..

Tolong jelaskan ini, terima kasih!


EDIT

Terima kasih atas masukan semua orang, saya memecahkan masalah dengan membuat lengan mengayun lambat dan ketika pemain melepaskan bola, ambil kecepatan bola dan kali dua. Itu terlihat persis sama dengan mengubah ukuran langkah. Hanya ada satu hal tambahan yang perlu saya lakukan. Karena lengan ayun sangat lambat, bola hanya tergantung di ujung lengan alih-alih diayun. Saya memecahkan ini dengan menerapkan gaya yang sama dengan gaya gravitasi pada bola selama dan hanya selama periode ayunan. Kemudian ia tidak lagi tergantung di sana tetapi berayun bersama dengan lengan.

@MrCranky jawaban terperinci dan terlihat bisa dilakukan, jadi saya akan menerimanya. :)

Arch1tect
sumber
Mungkin Anda bisa menggerakkan trebuchet perlahan, tetapi gandakan kekuatan yang bekerja pada bola? Saya belum pernah bekerja dengan Box2D sebelumnya, maaf jika ini ide yang bodoh. Selain itu, satu-satunya tebakan saya adalah bermain-main dengan massa bola untuk melihat apakah yang lebih berat atau lebih ringan dapat memberi Anda hasil yang dapat diterima dengan kecepatan lebih lambat. Juga, mungkin ada baiknya melihat ke dalam fisika trebuchet kehidupan nyata. Itu terlihat agak lambat, jadi mungkin data tentang mereka (ukuran, amunisi, gaya, dll.) Mungkin memberi Anda beberapa ide untuk simulasi Anda.
Christian
2
Membuat fisika komputer berperilaku seperti "yang asli" benar-benar sulit. Hampir semua mesin fisika mensimulasikan benda tegar, efek yang berarti seperti pembengkokan lengan trebouchet tidak diperhitungkan, baik fisika tali maupun perilaku material tidak akurat, sehingga simulasi yang tepat tanpa "curang" nyaris mustahil. Proses untuk mendekati sesuatu yang terlihat nyata berjalan sedikit seperti ini: tweak, tweak, tweak, cheat, tweak, tweak, cheat, tweak, mulai lagi, tweak, tweak, tweak, tweak, tweak, cheat, tweak, cheat , curang, atur.
LearnCocos2D
4
Meriam kucing menggunakan pendekatan paling realistis untuk masalah ini: Manusia benar - benar buruk dalam memanipulasi realitas fisik dan membutuhkan bantuan mesin, jika Anda ingin memberikan "perasaan" trebuchet yang bergerak cukup lambat bagi manusia untuk mengendalikan secara manual tetapi meluncurkannya. lebih cepat daripada yang dimungkinkan secara fisik, Anda mungkin ingin membuat animasi artistik murni "menembak" dan kemudian menelurkan bola berdasarkan di mana pengguna mengganggu animasi.
MickLH

Jawaban:

3

Secara naluriah saya akan mengatakan bahwa kita kehilangan bagian substansial dari konteks yang perlu dijawab, yaitu "mengapa aspek multi pemain mencegah Anda mengubah catatan waktu?"

Jika Anda mencoba membagikan simulasi fisika melalui koneksi jaringan, yah, itu biasanya hal yang cukup sulit untuk dilakukan. Simulasi menyimpang sangat mudah, dan terutama dengan koneksi jaringan yang dapat kehilangan paket, sangat sulit untuk menjaga semuanya.

Jawaban sederhana dan paling kuat untuk pertanyaan Anda adalah dengan menggunakan timestep variabel. Saat Anda mendekati momen pengambilan keputusan, alih-alih memperbarui simulasi fisika Anda satu detik untuk setiap detik dunia nyata yang lewat, perbarui dengan setengah detik, atau angka lain yang sesuai. Karena ini merupakan efek integrasi, Anda mungkin bisa lolos dengan hanya menggeser laju pembaruan ke tingkat yang lebih rendah selama jendela keputusan, tetapi Anda juga dapat menginterpolasi dengan cepat ke bawah ke tingkat yang lebih rendah. Either way, Anda pada dasarnya memainkan kembali simulasi fisika dalam gerakan lambat. Itu harus berperilaku sangat akurat, cukup lambat sehingga pemain dapat membuat keputusan. Saya tidak akan mempertimbangkan cara lain memalsukan fisika untuk membuatnya bekerja, kemungkinan besar mereka semua akan bekerja mengerikan dan tidak merasa 'benar'.

Jadi kami kembali ke implementasi jaringan. Tanpa informasi lebih lanjut, saya kira Anda punya dua pilihan. Pertama, jika Anda beroperasi berhadapan dengan pihak jaringan lainnya. Jadi ketika satu pemain harus melambat untuk mengambil keputusan, perlambat kedua pemain sama-sama. Ini mungkin akan terasa menjengkelkan dan aneh bagi pemain yang tidak menembak, karena itu akan membingungkan waktu reaksi mereka sendiri.

Untuk yang kedua, bayangkan dua trebuchet saling menembak. Trebuchet membutuhkan 10 detik untuk dilemparkan, dan jendela tembak dimulai pada T + 5s. P1 memulai siklus penembakan pada T + 0s, dan pada T + 5s memperlambat simulasi fisika lokal mereka hingga 50%. Mereka akan membutuhkan waktu 15 tahun untuk bermain sepanjang siklus. Jadi pada T + 5, P1 memberitahu P2 untuk mulai memutar ulang siklus peluncuran 10-an dengan kecepatan penuh. Jadi P1 melihat siklus trebuchet butuh 15 detik, P2 melihatnya butuh 10 detik, tetapi kedua pemain melihat siklus selesai pada T + 15s. Ketika P1 benar-benar rilis, mereka memberi tahu P2 ketika dalam siklus nosional mereka dirilis. Jadi, jika P1 rilis pada T + 10, itu sebenarnya pada 7,5 melalui siklus peluncuran 10-an. P2 kemudian dapat menunjukkan rilis pada T + 12.5s (7.5s ke pemutaran lokal siklus), dan simulasi kedua pemain harus meluncurkan proyektil pada titik fisik yang sama dalam siklus.

Jadi dalam pendekatan kedua ini, Anda tidak lagi melakukan simulasi di berbaris. Anda menjalankan dua simulasi independen, tetapi melacak input pemain. Jika keduanya diberitahu bahwa pemain dirilis pada 7,5-an ke dalam siklus peluncuran, mereka berdua harus sepakat di mana proyektil akan mendarat. Namun dalam praktiknya, itu kemungkinan akan menyimpang sangat cepat, dan Anda perlu menyinkronkan kondisi simulasi.

MrCranky
sumber
0

Mengapa tidak menyalin / mengadaptasi apa yang sudah ada dan bekerja dalam kasus serupa?

masukkan deskripsi gambar di sini

Korchkidu
sumber
0

Jika trebuchet Anda bergerak terlalu cepat, solusi yang jelas adalah mengatur skala waktu untuk membuatnya lebih lambat. Yaitu, untuk setiap detik waktu nyata, buat hanya mis. 0,1 detik berlalu dalam simulasi fisika Anda. Sekarang, dari sudut pandang pemain, bola akan bergerak 10 kali lebih lambat.

Sebenarnya, ada cara lain Anda dapat mencapai efek yang sama: alih-alih menghitung waktu, cukup skala semua konstanta fisika Anda yang ada dalam satuan termasuk waktu. Misalnya, percepatan gravitasi memiliki satuan kecepatan / waktu = jarak / waktu², jadi jika gravitasi adalah satu-satunya yang konstan dalam gim Anda, maka turunkan dengan faktor 100 = 10² mencapai efek yang sama dengan memperlambat waktu dengan faktor 10 .

Tentu saja, jika model fisika Anda menyertakan konstanta lain dengan satuan waktu (atau kecepatan = jarak / waktu, atau akselerasi = jarak / waktu², dll.), Anda harus mengukur skala itu juga jika Anda ingin menjaga lintasannya tetap sama .

Perhatikan bahwa ada batas sejauh apa Anda bisa melakukannya: jika Anda memperlambat waktu dengan, katakanlah, faktor 100, trebuchet Anda akan sangat mudah untuk dikendalikan, tetapi pemain Anda juga cenderung bosan menunggu untuk bola perlahan melayang turun setelah menembakkannya. Jika itu masalah, Anda mungkin perlu menggunakan trik yang lebih canggih seperti yang disarankan dalam jawaban lain, seperti menggunakan penskalaan waktu yang sangat lambat saat trebuchet diaktifkan, tetapi beralih ke skala waktu yang lebih cepat setelah bola diluncurkan.

Ilmari Karonen
sumber
terima kasih, tetapi Anda mungkin tidak melihat hasil edit saya. Ya saya memecahkannya dengan metode terakhir dalam jawaban Anda
Arch1tect