2017-02-15 5 views
-2

J'ai codé une application mais j'ai reçu des sorties erronées de SDL. Pour spécifier mon problème, j'ai développé un code simple pour compter le nombre de clics de la souris. J'utilise CodeBlocks avec le compilateur GCC sur Windows.SDL_MouseButtonEvent se comporte comme SDL_MouseMotion

Le code est le suivant:

#include "SDL.h" 
#include <stdio.h> 

int main (int argc , char *args[]) 
{ 
    SDL_Window *window = NULL ; 
    SDL_Renderer *render = NULL ; 
    SDL_Event event ; 
    int counter = 0 ; 

    SDL_Init (SDL_INIT_EVERYTHING) ; 

    window = SDL_CreateWindow ("" , 0 , 0 , 400 , 400 , SDL_WINDOW_BORDERLESS) ; 
    render = SDL_CreateRenderer (window , -1 , SDL_RENDERER_ACCELERATED) ; 

    // Putting white color over window 
    SDL_SetRenderDrawColor (render , 255 , 255 , 255 , 255) ; 
    SDL_RenderClear (render) ; 
    SDL_RenderPresent (render) ; 

    counter = 0 ; //Reinitializing counter to 0 

    //Starting Input 
    while (3) 
    { 
     SDL_PollEvent (&event) ; 
     if (event.type == SDL_MOUSEBUTTONUP) 
     { 
       counter++ ; 
     } 
     else if (event.type == SDL_KEYUP) 
     { 
       if (event.key.keysym.sym == SDLK_ESCAPE) 
       { 
        break ; 
       } 
     } 
    } 

    // Actual Clicks = 2 
    printf("CLicks = %d" , counter); 

    return 0 ; 
} 

La sortie est toujours assez énorme & Erroneous. La sortie de l'échantillon est affiché à

https://drive.google.com/open?id=0B2krxxnuHys0UzB3Q1d3MzJEVVU

+1

Voulez-vous supprimer ce lien Google Drive, et déplacer la sortie dans la question? Puisque la question dépend de ce lien, nous ne voulons pas risquer la suppression des données, car cela signifierait que nous devrions supprimer la question. Rappelez-vous que les questions ici sont destinées à la postérité, pas seulement à l'affiche originale. – halfer

+1

Veuillez également lire: [Dans quelles circonstances puis-je ajouter "urgent" ou d'autres expressions similaires à ma question, afin d'obtenir des réponses plus rapides?] (Http://meta.stackoverflow.com/q/326569/472495). – halfer

Répondre

1

SDL_PollEvent ne bloque pas jusqu'à ce que l'événement se produit, mais retourne à la place 1 si les données d'événements écrits dans la structure donnée, ou 0 sinon. Vous ignorez cette valeur et lisez les données de l'événement de toute façon; personne n'a dit que les données de cet événement étaient valables, surtout la première fois, car elles n'étaient même pas initialisées.

Vérifiez la valeur de retour et n'utilisez l'événement que si l'événement SDL est effectivement passé. Vous pouvez également utiliser SDL_WaitEvent, qui bloque jusqu'à ce que l'événement se produise.

+0

Pouvez-vous élaborer avec un exemple? –

+0

Je sais que ce serait ennuyeux mais s'il vous plaît –

+0

J'ai finalement eu le coup de ce que vous vouliez dire mon pote. Merci beaucoup. Le projet est lancé !!! Quoi qu'il en soit, pour les autres utilisateurs, mettez 'if (! (SDL_PollEvent (& event)) continuez;' dans la boucle au début et voyez des merveilles. Supprimez le 'SDL_PollEvent normal (& event) '. Merci encore. –