python - pantalla - pygame español
¿Cuál es la mejor manera de manejar sprites giratorios para un juego de vista de arriba hacia abajo? (3)
Estoy trabajando en un juego de vista de arriba hacia abajo 2d en este momento y estoy aprendiendo mucho sobre sprites y manejo de sprites. Mi pregunta es cómo manejar un conjunto de sprites que se pueden rotar en hasta 32 direcciones.
En este momento, un objeto dado tiene su hoja de sprites con todas las animaciones orientadas con el objeto apuntando a 0 grados en todo momento. Ahora, dado que el objeto puede rotar en hasta 32 direcciones, ¿cuál es la mejor manera de trabajar con esa hoja de sprite original? Mi mejor opción actual es hacer que el programa cree dinámicamente 32 hojas de sprites más cuando el objeto se cargue por primera vez en el juego, y luego todas las instancias posteriores de ese tipo de objeto compartirán esas hojas de sprites.
De todos modos, cualquier consejo en este sentido sería útil. Avíseme si necesito reformular la pregunta, sé que es una especie rara. Gracias
Edición: supongo que para más aclaración. Si tengo, por ejemplo, un objeto que tiene 2 animaciones de 5 fotogramas por pieza, que es una hoja de sprite bastante fácil de crear y organizar, es una simple cuadrícula de 2x5 (o 5x2 dependiendo de cómo lo expongas). Pero el problema es que ahora esas 2 animaciones deben girarse en 32 direcciones. Esto significa que al final habrá 320 sprites individuales. Voy a decir eso (y corregir si estoy equivocado) ya que estoy preocupado por el rendimiento y la velocidad de cuadros, rotando los sprites sobre la marcha cada fotograma no es una opción. Entonces, ¿cómo deberían organizarse estos 320 sprites que componen estas 2 animaciones? ¿Sería mejor que
- Piense en ello como 32 hojas de sprite de 2x5
- divida la hoja de sprites en cuadros individuales, y luego tenga una matriz de 32 direcciones diferentes por cuadro (por lo tanto, 10 matrices de 32 sprites direccionales)
- Otro....?
- No importa?
Gracias
Las 32 direcciones para el sprite se traducen en 32 rotaciones por 11.25 grados.
Puede reducir el número de imágenes precalculadas a 8, solo calcula los primeros 90 grados ( 11.25, 22.5, 33.75, 45.0, 56.25, 67.5, 78.75, 90.0
) y usa las operaciones de volteo dinámicamente. Los flips son mucho más rápidos porque básicamente solo cambian el orden en que se copia una imagen del buffer.
Por ejemplo, cuando visualiza una imagen rotada en 101.25 grados, cargue la imagen precalculada de 67.5 grados y gírela verticalmente.
Me di cuenta de que esto solo funciona si tu gráfico es simétrico ;-)
Cuando se habla de una computadora moderna, es posible que no necesite optimizar nada. La memoria utilizada al precalcular los sprites es ciertamente insignificante, y el uso de la CPU al girar la imagen probablemente también. Sin embargo, cuando está programando para un dispositivo integrado, sí importa.
Por lo general, sacrificará el tiempo o la memoria del procesador, y necesita un equilibrio entre los dos. A menos que tengas un gran límite para tu procesador o estés computando muchas cosas costosas, no hay una razón real para poner todo eso en la memoria. Rotar algunos sprites con una transformación es lo suficientemente barato como para que no valga la pena almacenar 32 veces tanta información en la memoria, especialmente porque esa información es un montón de imágenes, y las imágenes consumen mucha memoria, en términos relativos.
Puedes rotar los sprites directamente configurando la parte de rotación de la transformación del sprite.
Para obtener un código de muestra, consulte el Sprite de Chimp en este tutorial de pygame . Gira los sprites cuando el Chimpancé está "mareado".