0

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

1 回答 1

0

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

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

于 2013-02-19T18:08:56.310 回答