私は、3Dカメラを少し修正して、カメラの動きを抑えようとしています。私は入力用にSDLを使用していましたが、ボタンを押したままにすると一時的に移動して一時停止し、適切に動き始めて動きが反応しないようにするこの作業を行っています。SDL2&OpenGLを使用した非瞬間的/動きの激しい動き
私はそれのGIFを記録し、それがうまくいけば、何が起こっているか見るために少し難しいかもしれないが、それはいくつかのアイデアを与えるだろう:
前進してから移動、右のようになります:
:aaaaaaaaaaaaaaaaaaaaa重要なコードはここにあるが、必要に応じてより多くのために気軽にwwwwwwwwwwwwwwwwワット
//Poll events
SDL_Event event;
while (m_EngineState != EngineState::EXIT)
{
m_last = m_current;
m_current = SDL_GetPerformanceCounter();
deltaTime = (double)((m_current - m_last) * 1000/SDL_GetPerformanceFrequency());
while (SDL_PollEvent(&event))
{
switch (event.type) {
case SDL_QUIT:
m_EngineState = EngineState::EXIT;
break;
case SDL_MOUSEMOTION:
break;
case SDL_KEYDOWN:
m_Keys[event.key.keysym.sym] = true;
break;
case SDL_KEYUP:
m_Keys[event.key.keysym.sym] = false;
break;
}
ProcessEvents();
}
void Engine::ProcessEvents()
{
if (m_Keys[SDLK_w])
{
m_Camera->MoveForward(5.0f*(deltaTime*0.001));
}
if (m_Keys[SDLK_s])
{
m_Camera->MoveForward(-5.0f*(deltaTime*0.001));
}
if (m_Keys[SDLK_d])
{
m_Camera->MoveRight(5.0f*(deltaTime*0.001));
}
if (m_Keys[SDLK_a])
{
m_Camera->MoveRight(-5.0f*(deltaTime*0.001));
}
}
void Camera::MoveForward(float amount)
{
m_pos += m_forward * amount;
}
void Camera::MoveRight(float amount)
{
m_pos += glm::cross(m_forward, m_up) * amount;
}
まず私はパフォーマンス上の問題がないことを確認します。いくつのFPSがありますか? –
なぜイベントループの中で 'ProcessEvents'を呼びますか?ここにあるイベントの数に関係なく、フレームごとに1回呼び出されるべきではありませんか? – keltar
ところで、あなたが解説した振舞いを「キーリピート」と呼びます。それはあなたの質問でここで文字ボタンを押して、それを保持する場合と同じです - 最初のプレス、一時停止、そして連続リピート。休止間隔と繰り返し間隔は、OS /ディスプレイ・サーバーによって制御されます。 – keltar