c++ - SDL_PollEvent 不响应事件

标签 c++ sdl-2

我正在 OpenGL 中创建一个游戏,遇到 SDL_PollEvent 问题,没有接收到所有事件,例如,如果我按住一个键,我必须等待大约 1-3 秒,程序才会意识到我刚才有什么完毕。这是我的ma​​in.cpp:

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

所有函数都按照它们的名字命名并正常工作。

编辑:

我已经做了一些测试并删除了 Display.clear();Display.update(); 解决了这个问题,但这不是一个可行的解决方案。

编辑 2:

就像程序最初运行的额外信息一样,然后我开始摆弄它,事件处理程序搞砸了。

最佳答案

正如@HolyBlackCat 在评论中所说,在这部分代码中:

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

while 循环是不必要的,因为您已经有了以下形式的循环:

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

在内部有另一个 while 循环只会导致问题。

无论如何希望这对您有所帮助,请不要将其标记为答案 @HolyBlackCat 创建一个,否则这对您不起作用。干杯。

关于c++ - SDL_PollEvent 不响应事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42736563/

相关文章:

c++ - SDL2 C++ - multimap 像渲染错误

c++ - 如何理解C++ primer 3rd中的句子

c++ - 为什么首选非虚拟接口(interface)?

c++ - 如何移动 3D 框以保持在旋转平面上?

c++ - 正确答案但在效率阶段出现运行时错误

opengl - 由 SDL2 旋转的纹理未正确消除锯齿

c++ - 为什么SDL_PollEvent这么慢?

c++ - 在键盘输入期间测试事件标志

c++ - SDL2 : LNK1561: entry point must be defined

c++ - 函数不工作,参数传递失败