2016-05-06 13 views
0

私はシミュレーションを実行するプログラムを作ろうとしています。私はシミュレーションが、まるで絵を描いているかのように、正方形の角から角まで移動するような、設定されたパスに沿って、小さな画像またはスプライトを動かすことができるようにしたい。また、キーボードのキーを押すとシミュレーションが起動されるようにしたいと思いますが、移動後にイメージをリフレッシュするのにはいくつかの問題があります。SDL2:正方形のようなパスに沿ってイメージを移動するにはどうすればよいですか?

たとえば、画像を左に50ピクセル、次に50ピクセル、次に50ピクセル右に、次に50ピクセル下に移動し、それぞれの移動後に画面上の画像をリフレッシュしたい場合は、「1 'キーを押します。

この

は主にチュートリアルから引っ張られ、私がこれまで持っているコードであり、現在は単に各プレスに4つのピクセルで画像を移動し、私はここから進行する方法がわからないよ:

int main(int argc, char ** argv) 
{ 
// variables 

bool quit = false; 
SDL_Event event; 
int x = 360; 
int y = 240; 

// init SDL 

SDL_Init(SDL_INIT_VIDEO); 
SDL_Window * window = SDL_CreateWindow("SDL2 Keyboard/Mouse events", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, 0); 
SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0); 

SDL_Surface * image = SDL_LoadBMP("Star.bmp"); 
SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, image); 
SDL_FreeSurface(image); 

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0); 

// handle events 

while (!quit) 
{ 

    switch (event.type) 
    { 
    case SDL_QUIT: 
     quit = true; 
     break; 

    case SDL_KEYDOWN: 
     switch (event.key.keysym.sym) 
     { 

     case SDLK_1: 

      x-=4; 

      break; 

     case SDLK_2: 

      x+=4; 

      break; 

     case SDLK_3: 

      y-=4; 

      break; 

     case SDLK_4: 

      y+=4; 

      break; 

     } 
     break; 
    } 

    SDL_Rect dstrect = {x, y, 75, 75}; 

    SDL_RenderClear(renderer); 
    SDL_RenderCopy(renderer, texture, NULL, &dstrect); 
    SDL_RenderPresent(renderer); 
} 

// cleanup SDL 

SDL_DestroyTexture(texture); 
SDL_DestroyRenderer(renderer); 
SDL_DestroyWindow(window); 
SDL_Quit(); 

return 0; 
} 

答えて

0

線形補間は、次に位置の間でオブジェクトを移行するために使用することができる

開始するには良い場所は、((gettimeofdayのを使ってみてください))、whileループごとにデルタ時間を追跡することであろう。キープレスで

if(doTransition == true) 
{ 
    tick += deltaTime; 
    float tval = MIN(tick/duration, 1); 
    x = startX + (endX - startX) * tval; 
    y = startY + (endY - startY) * tval; 
    if(tval == 1) 
    { 
     //finished transition 
     doTransition = false; 
    } 
} 

STARTXキーが

ENDXを押された画像のx位置で所望のxは:

if(doTransition == false) 
{ 
    doTransition = true; 
    startX = x; 
    startY = y; 
    endX = x + 50; 
    endY = Y; 
} 

すべてのループ(右に移動)遷移の終わりの位置

+0

浮動小数点型を比較して等しいことが驚きにつながる可能性がある – sp2danny

関連する問題