Tengo una mecánica de juego de "ameba". ¿Alguna idea sobre cómo implementarlo?


19

Fuera de un clon de tetris , un juego de disparos en 2D de arriba hacia abajo y algunos juegos con Unity y Flixel, me doy cuenta de que todavía tengo que completar un juego único , pulido, de campanas y silbatos. Quiero cambiar esto, y tengo una idea para mi próximo proyecto.

La idea es que eres una ameba. Las amebas tienen estos núcleos similares a los ojos (o algo así, no sé biología), y tú tienes dos de ellos. Usted controla uno con WASDy el otro con IJKL. Tiene que haber un radio constante de cosas alrededor de cada uno de los núcleos:

2meba1

Y el área de la ameba tiene que mantenerse constante. Entonces, si mueve un núcleo en una dirección, aumenta el área de la ameba, pero ese aumento se compensa con una disminución en otro lugar:

2meba2

Aaaaay me gustaría implementar una mecánica de vaginación . Absorbes las cosas envolviéndolas, como un jefe. Tal vez incluso un núcleo adicional, o una aguja que te explote y haga que todas tus cosas internas comiencen a brotar :

2meba3

Pero aquí está el problema: no sé cómo hacer esto. Sin embargo, me gustaría algunas ideas sobre cómo implementarlo. ¿Debería explorar bibliotecas de física como Box2D? ¿O tal vez algo relacionado con la física de fluidos? Cualquier ayuda sería muy apreciada.

PD: siéntase libre de robar esta idea. Tengo muchas ideas Si lo hace, dígame cómo lo hizo para que pueda probarlo yo mismo.


3
Las formas sustantivas y verbales son invaginación e invaginar respectivamente, FYI. (Yo sí hice biología). Buenas fotos.
Ingeniero

2
¿de dónde sacaste ese dulce papel negro?
brendan

55
@brendan: Si intercambias negro con blanco, rojo con azul y blanco con negro, se hace mucho más evidente de dónde obtuvo este "papel negro". ;)
knight666

1
Ustedes son demasiado listos: D
Jason Tu

Respuestas:


16

Fuera de mi cabeza, la cláusula que me llama la atención es que quieres que el área sea constante. Eso me parece el dolor en todo esto, así que tratemos de encontrar una solución fácil para eso.

Tome un trozo de cuerda y ate los extremos para formar un círculo. Puedo estar equivocado, pero mi intuición dice que el interior de esa cuerda tiene un área constante, o actuaría de manera muy parecida a su límite de ameba.

Entonces diría: implementar la cadena. ;) La mayoría de las bibliotecas de física pueden hacer resortes (en Box2D se parece a la unión de distancia), y la forma más fácil de hacer una cadena es conectar muchas cadenas juntas. Únete al último hasta el primero para crear un bucle. Asegúrese de que los resortes en la cuerda tengan una constante de resorte lo suficientemente alta como para que no se estiren; desea que sean bastante rígidos y se muevan al unísono, no se expandan.

A continuación, cree fuerzas para actuar sobre la cadena. Trivialmente, sus dos núcleos / ojos / puntos de control crean fuerzas sobre los puntos que forman la cadena. Haz que la fuerza se caiga con una función de cuadrado inverso:

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

Y haga que la dirección de la fuerza se aleje directamente del ojo / bola de control, como una fuerza repelente que emana de la bola. Ajusta K para controlar la fuerza de la fuerza. Asegúrate de que K no sea demasiado alto: no quieres que la fuerza lo expulse masivamente, solo mantenlo alejado de las bolas. Deje mucha holgura en su cuerda.

Con solo esos dos, probablemente terminará con una forma bastante uniforme, por lo que también le sugiero que cree algunas fuerzas más débiles en la 'sopa' circundante para cambiar la forma de la ameba. Puede hacer estos lugares aleatorios, cambiar su fuerza regularmente (podría hacer que sea una función sinusoide para movimientos agradables) y hacer que funcionen de la misma manera que las bolas.

Vaginación (fnarr): esta es la difícil. Puede hacer que envuelva un objeto verificando si dos puntos no adyacentes en la cadena han logrado acercarse lo suficiente, y si es así, necesita:

Mida la distancia entre los puntos en la cuerda. Cuente el número de secciones de primavera. Encuentre el camino 'más corto' de A a B.

Rompa la cuerda y vuelva a unirla con los dos puntos adyacentes. En otras palabras, une directamente el punto A al punto B y descarta todas las cosas intermedias.

Vuelva a insertar el número faltante de puntos (más los puntos de bonificación si desea ampliar su tamaño al comer algo) en la cuerda en el otro lado, es decir, el lado de B a A. Si los inserta por igual a lo largo y hazlos más cortos que la distancia deseada entre puntos, deberías obtener un agradable efecto elástico y expansivo.

creo que lo cubre todo. Por cierto: la idea suena increíble.


18
FWIW, aunque me gusta esta solución en general, su intuición sobre el interior de la cadena que tiene un área constante es incorrecta: el círculo tiene un área máxima fuera de cualquier forma con esa cadena unida como límite. La forma más fácil de ver que varía es imaginar "apretando" la cuerda tirando de dos extremos tensos; entonces la forma que obtienes (ya sea rectángulo o elipse o lo que tienes) nunca puede ser más ancha que la mitad del perímetro, pero su altura se reduce a cero, por lo que el área (que está limitada por el ancho * altura) también se reduce a cero.
Steven Stadnicki

1
Creo que querías decir "... hacer una cadena es conectar muchos resortes ".
Richard Marskell - Drackir

8

Para que pueda simular la endocitosis (el proceso de la célula que come los núcleos externos), cada núcleo, tanto dentro como fuera de la ameba, repelerá el límite de la ameba. Los núcleos dentro de la ameba tendrán un efecto repulsivo moderadamente fuerte, mientras que los de afuera tendrán un pequeño efecto repulsivo. Esto se ilustra a continuación.

ingrese la descripción de la imagen aquí

A medida que el núcleo externo (rojo) se acerca a la ameba, su campo repulsivo creará una sangría circular en la ameba. Finalmente, los dos lados (resaltados en verde) se tocarán entre sí. Cuando se detecta una colisión como esta, la sangría circular se borra y se consume lo que sea dentro de ella.

Esto imita bastante bien el proceso de endocitosis y proporciona un agradable efecto visual.

En cuanto a simular el límite de la ameba, me gusta la idea de Matt Kemp de utilizar una gran cantidad de resortes conectados. Esto no mantiene un área constante, sino un perímetro constante. En la vida real, el agua puede fluir libremente dentro y fuera de la membrana celular (el límite de la ameba), por lo que las células no tienen un volumen constante.


Algunas otras ideas para hacer que el juego sea realista sería poder modificar el contenido de sal de las células de alguna manera. Cuando la concentración de sal en el interior y el exterior de una célula no coincide, el agua se precipita a través de la membrana celular hacia el lugar con mayor contenido de sal en un proceso llamado ósmosis. Si la ameba tiene un alto contenido de sal, tendría un volumen mayor, pero el perímetro no cambiaría. En el juego, esto podría simularse dando a los núcleos internos un mayor efecto repulsivo si el contenido de sal es mayor.

Dado que un mayor contenido de sal daría a los núcleos un mayor efecto repulsivo, tiene la ventaja de hacer que la ameba sea más fácil de controlar. Tener un contenido de sal más bajo causaría que la ameba se flexione y doble más fácilmente bajo la influencia del medio ambiente. Esto tiene la ventaja de poder comer otros núcleos más fácilmente, ya que la ameba podría rodearlo más fácilmente.


3

Bueno, para hacer el efecto gráfico, lo más probable es que uses metaballs (hay muchos tutoriales en línea para ellos)


2

Bueno, sé de un juego educativo llamado CellCraft (aunque no tiene relación con Minecraft) que implica controlar una criatura similar a una célula que tiene movimientos muy similares a los que necesitas. El juego es gratuito y probablemente lo más importante es que declararon claramente en su sitio que tienen la intención de hacer que el código fuente esté disponible de forma gratuita y que se creó en ActionScript 3 y es un juego basado en flash.

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


1

La forma en que lo haría es simular un bucle de cuerda similar a la forma en que Matt Kemp sugirió, pero llenar el interior con partículas que se repelen entre sí y con la cuerda. De esta manera asegurará la conservación del volumen aproximado. Tendrá que asegurarse de que fuerzas grandes no golpeen las partículas afuera.

Busque "hidrodinámica de partículas suavizadas" para simular las partículas y "integración verlet" para simularlas (y la cuerda). Verlet es una técnica basada en la posición, por lo que es muy simple y estable.

Para mantener las cosas eficientes, sugeriría un sistema de "partición espacial de cuadrícula uniforme". Nuevamente, fácil de implementar y ofrece grandes aceleraciones.

También podría usar metabolas para visualizar el objeto en lugar de usar la cadena. Pero entonces tienes el problema de que las partículas pueden separarse en grupos separados. Busque "Fuerzas de Van der Waals" para encontrar el equilibrio de atracción / repulsión que conduce a la aglomeración.

Otro enfoque sería proporcionar una pequeña fuerza de 'inflado' a las partículas de cuerda en la dirección de sus normales 'externas'. Esto simulará un tipo de presión interna. El resultado es que el bucle intentará mantener una forma circular. Eso es lo que usé para esto .

Espero eso ayude.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.