2013-09-04 13 views
5

Ich benutze SDL2 unter Windows (Ich habe sowohl Windows 7 und Windows 8 getestet). Ich spielte mit dem Rendern einer Textur, die an die Mauskoordinaten gebunden war, um eine Art "Fadenkreuz" -Effekt zu erzeugen.SDL2 rendern Textur sichtbar hinter der Maus

Es funktioniert, aber die Textur bleibt sichtbar hinter der Maus, die eine unangenehme Verzögerung zwischen Mausbewegung und den gerenderten Updates verursacht. Ehrlich gesagt, die Verzögerung ist sehr gering, aber für jemanden, der sich um absolute Genauigkeit kümmert, würde es die Person verrückt machen.

Meine Frage ist im Grunde, ist das normal? Ich vermute, dass die Verzögerung auf die Zeit zurückzuführen ist, die Windows benötigt, um das Ereignis an SDL und dann an SDL auszuliefern, um das Ereignis an mich zu liefern. Wie kann man über SDL einen gesperrten "Fadenkreuz" -Effekt erzielen?

Mein Code als Referenz:

#include "SDL.h" 

int main(int argc, char* args[]) 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 

    SDL_Window* window = SDL_CreateWindow("SDL", 100, 100, 640, 480, SDL_WINDOW_SHOWN); 

    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); 

    SDL_Surface* surface = SDL_LoadBMP("mouse.bmp"); 

    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); 
    SDL_FreeSurface(surface); 

    bool isExiting = false; 
    int x = 0; 
    int y = 0; 

    while(!isExiting) 
    { 
     SDL_Event e; 
     while(SDL_PollEvent(&e)) 
     { 
      if(e.type == SDL_QUIT) 
      { 
       isExiting = true; 
       break; 
      } 
      else if(e.type == SDL_MOUSEMOTION) 
      { 
       x = e.motion.x; 
       y = e.motion.y; 
      } 
     } 

     SDL_Rect destRect; 
     destRect.h = 19; 
     destRect.w = 19; 
     destRect.x = x; 
     destRect.y = y; 

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

    SDL_Quit(); 

    return 0; 
} 
+0

Haben Sie den [Windows-Compositor] (http://en.wikipedia.org/wiki/Compositing_window_manager#Microsoft_Windows) aktiviert? Benötigt Ihre "While" -Schleife immer ~ 16-17ms zur Ausführung? – genpfault

+0

@genpfault Compositing ist aktiviert. Ich werde testen, wenn deaktiviert. Ich habe die Schleife noch nicht geplant, also muss ich das auch versuchen. –

+0

Ihre 'SDL_Surface' wird nicht zentriert um die Mausposition gezeichnet, sondern zu' destrect.x = x - (destRect.w/2); destRect.y = y - (destRect.h/2); ' – olevegard

Antwort

2

Während ich nicht sicher sein können, warum Ihre Schleife hinkt, hat SDL Unterstützung der Maus Oberfläche zum Ändern, sowie einige andere Funktionen, die Sie interessieren könnten Es scheint so. Sie könnten SDL_CreateColorCursor(SDL_Surface* surface, int hot_x, int hot_y) zu einem guten Zweck verwenden. Hier ist ein Link zur Wiki-Seite zur Mausunterstützung: http://wiki.libsdl.org/CategoryMouse

Happy Coding!

0

In einem Projekt arbeite ich an, mache ich etwas wie folgt aus:

(Außerhalb der Hauptspielschleife):

SDL_Texture* cursor = //blah; 
SDL_Rect cursor_hitbox; 
SDL_QueryTexture(cursor, NULL, NULL, &cursor_hitbox.w, &cursor_hitbox.h); 

(im Hauptspiel Schleife):

SDL_GetMouseState(&cursor_hitbox.x, &cursor_hitbox.y); 

Während ich dies benutze, habe ich keine Eingangsverzögerung bemerkt. Vielleicht ist es nur der Ereignistyp?

Beachten Sie, dass dies höchstwahrscheinlich nicht so effizient ist, da Sie den Mausstatus in jedem Frame erhalten würden, anstatt nur wenn Sie die Maus bewegen.