2017-03-11 21 views
1

OpenGLでゲームを作成しているときに、SDL_PollEventに問題が発生しました。たとえば、キーを押したままにしておくと、プログラムの1~3秒前に待機する必要があります私が今行ったことを実現します。SDL_PollEventがイベントに応答しない

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

すべての機能は、彼らが後に名前が付けられ、正常に動作しているものを実行します。これは私のmain.cppにです。

EDIT:

私はいくつかのテストを行い、Display.clear();Display.update();修正問題を削除しましたが、これは実行可能なソリューションではありません。

EDIT 2:

、プログラムが働いていただけのように余分な情報は、その後、私はそれを周りいじる開始し、イベントハンドラがめちゃくちゃ。

+0

あなたの内側のループがそれの外側にあるすべてを置いて、空の '{}'のままにしてください。また、動きコントロールに 'else if'を使用しないでください。例えば、私は 'W'と' S'の両方が押されたとしたら、あなたのキャスターはまだとどまるべきです。 – HolyBlackCat

+0

@HolyBlackCat私はあなたが何を意味するのか分かりません。これについてもっと反復し、それを正しいものとしてマークすることができればそれを作成してください。 –

+0

本当にあなたに合っていなければ、つまり、 'while(SDL_PollEvent()){...} 'のすべての内容をその外に移動しようとしています。 – HolyBlackCat

答えて

1

@HolyBlackCatは、コードのこの部分では、コメントで言ったように:

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

:あなたはすでにの形で1を持っているよう

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

whileループは、不要ですそして、内部で別のループがあると問題が発生します。

これは役に立ちます。 @HolyBlackCatで作成されている場合、またはこれがうまくいかない場合は、回答としてマークしないでください。乾杯。

関連する問題