Установить цвет glutBitmapCharacter ()? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь улучшить игровую программу 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
}

Я нашел этот ответ, который представляется актуальным: Как установить цвет текста в OpenGl

Я отметил выше, где я скопировал код из этого ответа, который, кажется, должен помочь.

К сожалению, мой текст все еще выходит белым.Это не устанавливает цвет вообще.Я подозреваю, что упускаю что-то фундаментальное (и, вероятно, простое), но я просто не смог увидеть, что.

Может кто-нибудь определить, что мне нужно сделать, чтобы текст отображался другим цветом?честно говоря, я бы даже был рад, если бы он отображался в любом цвете, кроме белого, даже если он не изменился ...

Вот скриншот игры в действии: GameScreenShot

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

В конце концов, это была комбинация ответа datenwolf выше и изменения кода, чтобы НЕ использовать оператор case, который добился цели.(Вместе с еще одним намеком из другого стекового ответа)

Я подумал, что должен опубликовать ответ, чтобы дать точный код, который в итоге заставил его работать ...

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();

}
0 голосов
/ 24 февраля 2019

Позвоните glRasterPos после установки цвета.

...