我使用BFS算法解决了一个8难题,并将所需的移动存储到数组中,然后将这些数字转换为0表示空白区域需要向上移动或向下移动1或向左移动2或向右移动3。我不知道我将如何使用来自BFS的相应动作来解决8个方块的动画。我知道使用定时器和如何做动画一般不是如何在正确的时间顺序动画正确的方形。它们总是需要在任何给定方向上移动80个像素。如果有人能指出我正确的方向,我将不胜感激。
答案 0 :(得分:0)
我不知道如何写一些东西来解决这个难题,但后来不知道如何维护一个简单的计数器来动画一个值。
假设你的频率F
是每秒移动,时间T
是动画开始后的秒数。
然后,我的想法是,移动M
从T*F*M
开始,持续时间为1
(或更少,如果您希望在移动之间暂停)。
现在,您只需要插值函数来混合值。线性插值(LERP)最简单,但您可能希望样条函数在端点处加速/减速。无论如何,该函数只需要一个起始点,一个终点和一个介于0和1之间的相对位置t
。
double blend( double from, double to, double t )
{
// linear interp:
return from * (t-1.0) + to * t;
}
因此,您只需通过计算小数部分t
来计算fmod(T*F*M, 1.0)
。如果您的持续时间少于1
,则不会更改该1.0
来电中的fmod
。您只需将其缩短到D
的持续时间,然后除以D
。
答案 1 :(得分:0)
当我需要做这样的事情时,我使用一个变量来保持动作动画的剩余时间。要知道你想要移动到哪一方,我建议你使用一个像这样的结构的堆栈:
struct commands{
int piece;
int direction;
struct commands next;
};
首先,您将堆叠解决拼图所需的所有命令,然后,在动画制作时,重置变量,将剩余时间保持为80并在时间函数内:
void move_piece(int a){
//Move the piece 1 pixel to the side you want
switch(stack->direction){
//Move the piece to x+1
case 0:
piece[stack->piece].x++;
break;
//Move the piece to y+1
case 1:
piece[stack->piece].y++;
break;
case 2:...
...
}
time--;
if(time==0){
//The piece is in it's place
//Go to the next piece
time=80;
}
glutTimerFunc(20, move_piece, 0); //Change 20 to change the speed of the animation
}
这只是你如何做到这一点的一个例子。我不知道你是如何存储这个部分的位置的,我想这是一个结构中的例子。