繁体   English   中英

OpenGL glut动画的8个解题方法

[英]OpenGL glut animation of 8 puzzle solving

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

我不知道如何写一些东西来解决这个难题,但是却不知道如何维护一个简单的计数器来为值设置动画。

假设您的频率F是每秒移动,而时间T是动画开始以来的秒数。

那么,想法是,动作MT*F*M M开始,并且持续时间为1 (或更短,如果要在动作之间暂停)。

现在,您只需要一个插值函数来混合值。 线性插值(LERP)最简单,但是您可能希望样条函数在端点处加速/减速。 不管您执行什么操作,该函数仅需要一个起点,一个终点以及一个介于0和1之间的相对位置t

double blend( double from, double to, double t )
{
    // linear interp:
    return from * (t-1.0) + to * t;
}

因此,您只需通过计算小数部分fmod(T*F*M, 1.0)来计算t 如果持续时间小于1 ,则不要在该fmod调用中更改1.0 您只需将其固定为持续时间D ,然后除以D

当我需要做这样的事情时,我使用一个变量来保留运动动画的剩余时间。 并且要知道要移到一边的那一块,我建议您使用具有以下结构的堆栈:

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
    }

这只是您如何做的一个例子。 我不知道您如何存储作品的位置,在本例中,我认为那是在结构中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM