java - reales - El movimiento LibGDX no es suave
libro de android studio en español pdf (1)
Estoy haciendo un juego en LibGDX. Tengo 4 texturas como fondo de paralaje y algunos obstáculos (uno en la parte superior y otros en la parte inferior de la pantalla), esta es la parte del movimiento:
//Parallax
if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2) bckgndmiddle_x=-(game_speed*delta)/2; else bckgndmiddle_x-=(game_speed*delta)/2;
if (bckgndfar_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/5) bckgndfar_x=-(game_speed*delta)/5; else bckgndfar_x-=(game_speed*delta)/5;
for (Obstacle obst:obstacles) {
obst.update(game_speed*delta);
}
//End Main game loop
player.update();
game.batch.begin();
game.batch.draw(wall, bckgndfar_x,floor.getRegionHeight()+100);
game.batch.draw(wall, bckgndfar_x+wall.getRegionWidth(),floor.getRegionHeight()+100);
game.batch.draw(bot_furniture, bckgndmiddle_x,floor.getRegionHeight());
game.batch.draw(bot_furniture, bckgndmiddle_x+bot_furniture.getRegionWidth(),floor.getRegionHeight());
game.batch.draw(floor, bckgndmiddle_x,0);
game.batch.draw(floor, bckgndmiddle_x+floor.getRegionWidth(),0);
game.batch.draw(ceiling, bckgndfar_x,Const.VIEWPORT_H-ceiling.getRegionHeight());
game.batch.draw(ceiling, bckgndfar_x+ceiling.getRegionWidth(),Const.VIEWPORT_H-ceiling.getRegionHeight());
El método de actualización de obstáculos es solo x- = velocidad; como la velocidad es el parámetro recibido
El problema es que de vez en cuando las texturas se mueven de forma extraña, como si el dispositivo no pudiera manejar el juego y se congela por una fracción de segundo.
¿Alguna pista de por qué está sucediendo esto?
EDITAR
Lo que sucede es que las texturas tartamudea de vez en cuando (soy español y no sabía esa palabra)
Creo que debe ser algo relacionado con la segunda imagen de cada parte del fondo, esa suma del ancho. Al igual que agrega el ancho, pero a veces es demasiado debido a una caída de fps (como 1 o 2 fps) y la próxima vez se "mueve" de nuevo a la posición correcta porque los fps vuelven a la normalidad.
EDITAR 2 Lo probé sin los obstáculos y todavía tartamudea, lo intenté de nuevo con los obstáculos y sin el fondo y no lo hace, por lo que debe ser algo con lo que dije en la primera edición.
Por cierto, la caída de FPS es menor que 1 (marcado)
Acabo de intentar dibujar una imagen de fondo completa (sin paralaje) y todavía tengo el mismo problema.
Veo una razón posible que no tiene nada que ver con las interrupciones de FPS:
Aquí está su primera línea, separada por legibilidad:
if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2)
bckgndmiddle_x = -(game_speed*delta)/2;
else
bckgndmiddle_x -= (game_speed*delta)/2;
Por lo general, la instrucción else
se usa para mover el fondo a una velocidad constante. Pero cada vez que se llega al enunciado if
, la posición se establece explícitamente sin tener en cuenta su posición anterior, por lo que el movimiento no será fluido. Debes moverlo a una posición donde parezca que se ha movido exactamente -(game_speed*delta)/2
desde su posición anterior.
Una forma de hacerlo es mover siempre el objeto con velocidad y desplazarlo hacia adelante por el ancho de la textura solo cuando sea necesario como una corrección. Por ejemplo, suponiendo que mantiene la parte inferior izquierda de la pantalla en (0, 0) ::
float midWidth = floor.getRegionWidth();
bckgndmiddle_x -= game_speed*delta/2; //Always move it at constant speed.
if (bckgndmiddle_x + 2*midWidth < Const.VIEWPORT_W) //Right edge starting to show.
bckgndmiddle_x += midWidth; // Shift it exactly by its width so the jump is undetectable
El 2*
anterior es porque asumo por tu otro código que estás dibujando dos copias de la textura de fondo una al lado de la otra. Si estuvieras dibujando una textura única y más ancha que es más ancha que la constante de anchura de la ventana gráfica, entonces eliminarías el 2*
.
Este mismo problema se aplica, por supuesto, a su segunda línea de código, donde está configurando el desplazamiento de fondo lejano.