¿Cómo funcionan las animaciones de interacción personaje / objeto en juegos isométricos?

10

Estoy planeando un juego de simulación de negocios isométrico donde el jugador ve una oficina con los muebles habituales, como escritorios, pizarras, etc.

Los personajes (Staff / NPC's) dentro del juego deben interactuar con estos objetos realizando algunas tareas predefinidas como escribir en el teclado en el escritorio o escribir en la pizarra, etc.

Lo que me interesa, específicamente, es el siguiente escenario:

El personaje se mueve a través de la oficina (1) a su escritorio (2) y se sienta y comienza a escribir (3).

Por lo que entiendo, tendría una hoja de sprites para el movimiento del personaje (1) y un sprite estático para el escritorio (2), pero no entiendo cómo se manejaría el tercer paso.

¿Hay un sprite combinado que contenga tanto el escritorio como el personaje? Supongo que no, de lo contrario necesitaría tener una hoja de sprites para cada combinación de escritorio y personaje.

¿Cómo se maneja esto normalmente?

EDITAR:

Aquí hay una animación de ejemplo específica del juego Theme Hospital. Puedes ver el video aquí .

Hasta donde puedo ver, la animación se divide en varios pasos.

Paso 1 - El personaje se mueve entre el escritorio y la silla.

ingrese la descripción de la imagen aquí

Esto sugiere que la silla y el escritorio son de hecho sprites separados.

Paso 2: el personaje se sienta en la animación

ingrese la descripción de la imagen aquí

Observe cómo en el último cuadro la silla está más cerca del escritorio.

Paso 3: animaciones de escritorio

ingrese la descripción de la imagen aquí

Paso 4 - Animación de pie

Es lo mismo que sentarse pero jugar al revés.

Paso 5 - Aléjate

Utilice la animación de movimiento normal para alejarse.

La pregunta que tengo es cómo se separan mejor estas animaciones y cómo un artista gráfico generalmente las proporcionaría.

¿Está el personaje sentado y escribiendo en el escritorio en realidad tres sprites diferentes (escritorio, personaje y silla)? ¿Alguien sabe algún ejemplo de sprites de animaciones similares?

EDITAR 2:

Supongo que mi mayor preocupación es que tengo las expectativas correctas sobre cómo se verán realmente los sprites. No puedo dibujarlos yo mismo, así que tendré que pagarle a alguien para que lo haga y supongo que hay algún tipo de mejor práctica para hacer este tipo de animaciones.

Patrick Klug
fuente

Respuestas:

8

¿Respuesta corta? No combine sprites.
Es decir, si combina, tendrá que tener la animación para cada combinación. Parece extraño si solo quieres una silla. Pero imaginemos que su oficina podría expandirse en el juego intermedio, donde las sillas ahora tienen un sprite más agradable. ¿Simplemente agregaría un sprite de silla, o se recombinará y agregará toda la animación de cada empleador nuevamente?

Hagamos algunos cálculos.

Imagina que tienes 6 sprites en una animación de mecanografía sentada de un empleador, tienes 5 sillas diferentes y 10 tipos de empleadores diferentes.

Si solo dibujas al empleador encima de la silla, esto requeriría 10 * 6 + 5 sprites, 65 sprites.
Si combina y hace todas las combinaciones, esto requeriría 10 * 6 * 5 sprites, es decir, 300 sprites. ¡Te costará tanto hacer una hoja de sprites tan grande para una simple animación!

EDITAR:

Bueno, si no sabe cómo hacerlo, sería mejor definir su silla como fondo y al personal como sprites activos. Más fácil para ti.

Background.draw();
Foreach(employer i in staff)
    I.draw();

Eso debería mantener a su personal separado de su chais (fondo) Además, actualice los cuadros de la animación del personal de forma independiente también.

EDIT2:

Vi tu edición y tus muestras. Yo mantendría el mismo enfoque. Todos los sprites diferentes. ¡La silla iría delante del personaje de todos modos!

Para acercar la silla, actualice su posición a algunos píxeles hacia arriba y hacia la izquierda, o haga esto en el propio sprite.

¿Entiendes sobre Z alinear? eso debería jugar muchas cosas ...

Puedes ver que algunas partes de la silla se quedan detrás del personaje, otras aparecen delante. Entonces, ¿cómo es esto posible si es solo un sprite? Z alinear!

Dos formas de lograr el efecto. Mantenga una máscara (no es tan fácil) o divida su sprite en dos.

Solo mencionaré el segundo método, ya que no tengo mucho tiempo ahora. Debes cortar el sprite de tu silla, en las partes que estarían en el frente, y lo que estará detrás. Luego póngalos en la misma posición. ¡fácil! Lo que juega es la Z Alinear aquí, las partes detrás deben dibujarse detrás, el personaje en el medio y las partes de la silla delantera en el frente.

No sé qué lib / api / sdk / toolset está utilizando. Pero la mayoría lo hace de esta manera: use el factor de alineación az que determina qué está detrás o qué está adelante o qué se dibuja primero va detrás, lo que se dibuja último va al frente. Así que debes tener esto en cuenta.

Gustavo Maciel
fuente
si gracias. Yo también lo pensé pero no entiendo cómo se lograrían las animaciones en ese momento. ¿Conoces algún ejemplo que pueda mirar? eso sería lo mejor!
Patrick Klug el
¿Te refieres a código o un juego? Si quieres un juego, intenta ver Game Dev Story de Kairosoft para Android e iOS. Ejemplo de código que no sé ...
Gustavo Maciel
Respuesta revisada. Vea si se ajusta a sus necesidades (:
Gustavo Maciel
He actualizado mi pregunta con un ejemplo específico. Estoy realmente interesado en cómo se verían los sprites o qué artistas gráficos están acostumbrados a proporcionar. Las animaciones de GameDev Story son demasiado simplistas para lo que tengo en mente.
Patrick Klug el
Lea Edit 2, he mejorado la respuesta, espero que cubra sus necesidades.
Gustavo Maciel
2

Una idea alternativa sería incluir una imagen de Buffer de Profundidad / Z con sus sprites similar a cómo las API 3D (OpenGL) aseguran que los polígonos no se superpongan. Para un juego de sprites básico, podría ser solo un montón de 0/1 bits (mapa de bits en blanco y negro) (aunque podría usar más niveles de profundidad si lo desea).

Si tiene un sprite combinado de 'silla de escritorio' y desea que la silla aparezca frente a cualquier otro sprite (es decir, personas) en ese cuadrado, haría que la versión Z-Buffer del char 'negro' mientras que el escritorio sería 'blanco' .

Cuando renderiza el sprite dinámico (una persona) en ese mosaico, verificará qué color hay en el búfer de profundidad. Para los píxeles que son 0 (negro), omite dibujar los píxeles de los sprites de la persona y simplemente deja los de la silla allí.

En lugar de verificar cada píxel 1 a la vez, una forma más simple de hacer la comprobación sería multiplicar los píxeles del sprite por el valor del búfer de profundidad ya que la profundidad más cercana sería 0 y cancelar el. Entonces, por supuesto, tiene que teclear (a menos que tenga un canal de color alfa).

Por supuesto, esto agrega gastos generales (aunque podría omitirlo para cualquier cosa que no necesite múltiples niveles de profundidad como una silla de escritorio). También debe sincronizar sus animaciones (es decir, la persona tendría que coincidir con la animación de la silla de escritorio). No le da la misma flexibilidad de tener un montón de sprites separados.

David C. Bishop
fuente
La capa de profundidad con máscara que he mencionado en mi edición (:
Gustavo Maciel