我正在尝试使用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);
答案 0 :(得分:0)
我几周前完成了游戏,我认为我应该分享这种奇怪的行为,以防万一有人遇到同样或类似的问题。
基本上,talles
在他的评论中是正确的,问题是X和Y变量属于Sint16类型,它引起了一些问题 - 解决方案很简单 - 我创建了一个结构Vector2f并映射花车到Sint16。