Ho una meccanica di gioco "ameba". Qualche idea su come implementarlo?


19

Al di fuori di un clone di tetris , di uno schifoso sparatutto top-down 2D e di alcuni scherzi con cose come Unity e Flixel, mi rendo conto che devo ancora completare un singolo , raffinato gioco di campane e fischietti. Voglio cambiarlo e ho un'idea per il mio prossimo progetto.

L'idea è che sei un'ameba. Gli amebe hanno questi nuclei simili agli occhi (o qualcosa del genere, non conosco la biologia), e tu ne hai due. Controlli uno con WASDe l'altro con IJKL. Ci deve essere un raggio costante di roba attorno a ciascuno dei nuclei:

2meba1

E l'area dell'ameba deve rimanere costante. Quindi se sposti un nucleo in una direzione, aumenti l'area dell'ameba, ma tale aumento è compensato da una diminuzione altrove:

2meba2

Aaaaa e vorrei implementare un meccanico di vaginazione . Assorbi le cose inghiottendole, come un capo. Forse anche un nucleo aggiuntivo o un ago che ti fa esplodere e fa sì che tutte le tue cose interne inizino a sgorgare :

2meba3

Ma ecco il problema: non so come farlo. Tuttavia, vorrei alcune idee su come implementarlo. Dovrei esplorare le librerie di fisica come Box2D? O forse qualcosa che coinvolge la fisica dei fluidi? Qualsiasi aiuto sarebbe molto apprezzato.

PS Sentiti libero di rubare questa idea. Ho molte idee. Se lo fai, per favore dimmi come l'hai fatto in modo che io possa provarlo da solo.


3
Le forme verbali e verbali sono rispettivamente invaginazione e invaginazione , FYI. (Ho fatto biologia.) Belle foto.
Ingegnere,

2
dove hai preso quella dolce carta nera?
brendan,

5
@brendan: se si scambia nero con bianco, rosso con blu e bianco con nero, diventa molto più evidente dove ha ottenuto questa "carta nera". ;)
knight666,

1
Siete troppo intelligenti: D
Jason Tu il

Risposte:


16

Dalla parte superiore della mia testa, la clausola che mi sporge è che vuoi che l'area sia costante. Questo mi colpisce come il dolore in tutto questo, quindi proviamo a trovare una soluzione semplice a questo.

Prendi un pezzo di spago e lega le estremità per formare un cerchio. Potrei sbagliarmi, ma la mia intuizione dice che l'interno di quella stringa ha un'area costante, o si comporterebbe in modo terribile come il confine dell'ameba.

Quindi direi: implementa la stringa. ;) La maggior parte delle librerie di fisica può fare molle (in Box2D questo sembra il giunto di distanza), e il modo più semplice per creare una stringa è collegare molte stringhe insieme. Unisci l'ultimo fino al primo per creare un loop. Assicurati che le molle nella corda abbiano una costante di molla abbastanza alta da non distanziarsi - vuoi che siano abbastanza rigide e si muovano all'unisono, non per espandersi.

Quindi, crea forze per agire sulla stringa. In sostanza, i tuoi due core / occhi / punti di controllo creano forze sui punti che compongono la corda. Fai cadere la forza con una funzione quadrata inversa:

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

E fai allontanare la direzione della forza dall'occhio / palla di controllo, come una forza repellente che emana dalla palla. Modifica K per controllare la forza della forza. Assicurati che K non sia troppo alto - non vuoi che venga espulso in modo massiccio dalla forza, tienilo lontano dalle palle. Lascia un sacco di gioco nella corda.

Con solo quei due probabilmente finirai con una forma abbastanza uniforme, quindi suggerirei anche di creare alcune forze più deboli nella "zuppa" circostante per cambiare la forma dell'ameba. Puoi creare questi posti casuali, cambiarne regolarmente la forza (potresti renderlo una funzione sinusoidale per movimenti piacevoli) e farli funzionare allo stesso modo delle palle.

Vaginazione (fnarr): questa è quella difficile. Lo fai avvolgere un oggetto controllando se due punti non adiacenti sulla stringa sono riusciti ad avvicinarsi abbastanza e, in tal caso, devi:

Misura la distanza tra i punti sulla corda. Conta il numero di sezioni di molla. Trova il percorso "più breve" da A a B.

Rompere la stringa e ricollegarla con i due punti adiacenti. In altre parole, unisci direttamente il punto A al punto B e scarta tutte le cose in mezzo.

Reinserisci il numero mancante di punti (più eventuali punti bonus se vuoi allargare le dimensioni mangiando qualcosa) nella stringa nell'altro lato - cioè, il lato da B ad A. Se li inserisci ugualmente lungo la lunghezza e rendendoli più corti della distanza desiderata tra i punti, dovresti ottenere un piacevole effetto elastico-espansivo.

Penso che copra tutto. A proposito: l'idea sembra fantastica.


18
FWIW, mentre nel complesso mi piace questa soluzione, la tua intuizione sull'interno della stringa con area costante è sbagliata - il cerchio ha un'area massima fuori da qualsiasi forma con quella stringa legata come limite. Il modo più semplice per vedere che varia è immaginare di "schiacciare" la corda tirando due estremità; quindi la forma che ottieni (che sia rettangolo o ellisse o what-have-you) non può mai diventare più larga della metà del perimetro, ma la sua altezza si riduce a zero, quindi anche l'area (che è delimitata da larghezza * altezza) si riduce a zero.
Steven Stadnicki,

1
Penso che volevi dire "... fare una stringa è connettere molte molle insieme".
Richard Marskell - Drackir,

8

Per simulare l'endocitosi (il processo della cellula che mangia i nuclei esterni), ogni nucleo, sia all'interno che all'esterno dell'ameba, respingerebbe il confine dell'ameba. I nuclei all'interno dell'ameba avranno un effetto repulsivo moderatamente forte, mentre quelli all'esterno avranno un piccolo effetto repulsivo. Questo è illustrato di seguito.

inserisci qui la descrizione dell'immagine

Man mano che il nucleo esterno (rosso) si avvicina all'ameba, il suo campo repulsivo creerà una rientranza circolare nell'ameba. Alla fine, le due parti (evidenziate in verde) si toccheranno. Quando viene rilevata una collisione come questa, l'indentazione circolare viene cancellata e qualsiasi cosa al suo interno viene consumata.

Questo imita abbastanza bene il processo di endocitosi e dà un piacevole effetto visivo.

Per quanto riguarda la simulazione del confine dell'ameba, mi piace l'idea di Matt Kemp di utilizzare un numero molto elevato di molle collegate. Questo non mantiene un'area costante, ma un perimetro costante. Nella vita reale, l'acqua può fluire liberamente dentro e fuori una membrana cellulare (il confine dell'ameba), quindi le cellule non hanno un volume costante.


Alcune altre idee per rendere realistico il gioco sarebbero in grado di modificare il contenuto di sale delle cellule in qualche modo. Quando la concentrazione di sale all'interno e all'esterno di una cellula non coincide, l'acqua scorre attraverso la membrana cellulare verso il luogo con il più alto contenuto di sale in un processo chiamato osmosi. Se l'ameba ha un alto contenuto di sale, avrebbe un volume maggiore, ma il perimetro non cambierebbe. Nel gioco, questo potrebbe essere simulato dando ai nuclei interni un maggiore effetto repulsivo se il contenuto di sale è più alto.

Poiché un contenuto di sale più elevato darebbe ai nuclei un maggiore effetto repulsivo, ha il vantaggio di rendere più facile il controllo dell'ameba. Avere un contenuto di sale inferiore farebbe flettere e piegare l'ameba sotto l'influenza dell'ambiente. Ciò ha il vantaggio di poter mangiare più facilmente altri nuclei, poiché l'ameba sarebbe in grado di circondarlo più facilmente.


3

Bene per fare l'effetto grafico che molto probabilmente useresti i metaballs (ci sono molti tutorial online per loro)


2

Beh, conosco un gioco educativo chiamato CellCraft (nessuna relazione con Minecraft però) che prevede il controllo di una creatura simile a una cellula che ha movimenti molto simili a quelli di cui hai bisogno. Il gioco è gratuito e probabilmente più importante è che hanno dichiarato chiaramente sul loro sito che intendono rendere disponibile gratuitamente il codice sorgente ed è stato realizzato in ActionScript 3 ed è un gioco basato su Flash.

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


1

Il modo in cui farei questo è simulare un anello di stringa simile a quello suggerito da Matt Kemp, ma riempire l'interno di particelle che si respingono a vicenda e la corda. in questo modo assicurerai una conservazione approssimativa del volume. Dovrai fare attenzione per garantire che forze estese non colpiscano le particelle all'esterno.

Cercare "idrodinamica delle particelle levigate" per la simulazione delle particelle e "integrazione dei verlet" per simularle (e la stringa). Verlet è una tecnica basata sulla posizione, quindi è molto semplice e stabile.

Per mantenere le cose efficienti, suggerirei un sistema di "partizionamento spaziale della griglia uniforme". Ancora una volta, facile da implementare e produce grandi accelerazioni.

È inoltre possibile utilizzare metaballs per visualizzare l'oggetto anziché utilizzare la stringa. Ma poi hai il problema che le particelle potrebbero separarsi in gruppi separati. Cerca "Forze di Van der Waals" per trovare l'equilibrio attrazione / repulsione che porta all'aggregazione.

Un altro approccio sarebbe quello di fornire una piccola forza "gonfia" alle particelle di stringa nella direzione delle loro normali "esterne". Questo simulerà una sorta di pressione interna. Il risultato è che il loop tenterà di mantenere una forma circolare. Questo è quello che ho usato per questo .

Spero che sia d'aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.