2016-05-06 11 views
0

Ich versuche ein Programm zu erstellen, das eine Simulation ausführt. Ich möchte, dass die Simulation in der Lage ist, ein kleines Bild oder Sprite entlang eines festgelegten Pfades zu bewegen, so wie es sich von einer Ecke zu einer Ecke eines Quadrats bewegt, als würde es es zeichnen. Ich möchte auch, dass die Simulation beim Drücken einer Taste auf der Tastatur ausgelöst wird, aber ich habe Probleme mit der Aktualisierung des Bildes nach dem Verschieben.SDL2: Wie bewege ich ein Bild entlang eines quadratischen Pfades?

Zum Beispiel möchte ich, dass das Bild 50 Pixel nach links, dann 50 nach oben, dann 50 nach rechts, dann 50 nach unten bewegt und das Bild auf dem Bildschirm nach jeder Bewegung aktualisiert, nach nur einem Druck auf die 1 'Taste auf der Tastatur.

Dies ist der Code, den ich bisher habe, die weitgehend aus einem Tutorial gezogen wird, und zur Zeit bewegt sich einfach das Bild von 4 Pixel auf jeder Presse, und ich bin nicht sicher, wie von hier Fortschritten:

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

Antwort

0

Ein guter Ort zu starten wäre Delta-Zeit für jeden while-Schleife zu verfolgen, (versuchen gettimeofday Verwendung())

Linearinterpolation könnte dann verwendet werden, um das Objekt zwischen den Stellen zu überführen.

Auf Tastendruck: (nach rechts bewegen)

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

jeder Schleife:

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 ist die x-Position des Bildes, wenn der Schlüssel

ENDX wird der gewünschte x gedrückt wurde, Position am Ende des Übergangs

+0

Vergleichen von Gleitkommatypen für Gleichheit kann zu Überraschungen führen – sp2danny

Verwandte Themen