- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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.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/
所以我正在阅读这篇文章,其中包含“SDL 中多线程编程的提示和建议”-https://vilimpoc.org/research/portmonitorg/sdl-tips-and-tricks.ht
我正在 OpenGL 中创建一个游戏,遇到 SDL_PollEvent 问题,没有接收到所有事件,例如,如果我按住一个键,我必须等待大约 1-3 秒,程序才会意识到我刚才有什么完毕。这是我的mai
我目前正在使用 SDL 制作一款游戏,但我遇到了一个问题,即 SDL 无法获取某些事件。例如,我会按“w”向前移动,同时移动鼠标环顾四周。但是假设我然后按“a”或“d”,SDL 不会选择这些事件,甚至
我正在使用 SDL 库来捕获屏幕上的触摸和鼠标事件。但是如果我断开触摸屏并重新连接它,有时我会停止获取手指触摸事件,即 SDL_FINGERMOTION、SDL_FINGERDOWN、SDL_FING
这是SDL2代码的一部分 SDL主函数 int main(int argc,char *argv[]) { ... ... bool quit=false; S
我正在阅读一本有关SDL的介绍性书籍代码,并且有这样的示例代码: void Game::handleEvents() { SDL_Event event; if (SDL_PollEv
我使用 SDL2 在 C++ 中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent 似乎异常缓慢,即使没有任何事情发生也是如此。 我发送了 deltaTime 来控制每个循环,
我最近才开始使用 C 语言并使用 SDL,所以我确信我搞砸了一些基本的东西,但我能找到的每个示例代码看起来都像我的,除了我的不起作用。因此,欢迎任何帮助。 #include #include in
我目前正在浏览 SDL2 的 Lazy Foo 教程(我在 Linux 机器上这样做),我遇到了一些错误,其中包含 SDL_PollEvent 在我的主要循环似乎阻止了 SDL_UpdateWindo
我使用 SDL2 在 C++ 中拼凑了一个非常基本的游戏循环,我注意到每隔几秒,SDL_PollEvent 似乎异常缓慢,即使没有发生任何事情。 我将我的 deltaTime 发送到控制台每个循环,它
我目前正在使用 C 和 gcc 编译器来处理 SDL2。我已经设法让图像在 2 秒后自动加载并关闭,但现在我想等到用户按下顶部的 X 按钮,或者用户按下 ESC 键. 但是,在几个打印语句显示一切正常
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我已经使用 SDL 一段时间了,但现在看来我在处理键盘事件时一直在以错误的方式做事。 通常我的主循环看起来像这样: int main() { SDL_Init(SDL_INIT_VIDEO);
我有一个程序可以使用 xset dpms force on/off 打开和关闭屏幕,并且还可以循环调用 SDL_PollEvent(&e)。使用 xset 关闭显示器后,任何对 SDL_PollEve
我是一名优秀的程序员,十分优秀!