J'ai un mécanicien de jeu «amibe». Une idée sur la façon de le mettre en œuvre?

19

En dehors d'un clone de tetris , d'un jeu de tir 2D de haut en bas et de quelques trucs comme Unity et Flixel, je me rends compte que je n'ai pas encore terminé un seul jeu poli de cloches et de sifflets. Je veux changer cela, et j'ai une idée pour mon prochain projet.

L'idée est que vous êtes une amibe. Les amibes ont ces noyaux oculaires (ou quelque chose comme ça, je ne connais pas la biologie), et vous en avez deux. Vous contrôlez l'un avec WASDet l'autre avec IJKL. Il doit y avoir un rayon constant de substance autour de chacun des noyaux:

2meba1

Et la zone de l'amibe doit rester constante. Donc, si vous déplacez un noyau dans une direction, vous augmentez la surface de l'amibe, mais cette augmentation est compensée par une diminution ailleurs:

2meba2

Aaaaa et j'aimerais mettre en place un mécanicien de vaginisation . Vous absorbez les choses en les engloutissant, comme un patron. Peut-être même un noyau supplémentaire, ou une aiguille qui vous éclate et fait jaillir toutes vos affaires intérieures :

2meba3

Mais voici le problème: je ne sais pas comment faire ça. Cependant, j'aimerais avoir quelques idées sur la façon de le mettre en œuvre. Dois-je explorer des bibliothèques de physique comme Box2D? Ou peut-être quelque chose impliquant la physique des fluides? Toute aide serait très appréciée.

PS N'hésitez pas à voler cette idée. J'ai plein d'idées. Si vous le faites, dites-moi comment vous l'avez fait pour que je puisse l'essayer moi-même.

Jason Tu
la source
3
Les formes nominales et verbales sont respectivement l' invagination et l' invagination , FYI. (J'ai fait de la biologie.) Belles photos.
Ingénieur
2
où avez-vous obtenu ce doux papier noir?
brendan
5
@brendan: Si vous échangez du noir avec du blanc, du rouge avec du bleu et du blanc avec du noir, il devient beaucoup plus évident d'où il a obtenu ce "papier noir". ;)
knight666
1
Vous êtes trop intelligents: D
Jason Tu

Réponses:

16

Du haut de ma tête, la clause qui me vient à l'esprit est que vous voulez que la zone soit constante. Cela me semble être la douleur dans tout cela, alors essayons de trouver une solution facile à cela.

Prenez un morceau de ficelle et attachez les extrémités pour former un cercle. Je peux me tromper, mais mon intuition dit que l'intérieur de cette chaîne a une zone constante, ou agirait énormément comme votre limite d'amibe.

Je dirais donc: implémentez la chaîne. ;) La plupart des bibliothèques de physique peuvent faire des ressorts (dans Box2D, cela ressemble à l'articulation de distance), et la façon la plus simple de créer une chaîne est de connecter de nombreuses chaînes ensemble. Rejoignez le dernier jusqu'au premier pour créer une boucle. Assurez-vous que les ressorts de la chaîne ont une constante de ressort suffisamment élevée pour ne pas être étirés - vous voulez qu'ils soient assez rigides et bougent à l'unisson, pas pour s'étendre.

Ensuite, créez des forces pour agir sur la chaîne. Trivialement, vos deux noyaux / yeux / points de contrôle créent des forces sur les points qui composent la chaîne. Faites tomber la force avec une fonction de carré inverse:

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

Et éloignez la direction de la force directement de l'œil / balle de contrôle, comme une force répulsive émanant de la balle. Tweak K pour contrôler la force de la force. Assurez-vous que K n'est pas trop haut - vous ne voulez pas qu'il soit simplement poussé massivement par la force, tenez-le simplement à l'écart des balles. Laissez beaucoup de mou dans votre chaîne.

Avec juste ces deux-là, vous vous retrouverez probablement avec une forme assez uniforme, donc je vous suggère également de créer des forces plus faibles autour de la `` soupe '' environnante pour changer la forme de l'amibe. Vous pouvez créer ces endroits aléatoires, changer régulièrement leur force (vous pouvez en faire une fonction sinusoïdale pour de beaux mouvements) et les faire fonctionner de la même manière que les balles.

Vagination (fnarr): c'est la plus difficile. Vous le faites envelopper un objet en vérifiant si deux points non adjacents sur la chaîne ont réussi à se rapprocher suffisamment, et si c'est le cas, vous devez:

Mesurez la distance entre les points de la chaîne. Comptez le nombre de sections de ressort. Trouvez le chemin «le plus court» de A à B.

Brisez la chaîne et rejoignez-la avec les deux points adjacents. En d'autres termes, joignez directement le point A au point B et jetez toutes les choses entre les deux.

Réinsérez le nombre de points manquants (plus les points bonus si vous souhaitez augmenter la taille en mangeant quelque chose) dans la chaîne de l'autre côté - c'est-à-dire le côté de B à A. Si vous les insérez également sur la longueur et les rendre plus courts que la distance souhaitée entre les points, vous devriez obtenir un bel effet élastique et extensible.

Je pense que cela couvre tout. Au fait: l'idée semble géniale.

Matt Kemp
la source
18
FWIW, bien que j'aime cette solution dans son ensemble, votre intuition à propos de l'intérieur de la chaîne ayant une aire constante est erronée - le cercle a une aire maximale hors de toute forme avec cette chaîne attachée ensemble comme frontière. La façon la plus simple de voir qu'elle varie est d'imaginer «écraser» la corde en tirant sur deux extrémités tendues; alors la forme que vous obtenez (que ce soit un rectangle ou une ellipse ou ce que vous avez) ne peut jamais être plus large que la moitié du périmètre, mais sa hauteur se réduit à zéro, de sorte que la zone (qui est délimitée par largeur * hauteur) se réduit également à zéro.
Steven Stadnicki
1
Je pense que vous vouliez dire "... faire une chaîne, c'est connecter beaucoup de ressorts ensemble."
Richard Marskell - Drackir
8

Pour que vous puissiez simuler l'endocytose (le processus de la cellule mangeant des noyaux externes), chaque noyau, à l'intérieur et à l'extérieur de l'amibe, repousserait la limite de l'amibe. Les noyaux à l'intérieur de l'amibe auront un effet répulsif modérément fort, tandis que ceux à l'extérieur auront un petit effet répulsif. Ceci est illustré ci-dessous.

entrez la description de l'image ici

Lorsque le noyau extérieur (rouge) s'approche de l'amibe, son champ répulsif créera une indentation circulaire dans l'amibe. Finalement, les deux côtés (surlignés en vert) se toucheront. Lorsqu'une collision comme celle-ci est détectée, l'indentation circulaire est effacée et tout ce qui se trouve à l'intérieur est consommé.

Cela imite assez bien le processus d'endocytose et donne un bel effet visuel.

Quant à la simulation de la frontière de l'amibe, j'aime l'idée de Matt Kemp d'utiliser un très grand nombre de ressorts connectés. Cela ne maintient pas une zone constante, mais un périmètre constant. Dans la vraie vie, l'eau peut entrer et sortir librement d'une membrane cellulaire (la frontière de l'amibe), de sorte que les cellules n'ont pas un volume constant.


D'autres idées pour rendre le jeu réaliste seraient de pouvoir modifier la teneur en sel des cellules d'une manière ou d'une autre. Lorsque la concentration de sel à l'intérieur et à l'extérieur d'une cellule ne correspond pas, l'eau se précipite à travers la membrane cellulaire vers l'endroit avec la plus grande teneur en sel dans un processus appelé osmose. Si l'amibe a une teneur élevée en sel, elle aurait un volume plus important, mais le périmètre ne changerait pas. Dans le jeu, cela pourrait être simulé en donnant aux noyaux intérieurs un effet répulsif plus élevé si la teneur en sel est plus élevée.

Puisqu'une teneur en sel plus élevée donnerait aux noyaux un effet répulsif plus élevé, elle a l'avantage de rendre l'amibe plus facile à contrôler. Une teneur en sel plus faible entraînerait une flexion et une flexion de l'amibe sous l'influence de l'environnement. Cela a l'avantage de pouvoir manger plus facilement les autres noyaux, car l'amibe pourrait l'entourer plus facilement.

PhiNotPi
la source
3

Eh bien, pour faire l'effet graphique, vous utiliseriez très probablement des métabilles (il y a beaucoup de tutoriels en ligne pour eux)

CobaltHex
la source
2

Eh bien, je connais un jeu éducatif appelé CellCraft (sans relation avec Minecraft) qui implique de contrôler une créature semblable à une cellule qui a des mouvements très similaires à ce dont vous avez besoin. Le jeu est gratuit et probablement plus important, ils ont clairement indiqué sur leur site qu'ils avaient l'intention de rendre le code source disponible gratuitement et il a été créé en ActionScript 3 et est un jeu basé sur le flash.

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

Tenacious D
la source
1

La façon dont je procéderais est de simuler une boucle de cordes similaire à celle suggérée par Matt Kemp, mais remplit l'intérieur de particules qui se repoussent et la corde. vous garantissez ainsi une conservation approximative du volume. Vous devrez vous assurer que les forces importantes ne frappent pas les particules à l'extérieur.

Recherchez «hydrodynamique des particules lissées» pour la simulation des particules et «intégration de verlet» pour les simuler (et la chaîne). Verlet est une technique basée sur la position, elle est donc très simple et stable.

Pour garder les choses efficaces, je suggère un système de "partitionnement spatial uniforme de la grille". Encore une fois, facile à implémenter et vous obtenez de grandes accélérations.

Vous pouvez également utiliser des métaballes pour visualiser l'objet au lieu d'utiliser la chaîne. Mais alors vous avez le problème que les particules peuvent se séparer en amas séparés. Recherchez les «forces de Van der Waals» pour un équilibre attraction / répulsion conduisant à une agglomération.

Une autre approche consisterait à fournir une petite force de «gonflement» aux particules de corde dans la direction de leurs normales «extérieures». Cela simulera une sorte de pression interne. Le résultat est que la boucle tentera de conserver une forme de cercle. C'est ce que j'ai utilisé pour ça .

J'espère que cela aide.

DaleyPaley
la source