显示openGL后删除文本

时间:2013-04-23 20:21:44

标签: c++ opengl text

我正在用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();
 }

那么澄清一下从屏幕上删除文本的更好方法是什么?

可以找到整个班级here

1 个答案:

答案 0 :(得分: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);
        }
        ...
    }
    ...
}

希望它有所帮助!