我正在尝试使用 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);