¿Cómo puedo manejar hojas de sprites con dimensiones de sprites no uniformes?

14

Para una hoja de sprites con dimensiones de sprites no uniformes , ¿cómo puedo obtener los rectángulos delimitadores para cada sprite individual (es decir, los cuadros azules en la siguiente imagen / solo dibujé algunos ejemplos)?

Lo que me gustaría determinar son: offset_x, offset_y, width, height

ingrese la descripción de la imagen aquí

Hasta ahora, solo he usado hojas de sprites en las que todos los sprites tienen dimensiones idénticas . En ese caso, uno simplemente necesita especificar el desplazamiento x e y para obtener un sprite particular. Sin embargo, para las hojas de sprites de dimensiones no uniformes esto no funciona.

EDITAR: Después de leer los comentarios y las respuestas, reformulé mi pregunta para hacerla más inclusiva. El proceso real de usar una hoja de sprites en un juego. Anteriormente, la pregunta contenía los puntos por los cuales las personas producen hojas de sprites de dimensiones no uniformes y cómo puedo lidiar con eso.

Ben
fuente
1
Me parece que todos tienen tamaños idénticos, el espacio que no se rellena por color es solo píxeles con el alfa establecido en cero.
Derek

Respuestas:

8

La mayoría de las hojas de sprites de dimensiones no idénticas generalmente tienen algún tipo de metadatos con la ubicación del ancla del sprite. Hay muchas herramientas que hacen cosas como eliminar píxeles alfa completos y proporcionarle los datos que necesita para que estos datos no se generen manualmente.

Si no tiene estos metadatos, debe crearlos usted mismo. La forma más precisa es la que dijo en su pregunta, que es hacerlo a mano. Puede llevar un tiempo, pero probablemente sea más rápido que hacer nuevos sprites.

Tétrada
fuente
Esto, si bien los enfoques basados ​​en la detección automática tienen sus usos, en la práctica son quisquillosos y propensos a errores. Ya necesita metadatos para el origen del sprite (sprites hacer tener un origen, ¿verdad?), Por lo que los datos extra es casi demasiado de una carga. El artista siempre debe saber mejor que tu aplicación cuál es el tamaño de los sprites individuales.
Steven Stadnicki
+1. El suministro de metadatos con los sprites está garantizado para resolverlo con sensatez .
Bartek Banachewicz
5

Puede realizar un análisis en la imagen para ubicar los rectángulos delimitadores de cada sprite, ordenar esos rectángulos delimitadores (quizás aumentando el mínimo X, luego Y) y tendrá un conjunto de regiones de delimitación que corresponden a los marcos de la hoja del sprite.

Debido a que este proceso puede ser relativamente costoso, probablemente querrás hacerlo sin conexión, por ejemplo, como parte del proceso de compilación de tu juego. Luego puede serializar la información de la región delimitadora en un archivo que almacene con la imagen de hoja de sprite correspondiente. En el tiempo de ejecución, carga tanto la imagen como el archivo de definición de límite y tiene la información que necesita para acceder a cada sprite individual.

Sin embargo, eso es más fácil decirlo que hacerlo. Esencialmente, querrá hacer la detección de funciones y específicamente la detección de manchas que son problemas de visión artificial. También puede limitar la imagen (en blanco y negro) y utilizar una técnica de detección de bordes . La matemática relevante detrás de esas técnicas se explica mucho mejor en esos enlaces de lo que yo podría, y en el caso de que no tenga ganas de implementar esa matemática usted mismo, hay algunas bibliotecas disponibles que pueden ayudarlo. El siguiente conjunto de enlaces me pareció el más prometedor:


fuente
1
+1. Estoy de acuerdo en que va a requerir algunas habilidades de percepción de computadora / manipulación de imágenes para encontrar los límites de sprites correctos. A veces incluso puede ser imposible, por ejemplo, si miras la animación de tortuga a caparazón. Va a ser difícil determinar la posición correcta para eso en relación con los otros cuadros de animación. Y en cuanto al por qué : es más probable debido al uso óptimo del espacio de textura. Y, por lo general, un archivo con las coordenadas se debe suministrar con una hoja de sprites de este tipo, pero si simplemente lo está tomando de la búsqueda de imágenes de Google, es posible que le falte esta información.
bummzack
Planteas un buen punto: mi respuesta no aborda el tema de los orígenes de los sprites; solo llevaría a encontrar rectángulos delimitadores ajustados, y para una hoja con sprites no uniformes, conocer el origen de cada cuadro es bastante importante. Esto sería difícil de hacer automáticamente a menos que hiciera algunas suposiciones (probablemente específicas del dominio), por ejemplo, que el origen siempre sería (ancho / 2, Y máximo) o algo así.
4

Hice mi propia herramienta para ese tipo de spritesheet no uniforme. Permite editar compensaciones, etc. Aquí hay una captura de pantalla para darle una idea:

ingrese la descripción de la imagen aquí

Anonimato
fuente
¿Parece que creas una hoja de sprites uniforme que contiene solo una animación de la no uniforme? ¿O estoy malinterpretando esto?
Ben
no, abro una hoja de sprites no uniforme y dibujo un rectángulo alrededor de los sprites (que se contrae automáticamente al tamaño correcto). Una vez que he creado una animación repitiendo que puedo reproducir cada animación y ajustar el desplazamiento según mis necesidades.
Anonymouse
Parece una herramienta muy ordenada que hiciste allí. ¿Te importaría compartir la herramienta?
eckyputrady
@eckyputrady, lo siento, pero está lejos de estar completo, pero recomiendo otra herramienta (que básicamente me inspiró). Puede encontrarlo aquí: colourclash.com/sprite_buddy/sprite_buddy.html
Anonymouse
0

Echa un vistazo a texturepacker

http://www.texturepacker.com/

Produce un archivo como este (dependiendo de su configuración preferida)

    {
    "filename": "image_front_1",
    "frame": {"x":1,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":2,"w":36,"h":40},
    "sourceSize": {"w":36,"h":40}
},
{
    "filename": "image_front_2.png",
    "frame": {"x":36,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":36,"h":42},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_3.png",
    "frame": {"x":71,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_4.png",
    "frame": {"x":106,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
}

Con estos datos, puede tomar fácilmente los rectángulos separados de la imagen.

omgnoseat
fuente
Esta no es una pregunta sobre qué tecnología usar. Simplemente responder con un enlace a una herramienta y un ejemplo de su salida no es suficiente en mi opinión.
MichaelHouse
-1

spritebuddy.com ha funcionado muy bien para mí. No se pudo encontrar ayuda en el sitio en sí, pero esta publicación de Grupos de Google lo explica muy bien. Adivina automáticamente los límites de sus sprites, le permite ajustarlo Y le permite organizarlos en secuencias de animación. Luego escupe un archivo de metadatos para todo esto en JSON o XML. Entonces todo lo que tienes que hacer es analizar ese archivo de datos en tu juego para obtener los rectángulos delimitadores correctos.

CletusW
fuente
1
Esta no es una pregunta sobre qué tecnología usar. Además, esta herramienta ya fue sugerida en uno de los comentarios.
MichaelHouse
Actualicé mi respuesta, pero no estoy de acuerdo con que no responda la pregunta del OP: "Lo que me gustaría determinar son: offset_x, offset_y, width, height". No se especifica si esto debe suceder o no en el tiempo de ejecución del juego (que sería terriblemente deficiente) o antes. En cuanto a "EDITAR: [...] reformulé mi pregunta para hacerla más inclusiva wrt. El proceso real de usar una hoja de sprites en un juego", este es mi proceso. Genero el archivo JSON apropiado usando spritebuddy y luego lo analizo en mi juego para obtener los datos que necesito.
CletusW
1
@CletusW: buenas respuestas explicarían por qué esa herramienta funciona tan bien para su proceso, qué hace y cómo ayuda, etc. Debería poder leer su respuesta y luego saber cómo seleccionar una herramienta o escribir la mía. Si vincula a su ejemplo favorito, eso es solo una ventaja, no la carne de la respuesta.
Sean Middleditch