Saya memiliki mekanik game "amuba". Adakah ide tentang bagaimana mengimplementasikannya?


19

Di luar klon tetris , penembak top-down 2D jelek , dan beberapa bermain-main dengan hal-hal seperti Unity dan Flixel, saya menyadari bahwa saya belum menyelesaikan permainan tunggal , dipoles, lonceng dan peluit. Saya ingin mengubah ini, dan saya punya ide untuk proyek selanjutnya.

Idenya adalah Anda seorang amuba. Amuba memiliki inti seperti mata ini (atau sesuatu seperti itu, saya tidak tahu biologi), dan Anda memiliki dua dari mereka. Anda mengontrol satu dengan WASDdan yang lainnya dengan IJKL. Harus ada radius konstan hal-hal di sekitar masing-masing core:

2meba1

Dan area amuba harus tetap konstan. Jadi jika Anda memindahkan inti dalam satu arah, Anda meningkatkan area amuba, tetapi peningkatan itu dikompensasi oleh penurunan di tempat lain:

2meba2

Aaaaa dan saya ingin menerapkan montir vagina . Anda menyerap banyak hal dengan menelannya, seperti bos. Mungkin bahkan inti tambahan, atau jarum yang muncul dan menyebabkan semua hal dalam diri Anda mulai memancar keluar:

2meba3

Tapi ini masalahnya: Saya tidak tahu cara membuatnya. Namun, saya ingin beberapa ide tentang bagaimana mengimplementasikannya. Haruskah saya menjelajahi perpustakaan fisika seperti Box2D? Atau mungkin sesuatu yang melibatkan fisika fluida? Bantuan apa pun akan sangat dihargai.

PS Merasa bebas untuk mencuri ide ini. Saya punya banyak ide. Jika Anda melakukannya, tolong beri tahu saya bagaimana Anda membuatnya sehingga saya bisa mencobanya sendiri.


3
Bentuk kata benda dan kata kerja masing-masing adalah invaginasi dan invaginasi , FYI. (Saya memang melakukan biologi.) Foto yang bagus.
Insinyur

2
dari mana Anda mendapatkan kertas hitam manis itu?
brendan

5
@brendan: Jika Anda menukar hitam dengan putih, merah dengan biru dan putih dengan hitam, itu menjadi jauh lebih jelas di mana ia mendapat "kertas hitam" ini. ;)
knight666

1
Kalian terlalu pintar: D
Jason Tu

Jawaban:


16

Dari atas kepala saya, klausa yang menonjol bagi saya adalah bahwa Anda ingin area menjadi konstan. Itu menurut saya kesakitan dalam semua ini, jadi mari kita coba dan menemukan solusi mudah untuk itu.

Ambil seutas tali dan ikat kedua ujungnya menjadi satu lingkaran. Saya mungkin salah, tetapi intuisi saya mengatakan bahwa bagian dalam string itu memiliki area konstan, atau akan bertindak sangat buruk seperti batas amuba Anda.

Jadi saya akan mengatakan: mengimplementasikan string. ;) Sebagian besar pustaka fisika dapat melakukan pegas (dalam Box2D ini terlihat seperti sambungan jarak jauh), dan cara termudah untuk membuat string adalah dengan menghubungkan banyak string bersama-sama. Bergabunglah dengan yang terakhir hingga yang pertama untuk membuat lingkaran. Pastikan pegas dalam string memiliki konstanta pegas yang cukup tinggi untuk tidak direntangkan terpisah - Anda ingin agar pegas menjadi cukup kaku dan bergerak bersamaan, tidak memanjang.

Selanjutnya, buat kekuatan untuk bertindak pada string. Secara sepele, dua inti / mata / titik kontrol Anda menciptakan kekuatan ke titik-titik yang membentuk string. Buat gaya jatuh dengan fungsi kuadrat terbalik:

float forceOnPoint(point, ball)
{
  float d = distance(point, ball);
  return K / (d*d);
}

Dan buat arah gaya langsung dari mata kontrol / bola, seperti kekuatan penolak yang berasal dari bola. Tweak K untuk mengontrol kekuatan pasukan. Pastikan K tidak terlalu tinggi - Anda tidak ingin itu hanya didorong keluar secara paksa oleh kekuatan, jauhkan dari bola. Tinggalkan banyak kelonggaran di tali Anda.

Dengan hanya dua orang itu Anda mungkin akan berakhir dengan bentuk yang cukup seragam, jadi saya juga menyarankan Anda membuat beberapa kekuatan yang lebih lemah di sekitar 'sup' sekitarnya untuk mengubah bentuk amuba. Anda dapat membuat tempat acak ini, mengubah gaya mereka secara teratur (Anda bisa menjadikannya fungsi sinusoid untuk gerakan yang bagus) dan membuatnya bekerja dengan cara yang sama seperti bola.

Vaginasi (fnarr): ini yang sulit. Anda menyebabkannya untuk menyelimuti objek dengan memeriksa untuk melihat apakah dua titik yang tidak berdekatan pada string telah berhasil cukup dekat, dan jika demikian Anda perlu:

Ukur jarak antara titik pada tali. Hitung jumlah bagian pegas. Temukan jalur 'lebih pendek' dari A ke B.

Pecahkan string dan gabungkan kembali dengan dua titik yang berdekatan. Dengan kata lain, langsung gabungkan titik A ke titik B dan buang semua barang di antara.

Masukkan kembali jumlah poin yang hilang (ditambah poin bonus jika Anda ingin memperbesar ukuran dengan memakan sesuatu) ke dalam string di sisi lain - yaitu, sisi dari B ke A. Jika Anda memasukkannya secara merata sepanjang dan membuat mereka lebih pendek dari jarak yang diinginkan antara titik, Anda harus mendapatkan efek kenyal-mengembang yang bagus.

Saya pikir itu mencakup segalanya. Ngomong-ngomong: ide terdengar luar biasa.


18
FWIW, sementara aku seperti solusi ini di seluruh, intuisi Anda tentang interior string memiliki wilayah yang konstan adalah salah - lingkaran memiliki luas maksimal dari setiap bentuk dengan yang diikat-sama string sebagai nya batas. Cara termudah untuk melihat bahwa ini bervariasi adalah dengan membayangkan 'menekan' tali dengan menarik dua ujungnya dengan kencang; maka bentuk yang Anda dapatkan (apakah persegi panjang atau elips atau apa pun yang Anda miliki) tidak akan pernah bisa lebih luas dari setengah perimeter, tetapi tingginya menyusut ke nol sehingga area (yang dibatasi oleh lebar * tinggi) juga menyusut ke nol.
Steven Stadnicki

1
Saya pikir Anda bermaksud "... membuat string adalah menghubungkan banyak mata air bersama-sama."
Richard Marskell - Drackir

8

Agar Anda dapat mensimulasikan endositosis (proses sel memakan inti eksternal), setiap inti, baik di dalam maupun di luar amuba, akan mengusir batas amuba. Inti di dalam amuba akan memiliki efek tolakan yang cukup kuat, sedangkan yang di luar akan memiliki efek tolakan kecil. Ini diilustrasikan di bawah ini.

masukkan deskripsi gambar di sini

Saat inti luar (merah) mendekati amuba, bidang yang menjijikkan itu akan menciptakan lekukan melingkar di amuba. Akhirnya, kedua sisi (hijau yang disorot) akan saling menyentuh. Ketika tabrakan seperti ini terdeteksi, lekukan melingkar dihapus dan apa pun di dalamnya dikonsumsi.

Ini meniru proses endositosis dengan cukup baik, dan memberikan efek visual yang bagus.

Sedangkan untuk mensimulasikan batas amuba, saya suka ide Matt Kemp menggunakan sejumlah besar mata air yang terhubung. Ini tidak mempertahankan area konstan, tetapi batas konstan. Dalam kehidupan nyata, air dapat mengalir masuk dan keluar dengan bebas dari membran sel (batas amuba), sehingga sel tidak memiliki volume konstan.


Beberapa ide lain untuk membuat game ini realistis mungkin dapat mengubah konten garam sel. Ketika konsentrasi garam di dalam dan di luar sel tidak cocok, air mengalir melalui membran sel menuju tempat dengan kandungan garam yang lebih tinggi dalam proses yang disebut osmosis. Jika amuba memiliki kandungan garam yang tinggi, maka akan memiliki volume yang lebih besar, tetapi batasnya tidak akan berubah. Dalam permainan, ini bisa disimulasikan dengan memberikan inti yang lebih dalam efek menjijikkan jika kandungan garam lebih tinggi.

Karena kandungan garam yang lebih tinggi akan memberikan inti efek menjijikkan yang lebih tinggi, itu memiliki keuntungan membuat amuba lebih mudah untuk dikendalikan. Memiliki kandungan garam yang lebih rendah akan menyebabkan amuba melentur dan menekuk di bawah pengaruh lingkungan lebih mudah. Ini memiliki keuntungan karena bisa makan inti lainnya lebih mudah, karena amuba akan dapat mengelilinginya lebih mudah.


3

Nah untuk melakukan efek grafis Anda kemungkinan besar akan menggunakan metaballs (ada banyak tutorial online untuk mereka)


2

Yah saya tahu sebuah game edukasi yang disebut CellCraft (tidak ada hubungannya dengan Minecraft) yang melibatkan mengendalikan makhluk seperti sel yang memiliki gerakan yang sangat mirip dengan apa yang Anda butuhkan. Gim ini gratis dan mungkin lebih penting adalah bahwa mereka menyatakan di situs mereka dengan jelas bahwa mereka bermaksud membuat kode sumber tersedia secara gratis dan dibuat di ActionScript 3 dan merupakan gim berbasis flash.

http://www.cellcraftgame.com/Home.html


1

Cara saya akan melakukan ini adalah untuk mensimulasikan loop string yang mirip dengan yang disarankan Matt Kemp, tetapi mengisi interior dengan partikel yang saling tolak dan string. dengan cara ini Anda akan memastikan perkiraan volume konservasi. Anda harus berhati-hati untuk memastikan kekuatan besar tidak mengetuk partikel di luar.

Carilah "smoothed particle hydrodynamics" untuk simulasi partikel, dan "integrasi verlet" untuk mensimulasikan mereka (dan string). Verlet adalah teknik berbasis posisi sehingga sangat sederhana dan stabil.

Agar semuanya tetap efisien, saya akan menyarankan sistem "pembagian grid spasial yang seragam". Sekali lagi, mudah diimplementasikan dan membuat speedup hebat.

Anda juga bisa menggunakan metaballs untuk memvisualisasikan objek alih-alih menggunakan string. Tetapi kemudian Anda memiliki masalah bahwa partikel mungkin terpisah menjadi rumpun yang terpisah. Lihatlah "pasukan Van der Waals" untuk keseimbangan tarik-menarik yang mengarah pada penggumpalan.

Pendekatan lain adalah memberikan gaya 'mengembang' kecil pada partikel-partikel string ke arah normalnya 'ke luar'. Ini akan mensimulasikan semacam tekanan internal. Hasilnya adalah loop akan berusaha mempertahankan bentuk lingkaran. Itulah yang saya gunakan untuk ini .

Semoga ini bisa membantu.

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.