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

显然,您必须有某种计时器来检查您是否必须在此帧中绘制某些东西(主循环中的一个步骤)或时间已到并且您必须隐藏它(等于根本不绘制)。

这是一个快速(伪)代码示例(可能包含错误!看方法,而不是语法):

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 回答