Bagaimana cara menerapkan ledakan 2d yang akan menyebabkan kerusakan dengan memperhitungkan penutup dan jarak akun?

9

Bagaimana saya bisa menerapkan ledakan 2D dengan cara yang akan menyebabkan lebih sedikit kerusakan pada karakter yang bersembunyi di balik peti atau penutup lainnya? Kerusakan idealnya tergantung pada kekuatan penutup (mis. Dinding logam akan melindungi lebih baik daripada peti kayu). Idealnya kerusakan akan berkurang seiring jarak juga.

Saya akan menggunakan port mesin fisika Box2D - Farseer.

Terima kasih.

Sarang
sumber
1
Wiki ( goo.gl/c1OJx ) merekomendasikan penggunaan partikel yang mungkin benar-benar masuk akal karena jenisnya mensimulasikan proses fisik yang sebenarnya. Adakah yang mempertimbangkan pendekatan semacam itu?
Den

Jawaban:

8

Salah satu cara yang relatif sederhana untuk melakukan ini adalah dengan menarik sinar dari pusat ledakan ke pusat setiap entitas di mana DISTANCE(explosion,entity) < exlosion.max_radius(pseudo-code).

Untuk setiap entitas, ikuti ray ini, mengurangi kerusakan basis saat Anda pergi. Setiap kali Anda menekan objek, kurangi nilai pertanggungannya dari kerusakan (pada dasarnya memperpendek sinar).

Ketika sinar menyentuh entitas, kerusakan apa pun yang tersisa adalah kerusakan ledakan Anda.

Untuk pendekatan ini, Anda mungkin menginginkan kerusakan pangkalan yang cukup tinggi yang berkurang dengan cepat dengan jarak (berbanding terbalik dengan kuadrat jarak harus dilakukan dengan baik).


Pendekatan lain adalah menggambar sektor yang sepenuhnya mengandung entitas; tapi tidak lebih luas; dan semua jalan keluar untuk .max_radius. Kurangi dari area sektor ini area yang dicakup oleh setiap penutup antara ledakan dan entitas, dikalikan dengan nilai sampulnya. Area yang tersisa adalah kerusakan ledakan Anda.

Satu efek samping yang rapi dari hal ini adalah bahwa semakin dekat entitas dengan ledakan, semakin luas sektor yang didapat, dan semakin banyak kerusakan yang Anda ambil (saat Anda menghitung semua area sektor tersebut, dan hanya mengurangi area tutupan antara entitas dan ledakan.

Ini juga bisa berguna untuk memperlakukan penutup sebagai entitas; dan cukup kurangi kerusakan yang diambil oleh entitas yang lebih dekat dari entitas yang lebih jauh, tetapi itu mungkin menjadi sulit.


Tidak diragukan lagi ada pendekatan yang bahkan lebih elegan dan pintar, tetapi mungkin membutuhkan beberapa kalkulus yang cukup jahat. Selalu begitu.

Williham Totland
sumber
0

Kerusakan yang berkurang dengan jarak seharusnya menjadi tugas yang sederhana. Saat Anda membuat ledakan, Anda harus tahu koordinat pusat ledakan. Karena Anda bekerja di 2d, itu hanya x dan y.

Yang perlu Anda lakukan adalah menghitung jarak pemain dari koordinat pusat ledakan menggunakan teorema Pythagoras kemudian menggunakannya terhadap radius maks untuk menghitung persentase dari total kerusakan.

Misalnya, ambil koordinat (x1, y1) sebagai titik pusat ledakan, dan (x2, y2) sebagai koordinat pemain. Kami kemudian dapat menghitung kerusakan yang diambil sebagai berikut:

Distance from centre = sqrt((x2-x1 + (y2-y1)²)
Damage taken = (Distance from centre/Explosion radius) * max damage 

Adapun hal-hal di jalan, saya terlalu lelah untuk memikirkan jawabannya, tetapi pada dasarnya Anda akan mencari persimpangan di sepanjang garis dari pusat ledakan ke pemain.

adamk
sumber