0

C++ と OpenGL で 3D ゲームを書いています。

私がやりたいことは、プレイヤーがオブジェクトと衝突したときに、画面に小さなテキストが表示され、数秒後に消えることです。

衝突時にテキスト自体を画面に描画する方法を知っています。私の問題は、数秒後にテキストを削除する方法がわからないことです。

私は現在、この関数を使用してテキストを画面に描画しています:

void Gui::drawStrokeText(_In_ const string& p_string, _In_ int p_x, _In_ int p_y, _In_ int p_z)
 {
  glPushMatrix();
  glTranslatef(p_x, p_y, p_z);
  glScalef(0.25f, -0.25f, p_z);
  glColor4f(200/255.f, 200/255.f, 200/255.f, 128/255.f);

  for (int i = 0; i < p_string.size(); ++i)
  {
      glutStrokeCharacter(GLUT_STROKE_ROMAN , p_string[i]);
  }
  glPopMatrix();
 }

それでは、画面からテキストを削除するより良い方法は何ですか?

全クラスはこちら

4

1 に答える 1

1

明らかに、このフレームで何かを描画する必要があるかどうか (メイン ループの 1 つのステップ)、または時間が経過して非表示にする必要があるかどうか (単純に描画しないのと同じ) を確認するために、ある種のタイマーが必要です。

これは高速な(疑似)コードの例です(エラーが含まれている可能性があります!構文ではなくアプローチを見てください):

Timer* g_Timer; // timer, for example wrapped std::chrono or Windows QueryPerformanceCounter()
Renderer* g_Renderer;

int main()
{
    ...
    while( running ) // main loop
    {
        ...
        g_Timer->Tick(); // calculate delta time, FPS, etc.
        g_Renderer->RenderOneFrame();
        ...
    }
    ...
}

class GameObject
{
public:
    void ShowText( const std::wstring& text, const float currentTime, const float showDuration )
    {
        hideTextTime = currentTime + showDuration;
        collisionText = text;
    }

    float WhenWeMustHideText() const { return hideTextTime; }
    std::wstring GetCollisionText() const { return collisionText; }
private:
    float hideTextTime;
    std::wstring collisionText;

};

void RenderOneFrame()
{
    ...
    float time = g_Timer->GetTime(); // time elapsed since game start in milliseconds
    float dt = g_Timer->GetDelta(); // time elapsed since previous frame in milliseconds
    ...

    for(int i = 0; i < numObjects; ++i)
    {
        // check collision somehow
        if( object[i]->HasCollision() )
        {
            object->ShowText( L"Boom!", time , 5000.0f );
        }

        // check if we must draw text or just forget to do this ("hide")
        if ( time <= object[i]->WhenWeMustHideText() )
        {
            g_Renderer->DrawText(object[i]->GetCollisionText(), object[i]->GetPosition() + offset);
        }
        ...
    }
    ...
}

それが役に立てば幸い!

于 2013-04-23T21:27:47.007 に答える