Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming

Kapan Worlds bertabrakan: Simulasi lingkaran-lingkaran tabrakan

by
Difficulty:IntermediateLength:MediumLanguages:

Indonesian (Bahasa Indonesia) translation by Dwi metta (you can also view the original English article)

Deteksi tabrakan paling dalam permainan komputer dilakukan menggunakan teknik AABB: sangat sederhana, jika dua persegi berpotongan, kemudian tabrakan telah terjadi. Ini cepat, efisien, dan sangat efektif – persegi objek. Tapi bagaimana jika kita ingin menghancurkan lingkaran bersama-sama? Bagaimana cara kita menghitung titik tabrakan, dan mana objek pergi setelah? Hal ini tidak sesulit yang Anda mungkin berpikir...

Catatan: Meskipun tutorial ini ditulis menggunakan AS3 dan Flash, Anda harus dapat menggunakan teknik dan konsep yang sama di hampir setiap lingkungan pengembangan game.

Pratinjau gambar diambil dari klasik Psdtuts + tutorial ini.


Langkah 1: Buat beberapa bola

Aku akan menutupi langkah ini, karena jika Anda tidak dapat membuat dasar sprite, sisa tutorial akan menjadi agak luar Anda.

Cukuplah untuk mengatakan, kita memiliki titik awal. Di bawah ini adalah sangat dasar simulasi bola memantul di sekitar layar. Jika mereka menyentuh tepi layar, mereka bangkit kembali.

Namun, ada satu hal yang penting untuk dicatat: sering, ketika Anda membuat sprite, kiri bagian atas diatur ke asal (0, 0) dan kanan bawah (lebar, tinggi). Di sini, kami telah menciptakan lingkaran berpusat pada sprite.

simulating circle-circle collisions

Hal ini membuat segala sesuatu yang jauh lebih mudah, karena jika kalangan tidak berpusat, untuk perhitungan lebih atau kurang setiap kita harus diimbangi dengan jari-jari, melakukan perhitungan, kemudian ulang kembali.

Anda dapat menemukan kode ke titik ini dalam folder v1 sumber download.


Langkah 2: Periksa tumpang tindih

Hal pertama yang ingin kita lakukan adalah memeriksa jika bola kami sedang dekat satu sama lain. Ada beberapa cara untuk melakukan ini, tetapi karena kita ingin menjadi programmer kecil yang baik, kita akan mulai dengan pemeriksaan AABB.

AABB singkatan axis-blok kotak melompat-lompat, dan merujuk kepada rectangle ditarik agar sesuai erat di sekitar objek, sejajar sehingga pihak sejajar dengan sumbu.

Pemeriksaan tabrakan AABB tidak memeriksa apakah lingkaran saling tumpang tindih, tapi itu mari kita tahu jika mereka dekat satu sama lain. Karena permainan kami hanya menggunakan empat objek, hal ini tidak diperlukan, tetapi jika kita sedang menjalankan simulasi dengan 10.000 benda, kemudian melakukan optimasi kecil ini akan menyelamatkan kita banyak siklus CPU.

Jadi di sini kita pergi:

Ini harus cukup sederhana: kami sedang membangun berlari kotak ukuran diameter bola setiap persegi.

simulating circle-circle collisions

Di sini, "tabrakan" telah terjadi - atau lebih tepatnya, AABBs dua tumpang tindih, yang berarti lingkaran berada dekat dengan satu sama lain, dan berpotensi bertabrakan.

Setelah kita mengetahui bola berada dalam kedekatan, kita bisa sedikit lebih kompleks. Menggunakan trigonometery, kita dapat menentukan jarak antara dua poin:

Di sini, kami menggunakan teorema Pythagoras, ^ 2 + b ^ 2 = c ^ 2, untuk mengetahui jarak antara pusat-pusat dua lingkaran.

simulating circle-circle collisions

Kita tidak segera tahu panjang dan b, tetapi kita tahu kordinat setiap bola, sehingga sangat sepele untuk berolahraga:

Kami kemudian memecahkan untuk c dengan sedikit penataan ulang Aljabar: c = Math.sqrt (^ 2 + b ^ 2) - maka ini bagian dari kode:

Kami kemudian memeriksa nilai ini terhadap jumlah dari jari-jari lingkaran:

Mengapa Apakah kita memeriksa terhadap kalangan dikombinasikan jari-jari? Nah, jika kita melihat gambar di bawah, maka kita bisa melihat bahwa-tidak peduli apa sudut lingkaran yang menyentuh - jika mereka menyentuh garis maka c setara dengan r1 + r2.

simulating circle-circle collisions

Jadi-jika c sama atau kurang dari r1 + r2, maka lingkaran harus menyentuh. Sederhana!

Perhatikan juga bahwa, untuk menghitung tabrakan dengan benar, Anda akan mungkin ingin memindahkan semua benda-benda Anda pertama, dan kemudian melakukan deteksi tabrakan pada mereka. Jika tidak, Anda mungkin memiliki situasi yang mana Ball1 update, cek untuk tabrakan, bertabrakan, kemudian Ball2 update, tidak lagi di daerah yang sama sebagai Ball1, dan laporan tidak tabrakan. Atau, dalam istilah Kode:

jauh lebih baik daripada

Anda dapat menemukan kode ke titik ini dalam folder v2 sumber download.


Langkah 3: Menghitung poin tabrakan

Bagian ini tidak benar-benar diperlukan untuk bola tabrakan, tetapi it's pretty cool, jadi saya melemparkan itu. Jika Anda hanya ingin mendapatkan semua terpental sekitar, merasa bebas untuk melompat ke langkah berikutnya.

Kadang-kadang bisa berguna untuk bekerja di luar titik di mana dua bola memiliki bertabrakan. Jika Anda ingin, misalnya, menambahkan efek partikel (mungkin ledakan kecil), atau Anda membuat semacam pedoman untuk permainan snooker, maka hal itu dapat berguna untuk mengetahui titik tumbukan.

Ada dua cara untuk mengetahui hal ini: cara yang tepat, dan dengan cara yang salah.

Dengan cara yang salah, yang menggunakan banyak tutorial, adalah rata-rata dua poin:

Ini bekerja, tapi hanya jika bola adalah ukuran yang sama.

Rumus kita ingin menggunakan adalah sedikit lebih rumit, tetapi bekerja untuk bola dari semua ukuran:

Ini menggunakan jari-jari bola untuk memberi kita benar x dan y kordinat titik tabrakan, diwakili oleh titik biru di demo di bawah ini.

Anda dapat menemukan kode ke titik ini dalam folder v3 sumber download.


Langkah 4: Memantul terpisah

Sekarang, kita tahu ketika bertabrakan benda kami ke satu sama lain, dan kita tahu kecepatan mereka dan mereka x dan y lokasi. Bagaimana kita bekerja keluar mana mereka melakukan perjalanan berikutnya?

Kita dapat melakukan sesuatu yang disebut elastis tabrakan.

Mencoba untuk menjelaskan dalam kata-kata bagaimana elastis tabrakan bekerja dapat menjadi rumit - gambar animasi berikut harus membuat hal-hal yang lebih jelas.

simulating circle-circle collisions

Gambar dari http://en.wikipedia.org/wiki/Elastic_collision

Sederhana, kami menggunakan segitiga lain.

Sekarang, kita dapat bekerja keluar arah setiap bola membawa, tetapi mungkin ada faktor-faktor lain di tempat kerja. Spin, gesekan, bahan bola terbuat dari, massa, dan banyak faktor lainnya dapat diterapkan dengan mencoba untuk membuat tumbukan "sempurna". Kita akan hanya khawatir tentang salah satu dari ini: massa.

Dalam contoh kita, kita akan berasumsi bahwa jari-jari bola kami menggunakan juga massal mereka. Jika kita sedang berjuang untuk realisme, maka ini akan tidak akurat karena-dengan asumsi bola semua terbuat dari bahan yang sama-massa bola akan sebanding dengan baik daerah mereka atau volume, tergantung pada apakah atau tidak Anda ingin menganggap mereka cakram atau spher es. Namun, karena ini adalah permainan yang sederhana, menggunakan jari-jari mereka akan cukup.

Kita dapat menggunakan rumus berikut untuk menghitung perubahan x kecepatan bola pertama:

Jadi, mari kita pergi ke ini hanya:

  • Menganggap bola kedua memiliki massa yang sama (kita akan mengatakan 10).
  • Bola pertama adalah bergerak di 5 unit / update (ke kanan). Kedua bola bergerak-1 unit/update (ke kiri).

Dalam kasus ini, dengan asumsi tabrakan, bola pertama akan mulai bergerak di-1 unit/update. (Ke kiri). Karena bola massa sama, tabrakan langsung dan tidak ada energi telah hilang, mereka bola akan memiliki "diperdagangkan" kecepatan. Mengubah salah satu faktor-faktor ini jelas akan mengubah hasil.

(Jika Anda menggunakan perhitungan yang sama untuk mengetahui kecepatan baru bola kedua, Anda akan menemukan bahwa itu bergerak pada unit/update 5, di sebelah kanan).

Kita dapat menggunakan formula ini sama untuk menghitung x / y kecepatan bola kedua setelah tabrakan:

Mudah-mudahan hal ini jelas bahwa setiap perhitungan adalah sama, cukup menggantikan nilai yang sesuai.

Setelah ini dilakukan, kami memiliki kecepatan baru bola setiap. Jadi kita lakukan? Tidak cukup.

Sebelumnya, kami membuat yakin untuk melakukan semua pembaruan posisi kami sekaligus, dan kemudian memeriksa tabrakan. Ini berarti bahwa ketika kita memeriksa bola bertabrakan, sangat mungkin bahwa satu bola akan "dalam" lain-jadi ketika deteksi tabrakan disebut, bola pertama dan kedua bola akan mendaftarkan tabrakan itu, berarti bahwa objek kami mungkin akan terjebak bersama-sama.

(Jika bola yang menuju bersama-sama, tabrakan pertama akan membalikkan arah mereka-sehingga mereka bergerak terpisah – dan tumbukan kedua akan membalikkan arah mereka lagi, menyebabkan mereka untuk bergerak bersama-sama).

Ada beberapa cara untuk menangani hal ini, seperti melaksanakan Boolean yang memeriksa apakah bola sudah memiliki bertabrakan frame ini, tetapi cara termudah adalah hanya untuk memindahkan setiap bola dengan kecepatan baru. Ini berarti, pada prinsipnya, bahwa bola harus bergerak terpisah oleh jumlah yang sama kecepatan yang mereka bergerak bersama-sama-menempatkan mereka sama terpisah jarak ke frame sebelum mereka bertabrakan.

Dan hanya itu!

Anda dapat melihat hasil akhir di sini:

Dan kode sumber ke bagian ini tersedia di folder v4 sumber download.

Terima kasih untuk membaca! Jika Anda ingin mempelajari lebih lanjut tentang metode deteksi tabrakan sendiri, check out sesi ini. Anda juga mungkin tertarik dalam tutorial ini tentang quadtrees dan tutorial ini tentang tes Axis memisahkan.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.