2017-02-14 7 views
0

J'ai d'abord écrit mon jeu en utilisant glfw. Cependant, en raison de son manque de portabilité Android, je dois remplacer tout mon code glfw avec SDL, car SDL est plus portable.Puis-je rechercher des événements avec SDL sans utiliser un while_loop intégré?

Ma boucle de jeu originale utilisant le travail de cadre de glfw était très striaghtforward. Le voici:

// game loop 
while (!glfwWindowShouldClose(window)) { 
    //if-else statements that create 
    //the games state machine 
    //player input is received here 
    //rendering done here 
} 

Ok. Il y a probablement de meilleures manières d'écrire cette boucle de jeu, mais le point est le code travaillé pour le prototype de jeu.

Cependant, maintenant que je passe à SDL, j'ai rencontré un problème. Il semble que SDL_Event doive être placé dans une boucle while pour vérifier en permanence les événements. Et THIS while_loop est dans un autre while_loop. Donc, mon code ressemble à ceci:

while(!Quit) { 
    SDL_Event event; 
    while(SDL_PollEvent(&event)) { 
     //if-else statements that create 
     //the games state machine 
     //player input is received here 
     //rendering done here 
    } 
} 

Cependant, cette while_loop dans un while_loop a complètement foiré les jeux de rendu! Je suis maintenant en train de scintiller! Existe-t-il un autre moyen d'exprimer ce code en un seul while_loop comme je l'ai fait plus tôt avec glfw. Ou existe-t-il un moyen de vérifier les événements sans utiliser while_loop

+4

Ne devrait pas la boucle 'SDL_PollEvent()' juste faire face aux événements? Votre code de rendu et tel devrait être en dehors de cela, dans votre boucle externe ... tel quel, vous rendez seulement, etc. quand vous traitez un événement ... – Dmitri

Répondre

4

Le rendu et les calculs ne doivent pas être effectués dans la boucle d'interrogation événementielle, faites-le à l'extérieur.

Voici comment je fais actuellement dans SDL2 pour un jeu que j'ai écrit dans :

while (!quit) { 
    start_frame_ms = SDL_GetTicks(); 

    /* Event polling */ 
    while (SDL_PollEvent(&event)) { 
     joystick_event(&event); 
     keyboard_event(&event); 
    } 

    /* Calculations */ 
    players_move(); 
    enemies_move(); 

    /* Rendering */ 
    draw_sprites(); 

    /* Lock FPS to 60 */ 
    end_frame_ms = start_frame_ms - SDL_GetTicks(); 
    if (end_frame_ms < FPMS) { 
     SDL_Delay(FPMS - end_frame_ms); 
    } 
} 
+0

Une autre option est d'avoir un thread séparé pour le rendu, mais c'est un histoire différente. – Matso

+0

@Matso Les coordonnées des fonctions de calcul ne seraient-elles pas synchronisées avec les sprites dessinés? – Houssni

+0

Si aucune méthode de synchronisation n'a été appliquée, bien sûr. Je dis juste que dans les gros moteurs, il y a généralement des threads séparés pour beaucoup de choses différentes (rendu, audio, entrée etc.). – Matso