2017-03-11 1 views
1

Je crée un jeu en OpenGL et j'ai des problèmes avec SDL_PollEvent ne ramassant pas tous les événements, par exemple, si je presse et maintenez une touche, je dois attendre ~ 1-3 secondes avant le programme réalise ce que je viens de faire. Ceci est mon main.cpp:SDL_PollEvénement ne répond pas aux événements

#include <GL/glew.h> 
#include <GL/GL.h> 
#include <SDL\SDL.h> 
#include "Display.h" 
#include "Mesh.h" 
#include "Shader.h" 
#include "Texture.h" 
#include "Transform.h" 
#include "Camera.h" 
#include <iostream> 

#define WIDTH 800 
#define HEIGHT 600 

int main(int argc, char *argv[]) 
{ 
    Display Display(800, 600, "OpenGL"); 

    Vertex vertices[] = { Vertex(glm::vec3(-0.5, -0.5, 0), glm::vec2(0.0, 0.0)), 
          Vertex(glm::vec3(0, 0.5, 0), glm::vec2(0.5, 1.0)), 
          Vertex(glm::vec3(0.5, -0.5, 0), glm::vec2(1.0, 0.0)), }; 

    unsigned int indices[] = { 0,1,2 }; 

    SDL_Init(SDL_INIT_EVERYTHING); 

// Mesh Car("./res/Test2.obj"); 
// Mesh Test(vertices, sizeof(vertices)/sizeof(vertices[0]), indices, sizeof(indices)/sizeof(indices[0])); 
    Mesh Ground("./res/Ground2.obj"); 
    Shader shader("./res/basicShader"); 
// Texture texture("./res/CarUV.png"); 
    Texture test("./res/ground.jpg"); 
    Camera camera(glm::vec3(0, 0, -14), 70.f, (float)WIDTH/(float)HEIGHT, 0.01f, 1000.0f); 
    Transform transform; 
    const Uint8 *keyState; 

    transform.GetPos().x = 0; 
    transform.GetPos().y = 0; 
    transform.GetPos().z = 0; 
    transform.GetRot().x = 80; 
    transform.GetRot().y = 0; 
    transform.GetRot().z = 0; 

    float counter = 0.0f; 

    while (!Display.IsClosed()) 
    { 

      Display.Clear(0.0f, 0.15f, 0.3f, 1.0f); 

      float sinCounter = sinf(counter); 
      float cosCounter = cosf(counter); 

      SDL_Event ev; 

      while (SDL_PollEvent(&ev) != 0) 
      { 
       keyState = SDL_GetKeyboardState(NULL); 

       if (keyState[SDL_SCANCODE_W]) 
       { 
        camera.MoveForward(1); 
        std::cout << "keypress" << std::endl; 
       } 
       else if (keyState[SDL_SCANCODE_S]) 
       { 
        camera.MoveBackward(1); 
       } 
       if (keyState[SDL_SCANCODE_A]) 
       { 
        camera.MoveRight(1); 
       } 
       else if (keyState[SDL_SCANCODE_D]) 
       { 
        camera.MoveLeft(1); 
       } 
       if (keyState[SDL_SCANCODE_Y]) 
       { 
        camera.RotateY(0.1); 
       } 
       if (keyState[SDL_SCANCODE_X]) 
       { 
        camera.RotateX(0.1); 
       } 
      } 

      //transform.SetScale(glm::vec3(cosCounter, cosCounter, cosCounter)); 
      shader.Bind(); 
      test.Bind(0); 
      shader.Update(transform, camera); 
      //Car.draw(); 
      Ground.draw(); 

      Display.Update(); 
      counter += 1.0f; 
    } 
    return 0; 
} 

Toutes les fonctions font ce qu'ils sont nommés d'après et fonctionnent correctement.

EDIT:

je l'ai fait quelques tests et la suppression Display.clear(); et Display.update(); résout le problème mais ce n'est pas une solution viable.

EDIT 2:

Tout comme des informations supplémentaires du programme a travaillé à l'origine, puis j'ai commencé à bidouiller avec elle et le gestionnaire d'événements foiré.

+0

Essayez de mettre tout ce que votre boucle intérieure contient à l'extérieur de celui-ci et laissez simplement vide {} pour cela. En outre, vous ne devriez pas utiliser 'else if' pour les contrôles de mouvement. Par exemple, je dirais que si vous appuyez sur 'W' et' S', votre camer devrait rester immobile. – HolyBlackCat

+0

@HolyBlackCat Je ne suis pas sûr de comprendre ce que vous voulez dire, si vous itérez plus à ce sujet et que vous le créez comme réponse, je peux le marquer comme correct –

+0

Vous ne devriez pas le marquer comme correct, sauf si cela fonctionne vraiment pour vous. Je veux dire essayer de déplacer tout le contenu de 'while (SDL_PollEvent()) {...}' en dehors de cela. – HolyBlackCat

Répondre

1

Comme @HolyBlackCat a dit dans les commentaires, dans cette partie du code:

while (SDL_PollEvent(&ev) != 0) 
{ 
    //if statements here 
} 

La boucle while est inutile, comme vous avez déjà un sous la forme de:

while (!Display.IsClosed()) 
{ 
    //main game loop 
} 

Et avoir une autre boucle à l'intérieur causera juste des problèmes.

En tout cas, espérons que cela aide et s'il vous plaît ne marque pas comme la réponse si @HolyBlackCat crée un ou cela ne fonctionne pas pour vous. À votre santé.