Ich habe eine Amöben-Spielmechanik. Irgendeine Idee, wie man es implementiert?


19

Abgesehen von einem Tetris-Klon , einem beschissenen 2D-Top-Down-Shooter und einigem Herumspielen mit Dingen wie Unity und Flixel ist mir klar, dass ich noch kein einziges , ausgefeiltes Schnickschnack -Spiel absolvieren muss. Ich möchte das ändern und habe eine Idee für mein nächstes Projekt.

Die Idee ist, dass Sie eine Amöbe sind. Amöben haben diese augenähnlichen Kerne (oder so ähnlich, ich kenne die Biologie nicht), und Sie haben zwei davon. Du kontrollierst eins mit WASDund das andere mit IJKL. Um jeden Kern muss ein konstanter Radius vorhanden sein :

2meba1

Und die Fläche der Amöbe muss konstant bleiben. Wenn Sie also einen Kern in eine Richtung bewegen, vergrößern Sie die Fläche der Amöbe, aber diese Erhöhung wird durch eine Verringerung an einer anderen Stelle ausgeglichen:

2meba2

Aaaaaund ich möchte einen Vaginationsmechanismus implementieren . Sie nehmen Dinge auf, indem Sie sie verschlingen, wie ein Chef. Vielleicht sogar einen zusätzlichen Kern oder eine Nadel, die dich zum Platzen bringt und dein ganzes Inneres zum Heraussprudeln bringt :

2meba3

Aber hier ist das Problem: Ich weiß nicht, wie ich das machen soll. Ich hätte jedoch gerne einige Ideen zur Implementierung. Soll ich Physikbibliotheken wie Box2D erkunden? Oder vielleicht etwas mit Fluidphysik? Jede Hilfe wäre sehr dankbar.

PS Zögern Sie nicht, diese Idee zu stehlen. Ich habe viele Ideen. Wenn ja, sagen Sie mir bitte, wie Sie es gemacht haben, damit ich es selbst versuchen kann.


3
Nomen- und Verbformen sind invaginiert bzw. invaginiert , FYI. (Ich habe Biologie gemacht.) Schöne Bilder.
Ingenieur

2
Woher hast du das süße schwarze Papier?
brendan

5
@brendan: Wenn Sie Schwarz gegen Weiß, Rot gegen Blau und Weiß gegen Schwarz tauschen, wird deutlich, woher er dieses "schwarze Papier" hat. ;)
knight666

1
Ihr seid zu schlau: D
Jason Tu

Antworten:


16

Die Klausel, die mir besonders auffällt, ist, dass die Fläche konstant bleiben soll. Das scheint mir der Schmerz in all dem zu sein, also lasst uns versuchen, eine einfache Lösung dafür zu finden.

Nehmen Sie ein Stück Schnur und binden Sie die Enden zusammen, um einen Kreis zu bilden. Ich kann mich irren, aber meine Intuition besagt, dass die Innenseite dieser Saite eine konstante Fläche hat oder sich sehr ähnlich wie Ihre Amöbengrenze verhält.

Also würde ich sagen: Implementiere den String. ;) Die meisten Physikbibliotheken können Federn erstellen (in Box2D sieht dies wie das Distanzgelenk aus), und der einfachste Weg, eine Zeichenfolge zu erstellen, besteht darin, viele Zeichenfolgen miteinander zu verbinden. Verbinden Sie den letzten mit dem ersten, um eine Schleife zu erstellen. Stellen Sie sicher, dass die Federn in der Saite eine ausreichend hohe Federkonstante haben, um nicht gespannt zu werden - Sie möchten, dass sie ziemlich steif sind und sich im Einklang bewegen, nicht ausdehnen.

Als Nächstes erstellen Sie Kräfte, die auf die Zeichenfolge einwirken. Trivialerweise erzeugen Ihre beiden Kerne / Augen / Kontrollpunkte Kräfte auf die Punkte, aus denen die Saite besteht. Lassen Sie die Kraft mit einer umgekehrten quadratischen Funktion abfallen:

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

Und richten Sie die Kraft direkt vom Kontrollauge / Ball weg, wie eine abstoßende Kraft, die vom Ball ausgeht. Drücke K, um die Stärke der Kraft zu kontrollieren. Stellen Sie sicher, dass K nicht zu hoch ist - Sie möchten nicht, dass es durch die Kraft massiv herausgedrückt wird, sondern halten es einfach von den Bällen fern. Lassen Sie viel Spiel in Ihrer Saite.

Wenn Sie nur diese beiden verwenden, werden Sie wahrscheinlich eine ziemlich einheitliche Form haben. Daher würde ich Ihnen auch vorschlagen, in der umgebenden "Suppe" schwächere Kräfte zu erzeugen, um die Form der Amöbe zu ändern. Sie können diese zufälligen Stellen erzeugen, ihre Kraft regelmäßig ändern (Sie können sie zu einer Sinusfunktion für schöne Bewegungen machen) und sie auf die gleiche Weise wie die Kugeln wirken lassen.

Vagination (Fnarr): Dies ist die schwierige. Sie veranlassen das Objekt, ein Objekt einzuhüllen, indem Sie überprüfen, ob zwei nicht benachbarte Punkte in der Zeichenfolge nahe genug beieinander liegen. In diesem Fall müssen Sie Folgendes tun:

Messen Sie den Abstand zwischen den Punkten auf der Schnur. Zählen Sie die Anzahl der Federteile. Finde den 'kürzeren' Weg von A nach B.

Brechen Sie die Schnur und verbinden Sie sie wieder mit den beiden benachbarten Punkten. Mit anderen Worten, verbinden Sie Punkt A direkt mit Punkt B und verwerfen Sie alles dazwischen liegende Material.

Fügen Sie die fehlende Anzahl von Punkten (plus Bonuspunkte, wenn Sie die Größe durch Essen erweitern möchten) erneut in die Zeichenfolge auf der anderen Seite ein, dh auf der Seite von B nach A. Wenn Sie sie gleichmäßig entlang der Länge und einfügen Wenn Sie sie kürzer als den gewünschten Abstand zwischen den Punkten machen, sollten Sie einen schönen Spring-Expandy-Effekt erzielen.

Ich denke, das deckt alles ab. Übrigens: Idee klingt großartig.


18
FWIW, während ich wie diese Lösung im Großen und Ganzen Ihre Intuition über das Innere der String - Konstante Fläche ist falsch - der Kreis mit dem gebundenen zusammen String als Grenze aus jeder Form maximale Fläche aufweist. Der einfachste Weg, um zu sehen, dass es sich ändert, besteht darin, sich vorzustellen, wie man die Saite „zerquetscht“, indem man zwei Enden straff zieht. dann kann die Form, die Sie erhalten (ob Rechteck oder Ellipse oder was Sie haben), niemals breiter als die Hälfte des Umfangs werden, aber ihre Höhe schrumpft auf Null, sodass die Fläche (die durch width * height begrenzt ist) ebenfalls auf Null schrumpft.
Steven Stadnicki

1
Ich denke, Sie meinten "... um eine Saite herzustellen, müssen Sie viele Federn miteinander verbinden."
Richard Marskell - Drackir

8

Damit Sie die Endozytose (den Prozess, bei dem die Zelle externe Kerne frisst) simulieren können, stößt jeder Kern innerhalb und außerhalb der Amöbe die Grenze der Amöbe ab. Die Kerne innerhalb der Amöbe haben eine mäßig starke abstoßende Wirkung, während die Kerne außerhalb eine geringe abstoßende Wirkung haben. Dies ist unten dargestellt.

Bildbeschreibung hier eingeben

Wenn sich der äußere Kern (rot) der Amöbe nähert, erzeugt sein abstoßendes Feld eine kreisförmige Einkerbung in der Amöbe. Schließlich berühren sich die beiden Seiten (grün hervorgehoben). Wenn eine solche Kollision erkannt wird, wird der kreisförmige Einzug gelöscht und alles, was sich darin befindet, wird verbraucht.

Dies imitiert den Prozess der Endozytose sehr gut und ergibt einen schönen visuellen Effekt.

Was die Simulation der Grenze der Amöbe angeht, so gefällt mir die Idee von Matt Kemp, eine sehr große Anzahl verbundener Federn zu verwenden. Dies behält keine konstante Fläche bei, sondern einen konstanten Umfang. Im wirklichen Leben kann Wasser frei in eine Zellmembran hinein und aus dieser heraus fließen (die Amöbengrenze), so dass Zellen kein konstantes Volumen haben.


Einige andere Ideen, um das Spiel realistisch zu gestalten, wären, den Salzgehalt von Zellen irgendwie zu verändern. Wenn die Salzkonzentration innerhalb und außerhalb einer Zelle nicht übereinstimmt, strömt Wasser durch die Zellmembran zu dem Ort mit dem höheren Salzgehalt, der als Osmose bezeichnet wird. Wenn die Amöbe einen hohen Salzgehalt hätte, hätte sie ein größeres Volumen, aber der Umfang würde sich nicht ändern. Im Spiel könnte dies simuliert werden, indem den inneren Kernen eine höhere Abstoßungswirkung verliehen wird, wenn der Salzgehalt höher ist.

Da ein höherer Salzgehalt den Kernen eine höhere abstoßende Wirkung verleihen würde, hat dies den Vorteil, dass die Amöbe leichter zu kontrollieren ist. Ein geringerer Salzgehalt würde dazu führen, dass sich die Amöbe unter dem Einfluss der Umgebung leichter biegt und biegt. Dies hat den Vorteil, dass andere Kerne leichter gefressen werden können, da die Amöbe sie leichter umgeben kann.


3

Um den grafischen Effekt zu erzielen, würden Sie höchstwahrscheinlich Metabälle verwenden (es gibt viele Online-Tutorials)


2

Nun, ich kenne ein Lernspiel namens CellCraft (allerdings ohne Bezug zu Minecraft), bei dem zellähnliche Kreaturen gesteuert werden, deren Bewegungen denen sehr ähnlich sind, die Sie benötigen. Das Spiel ist kostenlos und wahrscheinlich wichtiger ist, dass sie auf ihrer Website klar angegeben haben, dass sie beabsichtigen, den Quellcode kostenlos zur Verfügung zu stellen. Es wurde in ActionScript 3 erstellt und ist ein Flash-basiertes Spiel.

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


1

Ich würde dies tun, indem ich eine Saitenschleife simuliere, die der von Matt Kemp vorgeschlagenen ähnelt, aber das Innere mit Teilchen füllt, die sich gegenseitig und die Saite abstoßen. Auf diese Weise stellen Sie eine ungefähre Volumenerhaltung sicher. Sie müssen darauf achten, dass keine großen Kräfte auf die Partikel einwirken.

Suchen Sie nach "Hydrodynamik geglätteter Partikel" für die Simulation der Partikel und nach "Verlet-Integration" für die Simulation der Partikel (und der Zeichenfolge). Verlet ist eine positionsbasierte Technik und daher sehr einfach und stabil.

Um die Dinge effizient zu halten, würde ich ein "einheitliches räumliches Rasterteilungssystem" vorschlagen. Auch dies ist einfach zu implementieren und beschleunigt die Arbeit erheblich.

Sie können auch Metabälle verwenden, um das Objekt zu visualisieren, anstatt die Zeichenfolge zu verwenden. Aber dann haben Sie das Problem, dass sich Partikel in separate Klumpen trennen können. Suchen Sie nach "Van-der-Waals-Kräften", um festzustellen, ob das Gleichgewicht zwischen Anziehung und Abstoßung zu Verklumpungen führt.

Ein anderer Ansatz wäre, den Saitenteilchen eine kleine "Aufblas" -Kraft in Richtung ihrer "äußeren" Normalen zu verleihen. Dies simuliert eine Art Innendruck. Das Ergebnis ist, dass die Schleife versucht, eine Kreisform beizubehalten. Das ist , was ich für verwenden diese .

Ich hoffe es hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.