1

我发现很难弄清楚如何让我的分数出现在屏幕上。我目前让它工作并打印到控制台窗口,但就是这样。

当球击中盒子时,NX_NOTIFY_ON_TOUCH 事件的计数增加一,并在更新功能期间打印在控制台窗口中。

我已将 count 变量放入模拟代码的 .h 文件中,然后将其放在 .cpp 文件中以进行可视化,然后尝试使用以下行提供的 HD 函数将其打印到屏幕上:

 hud.AddDisplayString("Hit Count = ",0.0f,0.89f);

看了之后,我很快意识到使用该代码我无法访问变量以进行计数。

有谁知道无论如何可以打印到可视屏幕。

编辑:将文本绘制到屏幕的功能

void drawText(float *text, int length, int x, int y)
{
glMatrixMode(GL_PROJECTION);
double *matrix = new double[16];
glGetDoublev(GL_PROJECTION_MATRIX, matrix);
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glLoadIdentity();
glRasterPos2i(x, y);
for(int i=0; i<length; i++)
{
    glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixd(matrix);
glMatrixMode(GL_MODELVIEW);
}

然后在显示功能中我写:

glColor3f(5,5,5);
drawText(&HITcount, HITcount, 0 , 535);
4

1 回答 1

2

这里的第一个问题:

我已将 count 变量放入模拟代码的 .h 文件中,然后将其放入 .cpp 文件中以进行可视化,然后尝试使用 line 提供的 HD 函数将其打印到屏幕上

请了解变量范围和编译单元。为了立即缓解,将头.h文件 () 中的变量声明更改为 extern,无需赋值,并且在其中一个编译单元源文件 ( .c*) 中实际定义变量,理想情况下使用初始化赋值。

有谁知道无论如何可以打印到可视屏幕,因为我在网上找不到任何有效的帮助。

切换到符合您的 HUD 需求的投影,并在您的场景上绘制分数。您可以随时随地切换投影和视口。专业提示:如果您在窗口的调整大小处理程序中有任何处理投影矩阵的代码,请将其移动到绘图代码中。

因评论而更新

让我评论一下这个drawText功能

void drawText(float *text, int length, int x, int y)
{ 
    glMatrixMode(GL_PROJECTION);
    double *matrix = new double[16];
    glGetDoublev(GL_PROJECTION_MATRIX, matrix);

这实际上是有道理的,因为投影矩阵 stap 的嵌套深度可能不足以使用 glPushMatrix/glPopMatrix。但在函数结束时,它错过了释放分配的内存。事实上,使用静态分配的数组更好。元素的数量是众所周知的,并且获取堆栈的内存比在堆上更有效。

    glLoadIdentity();
    glOrtho(0, 800, 0, 600, -5, 5);

这里的问题:正交投影的范围应该与视口大小相匹配。在这里他们没有。

    glMatrixMode(GL_MODELVIEW);

以下 glLoadIdentity 将丢弃模型视图矩阵,因为它不在推送/弹出框架内。也是多余的

    glLoadIdentity();

以下是需要的。

    glPushMatrix();
    glLoadIdentity();

这里的问题是,glRasterPos 的行为就像发射一个顶点,即它被剪裁(我们对此无能为力)并进行深度测试。glutBitmapCharacter(实际上是glBitmap)可能会干扰深度缓冲区。

    glRasterPos2i(x, y);
    for(int i=0; i<length; i++)
    {
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
    }
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glLoadMatrixd(matrix);
    glMatrixMode(GL_MODELVIEW);
}

该功能可以固定如下:

void drawText(float *text, int length, int x, int y)
{
    double old_modelview[16];
    int viewport[4];

    glGetIntegerv(GL_VIEWPORT, viewport);

    glMatrixMode(GL_PROJECTION);
    glGetDoublev(GL_PROJECTION_MATRIX, old_modelview);
    glLoadIdentity();
    glOrtho(viewport[0], viewport[0]+viewport[2],
            viewport[1], viewport[1]+viewport[3],
            -1, 1);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();

    // We're using glBitmap, i.e. legacy functionality anyway
    // so we can use glPush/PopAttrib as well.
    glPushAttrib(GL_DEPTH_BUFFER_BIT);
    glDisable(GL_DEPTH_TEST);
    glDepthMask(GL_FALSE);    

    glRasterPos2i(x, y);
    for(int i=0; i<length; i++) {
        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]);
    }

    glPopAttrib(GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_PROJECTION);
    glLoadMatrixd(old_modelview);

    glMatrixMode(GL_MODELVIEW);
    glPopMatrix();
}
于 2012-12-30T16:58:14.870 回答