2013-07-19 18 views
0

我已經解決了8個使用BFS算法的謎題,並將需要的移動存儲到一個數組中,然後將這些數字轉換爲0表示需要向上移動或1移動或2移動左或右3。我不知道我將如何動畫8個正方形來解決我在BFS中的相應動作。我知道使用定時器以及如何在一般情況下做動畫,而不是如何在正確的時間順序地動畫正確的方形。他們總是需要在任何給定的方向上移動80個像素。如果有人能指出我正確的方向,我會很感激。8個謎題解決的OpenGL虛擬動畫

回答

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; 
} 

所以,你只要通過計算小數部分fmod(T*F*M, 1.0)計算t。如果持續時間少於1,則不會更改該fmod呼叫中的1.0。您只需將其夾在您的期限D,然後除以D

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 
    } 

這只是你如何做到這一點的一個例子。我不知道你如何存儲這個文件的位置,在這個例子中,我想這是一個結構體。