2017-03-11 5 views
1

Ich erstelle ein Spiel in OpenGL und habe Probleme damit, dass SDL_PollEvent nicht alle Ereignisse aufnimmt. Wenn ich zum Beispiel eine Taste drücke und drücke, muss ich ~ 1-3 Sekunden vor dem Programm warten begreift, was ich gerade getan habe. Das ist mein main.cpp:SDL_PollEvent reagiert nicht auf Ereignisse

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

Alle Funktionen tun, was sie nach sind benannt und ordnungsgemäß funktionieren.

EDIT:

Ich habe einige Tests durchgeführt und Entfernen Display.clear(); und Display.update(); behebt das Problem, aber dies keine gangbare Lösung.

EDIT 2:

Genau wie zusätzliche Informationen das Programm ursprünglich gearbeitet, dann begann ich mit ihm Hantieren und der Event-Handler vermasselt.

+0

Versuchen Sie, alles, was Ihre innere Schleife enthält, außerhalb davon zu platzieren und lassen Sie einfach '{}' dafür leer. Außerdem sollten Sie "else if" nicht für Bewegungssteuerungen verwenden. Zum Beispiel würde ich sagen, wenn sowohl "W" als auch "S" gedrückt werden, sollte dein Kameramann ruhig bleiben. – HolyBlackCat

+0

@HolyBlackCat Ich bin mir nicht sicher, ob ich verstehe, was Sie meinen, wenn Sie mehr darüber iterieren und es als Antwort erstellen, kann ich es als korrekt markieren –

+0

Sie sollten es nicht als richtig markieren, es sei denn, es funktioniert wirklich für Sie. Ich meine, versuche alle Inhalte von 'while (SDL_PollEvent()) {...}' außerhalb davon zu verschieben. – HolyBlackCat

Antwort

1

Wie @HolyBlackCat gesagt hat, in den Kommentaren, in diesem Teil des Codes:

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

Die while-Schleife nicht erforderlich ist, wie Sie bereits ein in der Form haben:

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

Und wenn Sie eine weitere While-Schleife haben, wird das nur Probleme verursachen.

Auf jeden Fall hoffe das hilft und bitte nicht als die Antwort markieren, wenn @HolyBlackCat erstellt, oder das funktioniert nicht für Sie. Prost.

Verwandte Themen