0

我已经使用 BFS 算法解决了一个 8 难题,并将所需的移动存储到一个数组中,然后将这些数字转换为 0,表示空白空间需要向上移动或向下移动 1 或向左移动 2 或向右移动 3。我不知道如何用 BFS 中的相应动作为 8 个方格设置动画以解决难题。我知道如何使用计时器以及一般如何制作动画,只是不知道如何在正确的时间按顺序制作正确的正方形动画。他们总是需要在任何给定方向上移动 80 个像素。如果有人能指出我正确的方向,我将不胜感激。

4

2 回答 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 回答