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はまったく変更されません。1行上に追加されていますが、常に同じです。エラーは次の行にある必要があります。

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

1 に答える 1

0

私は数週間前にゲームを終了しました。誰かが同じまたは同様の問題に遭遇した場合に備えて、この奇妙な動作の原因を共有する必要があると思いました。

基本的に、talles彼のコメントでは正しいですが、問題はX変数とY変数がSint16型であるということでした。これにより、いくつかの問題が発生しました。解決策は簡単でした。構造体Vector2fを作成し、floatをSint16にマップしました。

于 2013-02-19T18:08:56.310 に答える