LWJGL-Cómo animar y renderizar personajes usando una hoja de Sprite

Estoy haciendo un juego de rol similar a los juegos de rol de Super Nintendo a principios de los 90. Estoy manejando un movimiento muy parecido al Final Fantasy IV de Squaresoft. FFIV Gameplay

Tenga en count que el jugador nunca cambia sus posiciones xey en la pantalla . Lo que estoy preguntando, para ser precisos, es cómo podría, en LWJGL a través de la input del usuario (por ejemplo, las teclas de flecha), tomar la hoja de sprites que tengo de animaciones de movimiento de mi personaje y renderizarlas en una animation [parcialmente] fluida como ¿encima?

He estado hojeando Internet durante horas, y no he encontrado una manera segura de hacerlo. No tengo ningún código hasta el momento; Estoy más o less buscando una guía o algunos consejos en la dirección correcta sobre cómo podría abordar esto.

Y, para tener en count, este será un juego bastante grande, por lo que quiero centrarme parcialmente en la velocidad y la eficiencia, lo que significa que no quiero sumergirme en Slick2D y libGDX a less que sea absolutamente necesario.

Es mucho más fácil de lo que crees En tu sombreador necesitas tener un uniforme que contenga el tamaño de un sprite y la position del sprite actual (en un sistema de coorderadas normalizado, donde (0; 0) es la esquina superior izquierda y (1; 1) es la esquina inferior derecha esquina). Entonces simplemente necesitas multiplicar las coorderadas de la textura con el tamaño de un sprite y agregarle la position del sprite:

 in vec2 a_textureCoords; uniform sampler2D u_sampler; uniform vec2 u_spriteSize; uniform vec2 u_spritePosition; out vec4 color; void main(void) { color = texture(u_sampler, a_textureCoords * u_spriteSize + u_spritePosition; } 

Cargando en los uniformes también es muy fácil. Si tiene un delay variable que almacena la cantidad de milisegundos entre los dos sprites, entonces puede hacer

 if (!playerMoving) { // Load in the position of the standing sprite } else { if (System.currentTimeMillis() % (2 * delay) < delay) { // Load in the position of the first walking sprite } else { // Load in the position of the second walking sprite } } 

si tiene más de 2 sprites andantes, debe almacenar la position de los sprites en una matriz y cargarlos dinámicamente:

 private Vector2[] positions = new Vector2[] { new Vector2(0.5, 0), new Vector2(0, 0.5), new Vector2(0.5, 0.5) }; if (!playerMoving) { // Load in the position of the standing sprite } else { int currentPos = System.currentTimeMillis() % (positions.length * delay) / positions.length; Vector2 pos = positions[currentPos]; // Load in pos }