在显示openGL后删除文本

Deleting text after it has shown openGL

本文关键字:删除 文本 openGL 显示      更新时间:2023-10-16

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

所以要澄清从屏幕上删除文本的更好方法是什么?

整个班级可以在这里找到

显然,你必须有某种计时器来检查你是否必须在这一帧中绘制某些内容(主循环中的单个步骤)或时间过期并且必须隐藏它(等于简单地不绘制)。

下面是一个快速(伪)代码示例(可能包含错误!)查看方法,而不是语法):
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);
        }
        ...
    }
    ...
}

希望有帮助!