SDL_GetKeyState()的奇怪行为 我试图用SDL在C++中编写一个乒乓克隆。基本上,我编写了一个简单的引擎,负责渲染和更新 void Player::update(Uint32 ticks, SDL_Event *event, Uint8 *keys) { if(keys[SDLK_UP]) { if(m_bounds.y > 0) m_bounds.y -= 2.0f * (ticks / 1000.0f); } else if(keys[SDLK_DOWN]) { if(m_bounds.y < (windowInfo.getHeight() - m_bounds.h)) m_bounds.y += 2.0f * (ticks / 1000.0f); } }

SDL_GetKeyState()的奇怪行为 我试图用SDL在C++中编写一个乒乓克隆。基本上,我编写了一个简单的引擎,负责渲染和更新 void Player::update(Uint32 ticks, SDL_Event *event, Uint8 *keys) { if(keys[SDLK_UP]) { if(m_bounds.y > 0) m_bounds.y -= 2.0f * (ticks / 1000.0f); } else if(keys[SDLK_DOWN]) { if(m_bounds.y < (windowInfo.getHeight() - m_bounds.h)) m_bounds.y += 2.0f * (ticks / 1000.0f); } },c++,sdl,C++,Sdl,编辑: 我对代码进行了一些编辑,以查看所有值,代码现在如下所示: if(keys[SDLK_UP]) { if(m_bounds.y > 0) { m_bounds.y -= 2.0f * (ticks / 1000.0f); std::cout << 2.0f * (ticks / 1000.0f) << " value of Y:" << m_bounds.y << std::endl;

编辑: 我对代码进行了一些编辑,以查看所有值,代码现在如下所示:

if(keys[SDLK_UP])
{
    if(m_bounds.y > 0)
    {
        m_bounds.y -= 2.0f * (ticks / 1000.0f);
        std::cout << 2.0f * (ticks / 1000.0f) << " value of Y:" << m_bounds.y << std::endl;
    }
}

else if(keys[SDLK_DOWN])
{
    if(m_bounds.y < (windowInfo.getHeight() - m_bounds.h))
    {
        m_bounds.y += 2.0f * (ticks / 1000.0f);
        std::cout << 2.0f * (ticks / 1000.0f) << " value of Y:" << m_bounds.y << std::endl;
    }
}

几周前我已经完成了游戏,我想我应该分享一下是什么导致了这种奇怪的行为,以防有人遇到同样或类似的问题


基本上,
talles
在他的评论中是正确的,问题是X和Y变量是Sint16类型的,这导致了一些问题-解决方案很简单-我创建了一个结构向量2f并将浮点映射到Sint16。

我猜向上和向下都是同时按下的,至少对程序来说是这样的。。。如何填充
m_键
?我确实使用此代码填充m_键
m_键=SDL_GetKeyState(0)
和not,它们没有同时按下,我尝试了许多按下的变体,但没有任何更改。您的
Player::update
函数中调试输出不足。还有更多的调查可以做done@michy04:如果您将
播放器
定位在坐标
(0,0)
,它是否有效?听起来像是浮点精度问题的典型案例。
if(keys[SDLK_UP])
{
    if(m_bounds.y > 0)
    {
        m_bounds.y -= 2.0f * (ticks / 1000.0f);
        std::cout << 2.0f * (ticks / 1000.0f) << " value of Y:" << m_bounds.y << std::endl;
    }
}

else if(keys[SDLK_DOWN])
{
    if(m_bounds.y < (windowInfo.getHeight() - m_bounds.h))
    {
        m_bounds.y += 2.0f * (ticks / 1000.0f);
        std::cout << 2.0f * (ticks / 1000.0f) << " value of Y:" << m_bounds.y << std::endl;
    }
}
m_bounds.y += 2.0f * (ticks / 1000.0f);