Bir "amip" oyun tamircim var. Nasıl uygulanacağı hakkında bir fikrin var mı?


19

Bir tetris klonu , berbat bir 2D yukarıdan aşağıya atıcı ve Unity ve Flixel gibi şeylerle uğraşmak dışında, henüz tek , cilalı, çan ve ıslık oyunu tamamlamadığımı fark ettim . Bunu değiştirmek istiyorum ve bir sonraki projem için bir fikrim var.

Fikir, sen bir amip olduğun. Amiplerde bu göz benzeri çekirdekler var (ya da böyle bir şey, biyoloji bilmiyorum) ve bunlardan iki tane var. Sen ile birini kontrol WASDve diğer IJKL. Her bir çekirdek çevresinde sabit bir malzeme yarıçapı olmalıdır :

2meba1

Ve amip bölgesi sabit kalmalıdır. Bir çekirdeği bir yönde hareket ettirirseniz, amipin alanını arttırırsınız, ancak bu artış başka bir yerde bir azalma ile telafi edilir:

2meba2

Aaaaave bir vajinasyon tamircisi uygulamak istiyorum . Bir şeyi patron gibi yutup emiyorsun. Belki ekstra bir çekirdek veya sizi açan ve tüm iç eşyalarınızın fışkırmaya başlamasına neden olan bir iğne bile :

2meba3

Ama sorun şu: Bunu nasıl yapacağımı bilmiyorum. Ancak, nasıl uygulanacağı hakkında bazı fikirler istiyorum. Box2D gibi fizik kütüphanelerini keşfetmeli miyim? Ya da belki de sıvı fiziği içeren bir şey? Herhangi bir yardım çok takdir edilecektir.

PS: Bu fikri çalmaktan çekinmeyin. Bir sürü fikrim var. Bunu yaparsanız, lütfen bunu nasıl yaptığınızı söyleyin, böylece kendim deneyebilirim.


3
İsim ve fiil biçimleri sırasıyla invajinasyon ve invajinattır , FYI. (Biyoloji yaptım.) Güzel resimler.
Mühendis

2
bu tatlı siyah kağıdı nereden aldın?
brendan

5
@brendan: Siyah ile beyaz, kırmızı ile mavi ve siyah ile beyaz arasında geçiş yaparsanız, bu "siyah kağıdı" aldığı yerde çok daha belirgin hale gelir. ;)
knight666

1
Sizler çok zekisiniz: D
Jason Tu

Yanıtlar:


16

Başımın üstünden, bana yapışan madde, alanın sabit olmasını istediğiniz. Bu bana tüm bunlarda acı gibi geliyor, o yüzden deneyelim ve buna kolay bir çözüm bulalım.

Bir parça ip alın ve bir daire oluşturmak için uçlarını birbirine bağlayın. Yanılıyor olabilirim, ama sezgim bu dizenin iç kısmının sabit bir alana sahip olduğunu ya da amip sınırınız gibi korkunç bir rol oynayacağını söylüyor.

Yani şunu söyleyebilirim: dizeyi uygulamak. ;) Çoğu fizik kütüphanesi yaylar yapabilir (Box2D'de bu mesafe bağlantısına benziyor) ve bir dize yapmanın en kolay yolu çok sayıda dizeyi birbirine bağlamaktır. Bir döngü oluşturmak için sonuncuyu birinciye kadar birleştirin. Dizedeki yayların, birbirinden gerilmeyecek kadar yüksek bir yay sabitine sahip olduğundan emin olun - genişlememeleri için oldukça sert olmalarını ve birlikte hareket etmelerini istersiniz.

Ardından, dizgide işlemek için kuvvetler oluşturun. Önemsiz olarak, iki çekirdek / göz / kontrol noktanız ipi oluşturan noktalara kuvvet oluşturur. Kuvvetin ters kare fonksiyonu ile düşmesini sağlayın:

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

Ve kuvvetin yönünü doğrudan kontrol gözünden / toptan uzak tutun, tıpkı toptan çıkan itici bir kuvvet gibi. Kuvvetin gücünü kontrol etmek için K ayarını yapın. K'nin çok yüksek olmadığından emin olun - kuvvet tarafından büyük ölçüde itilmesini istemezsiniz, sadece toplardan uzak tutun. İpinizde bol bol boşluk bırakın.

Sadece bu iki ile muhtemelen tekdüze bir şekil elde edeceksiniz, bu yüzden de amipin şeklini değiştirmek için çevredeki 'çorba' etrafında bazı zayıf kuvvetler oluşturmanızı öneririm. Bu rastgele yerleri yapabilir, kuvvetlerini düzenli olarak değiştirebilirsin (güzel hareketler için sinüsoid bir işlev yapabilirsin) ve toplarla aynı şekilde çalışmasını sağlayabilirsin.

Vajinasyon (fnarr): bu zor olanı. Bir nesneyi dizede bitişik olmayan iki noktanın yeterince yakın olup olmadığını kontrol ederek nesneyi sarmasına neden olursunuz ve eğer yapmanız gerekiyorsa:

Dize üzerindeki noktalar arasındaki mesafeyi ölçün. Yay bölümlerinin sayısını sayın. A'dan B'ye 'daha kısa' yolu bulun.

Dizeyi kırın ve bitişikteki iki nokta ile yeniden birleştirin. Başka bir deyişle, doğrudan A noktasını B noktasına birleştirin ve aradaki tüm öğeleri atın.

Eksik sayıdaki noktaları (artı bir şey yiyerek genişletmek istiyorsanız bonus puanları) diğer taraftaki dizeye, yani B'den A'ya kadar olan tarafa yeniden takın. puanlar arasında istenen mesafeden daha kısa yapın, güzel bir yaylı expandy etkisi elde etmelisiniz.

Bence bu her şeyi kapsıyor. Bu arada: fikir harika görünüyor.


18
FWIW, I ise bütün bu çözüm gibi, sabit alana sahip dize iç hakkındaki sezgi olan yanlış - çember onun sınır olarak bu bağladılar-birlikte dize ile herhangi formsuz maksimal alana sahiptir. Değiştiğini görmenin en kolay yolu, iki ucu gergin çekerek ipin 'ezildiğini' hayal etmektir; o zaman elde ettiğiniz şekil (ister dikdörtgen ister elips veya ne varsa) çevrenin yarısından daha geniş olamaz, ancak yüksekliği sıfıra düşer, böylece alan (genişlik * yükseklik ile sınırlıdır) da sıfıra düşer.
Steven Stadnicki

1
Sanýrým "... bir dize yapmak birçok yayý birbirine bađlamak" demek istiyorsun .
Richard Marskell - Drackir

8

Endositozu (dış çekirdekleri yiyen hücrenin süreci) simüle edebilmeniz için, amipin hem içinde hem de dışında her çekirdek, amipin sınırını itecektir. Amipin içindeki çekirdekler orta derecede güçlü bir itici etkiye sahipken, dışarıdaki olanlar küçük bir itici etkiye sahip olacaktır. Bu aşağıda gösterilmiştir.

resim açıklamasını buraya girin

Dış çekirdek (kırmızı) amiplere yaklaştıkça itici alanı amipte dairesel bir girinti yaratacaktır. Sonunda, iki taraf (yeşil ile vurgulanır) birbirine temas eder. Böyle bir çarpışma tespit edildiğinde, dairesel girinti silinir ve içindeki her şey tüketilir.

Bu, endositoz sürecini oldukça taklit eder ve hoş bir görsel etki verir.

Amip sınırını simüle etmeye gelince, Matt Kemp'in çok sayıda bağlı yay kullanma fikrini seviyorum. Bu sabit bir alanı değil, sabit bir çevreyi korur. Gerçek hayatta, su bir hücre zarından (amip sınırı) serbestçe akabilir, bu nedenle hücrelerin sabit bir hacmi yoktur.


Oyunu gerçekçi kılmak için başka fikirler de hücrelerin tuz içeriğini bir şekilde değiştirebilecektir. Bir hücrenin içindeki ve dışındaki tuz konsantrasyonu eşleşmediğinde, su ozmoz adı verilen bir işlemde hücre zarından daha yüksek tuz içeriğine sahip yere doğru akar. Amip yüksek bir tuz içeriğine sahipse, daha büyük bir hacme sahip olurdu, ancak çevre değişmez. Oyunda, tuz içeriği daha yüksekse, iç çekirdeğe daha yüksek itici bir etki vererek simüle edilebilir.

Daha yüksek bir tuz içeriği, çekirdeklere daha yüksek itici bir etki vereceğinden, amipin kontrolünü kolaylaştırma avantajına sahiptir. Daha düşük bir tuz içeriğine sahip olmak, amipin çevrenin etkisi altında esnemesine ve bükülmesine neden olacaktır. Amip onu daha kolay çevreleyebileceğinden, bu, diğer çekirdekleri daha kolay yiyebilme avantajına sahiptir.


3

Grafik efektini yapmak için büyük olasılıkla metaball'ları kullanacaksınız (onlar için çevrimiçi çok sayıda öğretici var)


2

İhtiyacınıza çok benzer hareketlere sahip hücre benzeri yaratığı kontrol etmeyi içeren CellCraft (Minecraft ile hiçbir ilişkisi yok) adlı bir eğitim oyununu biliyorum. Oyun ücretsiz ve muhtemelen daha da önemlisi, sitelerinde kaynak kodunu ücretsiz olarak sunmayı planladıklarını açıkça belirttikleri ve ActionScript 3'te yapıldığı ve flash tabanlı bir oyundur.

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


1

Bununla ilgili olarak Matt Kemp'in önerdiği gibi bir dize döngüsü simüle etmek, ancak iç kısmı birbirini ve ipi iten parçacıklar ile doldurmak. bu şekilde yaklaşık hacim tasarrufu sağlayacaksınız. Büyük kuvvetlerin partikülleri dışarıya vurmamasına dikkat etmeniz gerekir.

Parçacıkların simülasyonu için "yumuşatılmış parçacık hidrodinamiği" ve onları (ve dizeyi) simüle etmek için "verlet entegrasyonu" konusuna bakın. Verlet konum tabanlı bir tekniktir, bu yüzden çok basit ve kararlıdır.

İşleri verimli tutmak için bir "düzgün ızgara uzamsal bölümleme" sistemi öneririm. Yine, uygulanması kolay ve büyük hızları yaşatır.

Dizeyi kullanmak yerine nesneyi görselleştirmek için metataball'ları da kullanabilirsiniz. Ama sonra parçacıkların ayrı kümelere ayrılabileceği probleminiz var. Topaklanmaya yol açan çekim / itme dengesi için "Van der Waals kuvvetleri" konusuna bakın.

Başka bir yaklaşım, dize partiküllerine 'dış' normalleri doğrultusunda küçük bir 'şişirme' kuvveti sağlamak olacaktır. Bu bir tür iç baskıyı simüle edecektir. Sonuç, döngü bir daire şeklini korumaya çalışacaktır. Ben bunun için kullanılan ne bu .

Umarım yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.