Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL_PollEvent未响应事件_C++_Sdl 2 - Fatal编程技术网

C++ SDL_PollEvent未响应事件

C++ SDL_PollEvent未响应事件,c++,sdl-2,C++,Sdl 2,我正在OpenGL中创建一个游戏,SDL_PollEvent无法拾取所有事件,例如,如果我按住一个键,我必须等待约1-3秒,程序才会意识到我刚刚做了什么。这是我的main.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"

我正在OpenGL中创建一个游戏,SDL_PollEvent无法拾取所有事件,例如,如果我按住一个键,我必须等待约1-3秒,程序才会意识到我刚刚做了什么。这是我的main.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.h”
#包括“Mesh.h”
#包括“Shader.h”
#包括“Texture.h”
#包括“Transform.h”
#包括“Camera.h”
#包括
#定义宽度800
#定义高度600
int main(int argc,char*argv[])
{
显示(800600,“OpenGL”);
顶点顶点[]={顶点(glm::vec3(-0.5,-0.5,0),glm::vec2(0.0,0.0)),
顶点(glm::vec3(0,0.5,0),glm::vec2(0.5,1.0)),
顶点(glm::vec3(0.5,-0.5,0),glm::vec2(1.0,0.0)),};
无符号整数索引[]={0,1,2};
SDL_Init(SDL_Init_EVERYTHING);
//网状车辆(“./res/Test2.obj”);
//网格测试(顶点,sizeof(顶点)/sizeof(顶点[0]),索引,sizeof(索引)/sizeof(索引[0]);
网状地面(“./res/Ground2.obj”);
着色器(“./res/basicShader”);
//纹理(“./res/CarUV.png”);
纹理测试(“./res/ground.jpg”);
摄像机(glm::vec3(0,0,-14),70.f,(浮动)宽度/(浮动)高度,0.01f,1000.0f);
变换;
const Uint8*键状态;
transform.GetPos().x=0;
transform.GetPos().y=0;
transform.GetPos().z=0;
transform.GetRot().x=80;
transform.GetRot().y=0;
transform.GetRot().z=0;
浮动计数器=0.0f;
而(!Display.IsClosed())
{
显示。清除(0.0f、0.15f、0.3f、1.0f);
浮点sinCounter=sinf(计数器);
浮动cosf计数器=cosf(计数器);
SDL_事件ev;
while(SDL_PollEvent(&ev)!=0)
{
keyState=SDL_GetKeyboardState(NULL);
if(键状态[SDL\U扫描代码\U W])
{
摄像机。向前移动(1);

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

while (SDL_PollEvent(&ev) != 0)
{
    //if statements here 
}
while循环是不必要的,因为您已经有了以下形式的while循环:

while (!Display.IsClosed())
{
    //main game loop
}
在里面有另一个while循环只会引起问题

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

尝试将您的内部循环包含的所有内容都放在它之外,只留下空的
{}
。另外,你不应该使用
else if
进行运动控制。例如,我会说如果同时按下
W
S
,你的相机应该保持静止。@HolyBlackCat我不确定我是否理解你的意思,如果你对此进行更多的迭代并将其创建为一个答案,我可以将其标记为正确,你不应该将其标记为c除非它真的对您有效,否则请更正。我的意思是尝试将
的所有内容移到它之外,而(SDL_polleevent()){…}