设置glutBitmapCharacter()的颜色?

问题描述 投票:1回答:2

我正在尝试增强MoonLander游戏程序 - 只是想要更好地理解事物。

我想在燃油降到一定水平时添加警告,我希望警告改变颜色。我的游戏循环以大约30帧/秒的速度运行。所以我创建了一个成员变量,它在特定的帧数下“设置”INT。我做了一些检查 - 我的帧计数器代码工作正常 - 我的setWhichColour函数也是如此。文本确实在屏幕上绘制 - 但每次都用白色绘制......

以下是设置“color”成员变量的代码

   if (lander.getFuel() < 200)
   {
       incrementFrameCounter();
       if (frameCounter % 15 == 0)
       {
           setWhichColour(0);
       }
       else if (frameCounter % 20 == 0)
       {
           setWhichColour(1);
       }
       else if (frameCounter % 50 == 0)
       {
           setWhichColour(2);
       }
       else 
       {}
       drawText(Point(40, 40), "Warning: Fuel Below 200",getWhichColour());
   }

这是我用来在屏幕上绘制文本的drawText函数。 case语句只传递一个整数值来选择要触发的glColor3f序列。每次游戏循环运行时,drawText函数运行一次。

void drawText(const Point & topLeft, const char * text, int iColour)
{

    void *pFont = GLUT_BITMAP_HELVETICA_12;  

    // prepare to draw the text from the top-left corner
    glRasterPos2f(topLeft.getX(), topLeft.getY());

    glPushAttrib(GL_CURRENT_BIT); // <-- added this after finding another answer
    switch (iColour)
    {
    case 0: // red
        glColor3f(1.0 /* red % */, 0.0 /* green % */, 0.0 /* blue % */);
    case 1: // green
        glColor3f(0.0 /* red % */, 1.0 /* green % */, 0.0 /* blue % */);
    case 2: //blue
        glColor3f(0.0 /* red % */, 0.0 /* green % */, 1.0 /* blue % */);
    default: //white
        glColor3f(1.0 /* red % */, 1.0 /* green % */, 1.0 /* blue % */);
    }

    // loop through the text
    for (const char *p = text; *p; p++)
        glutBitmapCharacter(pFont, *p);
    glPopAttrib(); // <-- added this after finding another answer
}

我发现这个答案似乎是相关的:How to Set text color in OpenGl

我已经注意到上面我在那个答案的代码中复制了它似乎应该有所帮助。

不幸的是 - 我的文字仍然是白色的。它根本不设置颜色。我怀疑我缺少一些基本的东西(可能很简单),但我只是无法看到什么。

任何人都可以确定我应该做些什么来让文本以不同的颜色显示 - 说实话 - 我甚至会很高兴它只是显示除了白色以外的任何颜色,即使它没有改变.. 。

这是游戏的截图:GameScreenShot

c++ opengl colors glut
2个回答
2
投票

设置颜色后调用glRasterPos


1
投票

最后,它是datenwolf上面的答案的组合,并且将代码更改为不使用执行该技巧的案例陈述。 (以及来自另一个堆栈答案的另一个提示)

我想我应该发一个答案,给出最终使其正常工作的确切代码......

void drawText(const Point & topLeft, const char * text, int iColour)
{

    void *pFont = GLUT_BITMAP_HELVETICA_12;  // also try _18

    glPushAttrib(GL_CURRENT_BIT);

    if (iColour == 0)
        glColor3f(1.0 /* red % */, 0.0 /* green % */, 0.0 /* blue % */); //red
    else if (iColour == 1)
        glColor3f(0.0 /* red % */, 1.0 /* green % */, 0.0 /* blue % */); //green
    else if (iColour == 2)
        glColor3f(0.0 /* red % */, 0.0 /* green % */, 1.0 /* blue % */); //blue

    // prepare to draw the text from the top-left corner
    glRasterPos2f(topLeft.getX(), topLeft.getY());

    // loop through the text
    for (const char *p = text; *p; p++)
        glutBitmapCharacter(pFont, *p);

    // This line was located in a stackechange answer on how to get colour set
    glPopAttrib();

}
© www.soinside.com 2019 - 2024. All rights reserved.