SDL_GetKeyState()的奇怪行为

时间:2013-01-10 16:50:52

标签: c++ sdl

我正在尝试使用SDL在C ++中编写Pong克隆。基本上,我写了一个简单的引擎来处理渲染和更新

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

问题在于,当我按下UP键时,一切都像魅力一样,但是当我按下DOWN键时,它根本不起作用。我尝试了所有的东西,几个小时之后我注意到,当我删除刻度并仅添加2.0f它有效,但我不知道为什么,因为UP键的条件看起来完全相同,除了它添加,而不是减去。我一直试图在几个小时内处理这个问题但仍然没有解决它。你知道可能出现什么问题吗?

为了完整性,我附加了一些调用Player :: update函数的代码,以便你知道更多。

void Engine::update()
{
++m_numOfFrames;
m_elapsedTime = SDL_GetTicks() - m_startTime;

while(SDL_PollEvent(&m_event))
{
    if(m_event.type == SDL_QUIT)
    {
        m_isRunning = false;
    }
}

if(m_keys[SDLK_ESCAPE])
{
    m_isRunning = false;
}

for(Entity *entity : m_entities)
{
    entity->update(m_elapsedTime, &m_event, m_keys);
}

m_startTime = SDL_GetTicks();
SDL_PumpEvents();
}

编辑: 我编写了一些代码以查看所有值,代码现在看起来像这样:

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

对于两者来说,控制台中的结果几乎相同,除了DOWN条件,m_bounds.y的值根本没有变化,它总是相同的,虽然它被添加了更高的一行。错误必须在这一行:

m_bounds.y += 2.0f * (ticks / 1000.0f);

1 个答案:

答案 0 :(得分:0)

我几周前完成了游戏,我认为我应该分享这种奇怪的行为,以防万一有人遇到同样或类似的问题。

基本上,talles在他的评论中是正确的,问题是X和Y变量属于Sint16类型,它引起了一些问题 - 解决方案很简单 - 我创建了一个结构Vector2f并映射花车到Sint16。