Pregunta

Estoy escribiendo un motor sprite básico para mi propia diversión y para entender mejor con la API 2d de Java. Actualmente estoy haciendo uso de una gran cantidad de archivos .png separados con fondos transparentes para representar los diversos sprites y los diferentes cuadros de animación que necesito. La mayoría de los proyectos de desarrollo de juegos del "mundo real" parecen hacer uso de "hojas de sprites" que contienen múltiples sprites o cuadros de animación dentro de un solo archivo. Además, en lugar de utilizar el soporte de transparencia de imagen nativa, las personas a menudo designan un color arbitrario que no aparece en la paleta de sprites como color transparente. ¿Cómo se gestiona un archivo como este mediante programación?

  • ¿cómo sabes dónde está un sprite? comienza y comienza el siguiente
  • ¿cómo manejas la transparencia?

Puede haber otros factores en los que no he pensado aquí, por lo que puedo agregarlos a la lista anterior a medida que pienso en las cosas o cuando la gente hace sugerencias (por favor hágalo en los comentarios).

¿Fue útil?

Solución

Actualmente uso archivos XML generados por un simple editor de sprites que almacena el sprite como una colección de poses (opcionalmente animadas), que a su vez son una colección de cuadros o celdas. Los cuadros almacenan información por cuadro, como el desplazamiento xey del cuadro en la hoja, el ancho y la altura de la celda, y cualquier transformación (cambio de tamaño / rotación / tono / etc.). Las poses almacenan cuadros individuales e información de animación (velocidad, por ejemplo), y un nombre de pose para identificarlos fácilmente en el programa (hero.pose = sprite.pose [" standing_right "]). Los sprites sirven como documento raíz para mantener varias poses, como una pose para cada dirección de orientación.

Una alternativa menos flexible que utilicé antes era especificar tamaños fijos para celdas y hojas y calcular los desplazamientos y tamaños de cuadros en función de estos valores (por ejemplo, el ancho siempre es de 32 píxeles, por lo que el tercer sprite está en 32 * 2). Más tarde comencé a especificar estas dimensiones en el nombre del archivo (por ejemplo, sprite_name_32x64.png) para sprites que no se ajustan a las dimensiones de celda fija. Me gusta más el nuevo enfoque, especialmente con un editor simplista que llena la mayoría de los valores para mí y me permite usar sprites como plantillas para otros sprites.

Utilizo la información alfa y de transparencia almacenada en imágenes PNG directamente, así que no necesito preocuparme por almacenarla en otro lugar, aunque otros enfoques serían elegir un valor fijo por sprite y almacenarlo en algún lugar, usar el píxel más a la izquierda en el posa si sabes que siempre está vacío, usa una entrada de paleta específica si estás usando esas, máscaras de sprites o lo que tengas.

Otros consejos

No se trata de Java, pero generalmente puedes hacer que todos tus sprites sean del mismo tamaño. Por lo tanto, podrás generar tus sprites en tu juego (o aplicación) con un simple bucle.

Pero para sprites de diferentes tamaños puede haber problemas para el tamaño de la hoja de sprites (puede ser más grande de lo esperado). Por lo tanto, debe definir un archivo xml o json para su hoja de sprites para encontrar sus imágenes de sprites en su código. Puede usar editores de hojas de sprites (hay muchos, estoy usando Sprite Master ) para obtener información rápida y manera fácil de generar hojas de sprites y coordinar datos.

Haz tu hoja de sprites conociendo el tamaño y el número de cada secuencia.

Tome una imagen de su hoja almacenada en un búfer y use algo como esto:

currentframe=spritesheet.getSubimage(x, y, w, h); 

Tus x e y cambiarán según el marco en el que te encuentres. Mantenga el ancho y la altura iguales para facilitarle las cosas.

Olvídate de tratar de mantener todo el juego en una hoja. Es una locura y difícil de manejar. Use un nuevo png para cada secuencia de animación. Si eres anal sobre ahorrar espacio, solo crea animaciones en movimiento hacia la derecha y simplemente voltea la imagen almacenada en tiempo real para moverte hacia la izquierda.

Java leerá los archivos png con el alfa, así que no se preocupe por el color de la transparencia. Dibuja todo en pngs. Usa Photoshop o Gimp.

Buscar en google la imagen de Java TYPE_INT_ARGB

Bueno, dado que la mayoría de ellos son personalizados, esos detalles dependen del implementador. Generalmente, el archivo comenzará con información de encabezado que contiene los detalles de alto / ancho y codificación, transparencia, etc.

Muchas veces las cosas están en un archivo porque es muy costoso abrir / leer múltiples archivos en comparación con abrir / leer un archivo. Muchos motores de juegos usan zip o '' ziplike '' archivos con compresión 0 para tratar un solo archivo como un sistema de archivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top