¿Cómo puedo hacer que una pieza del rompecabezas se mueva suavemente entre las ubicaciones?

Estoy construyendo un clon de 2048 para mejorar mis habilidades de Libgdx, pero no sé cómo facilitar las fichas entre las ubicaciones de la placa. Cuando deslizo mi dedo, el azulejo se mueve bastante rápido. ¿Cómo puedo hacer que el movimiento sea más suave?

Este es el código que estoy usando para moverlo hacia la izquierda:

for(float t=0;t<getMax(currentTile);t++ { shapeRenderer.begin(ShapeType.Filled); shapeRenderer.setColor(230/255.0f, 220/255.0f, 230/255.0f, 1); shapeRenderer.rect(qt, r, a, b); shapeRenderer.end(); } 

Por el momento, estás moviendo la pieza con una interpolación lineal .

función de relajación lineal

Eso significa que cada paso del time, la position del azulejo cambia en la misma cantidad.

 position = position + translation * timestep 

Puede usar cualquier function allí:

 position = position + translation * f(timestep) 

Entonces la position cambia en una cantidad determinada por la function f .

Hay un montón de funciones de relajación que las personas han encontrado que funcionan bien para producir transiciones suaves.

varias funciones de relajación

Robert Penner mantiene implementaciones en varios idiomas . Expo out y expo in-out son bastante agradables para las piezas de un rompecabezas, aunque es posible que desee probar el elástico para un efecto más lúdico y lúdico.

Sin embargo, el 2048 original parece interpolar linealmente entre posiciones.

Solo para ampliar la respuesta de Anko: las funciones de alivio son geniales, pero no son necesarias en todas las situaciones. Aunque en realidad no se pensó inicialmente para este propósito, la interpolación lineal también se puede usar para crear un efecto de suavizado simple, simplemente tiene que llamar a su function de interpolación cada cuadro con la misma fracción dada.

Piénselo de esta manera: su object se moverá la mitad de la distancia al destino, luego la mitad de la nueva distancia el próximo cuadro, y así sucesivamente, hasta que llegue a su destino (o lo aproxime lo suficiente). Esta es una forma rápida y fácil de aproximar una function de extracción de lo que básicamente es una sola línea de código.

Voy a pegar mi propia function Lerp y cómo la llamo para lograr este efecto, pero con un poco de búsqueda puedes encontrar muchas maneras diferentes de lograr lo mismo.

 float Lerp(float a, float b, float fraction) { return (a * (1.0f - fraction)) + (b * fraction); } 

Así es como llamo a la function cada vez que se actualiza el juego:

 playerVelocity.x = Omega2D::Lerp(playerVelocity.x, 0.0f, 0.2f); 

Aunque mi ejemplo usa la function para disminuir el vector de velocidad de mi jugador en un eje, la forma en que lo usaría para cambiar de position es idéntico. Esencialmente, le está diciendo que cambie su valor a 0.0f, y que mueva 0.2f de la distancia de cada cuadro. Cuanto mayor sea la fracción (0.2f), más rápido parecerá su movimiento.