我已经使用 BFS 算法解决了一个 8 难题,并将所需的移动存储到一个数组中,然后将这些数字转换为 0,表示空白空间需要向上移动或向下移动 1 或向左移动 2 或向右移动 3。我不知道如何用 BFS 中的相应动作为 8 个方格设置动画以解决难题。我知道如何使用计时器以及一般如何制作动画,只是不知道如何在正确的时间按顺序制作正确的正方形动画。他们总是需要在任何给定方向上移动 80 个像素。如果有人能指出我正确的方向,我将不胜感激。
问问题
571 次
2 回答
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
}
这只是你如何做到这一点的一个例子。我不知道你是如何存储这件作品的位置的,在这个例子中我认为那是在一个结构中。
于 2013-07-20T21:45:24.890 回答
0
我不明白如何编写一些东西来解决这个难题,但不知道如何维护一个简单的计数器来为值设置动画。
假设您的频率F
是每秒移动次数,时间T
是动画开始后的秒数。
那么,这个想法是移动M
开始于T*F*M
并且持续时间为1
(或更短,如果你想在移动之间暂停)。
现在,您只需要一个插值函数来混合这些值。线性插值 (LERP) 是最简单的,但您可能需要样条函数在端点处加速/减速。不管你怎么做,这个函数只需要一个起点、一个终点和一个t
介于 0 和 1 之间的相对位置。
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
.
于 2013-07-19T04:09:29.967 回答