1

スコアを画面に表示する方法がわかりません。私は現在、それを機能させてコンソールウィンドウに出力していますが、それだけです。

ボールがボックスに当たると、NX_NOTIFY_ON_TOUCH イベントのカウントが 1 つ増加し、更新機能中にコンソール ウィンドウに出力されます。

シミュレーション コードの .h ファイルにカウント変数を配置し、視覚化用の .cpp ファイルに格納してから、次の行で提供される HD 関数を使用して画面に出力しようとしました。

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

それを見た後、すぐにそのコードを使用するとカウントの変数にアクセスできないことに気付きました。

とにかくビジュアル画面に印刷する方法を知っている人はいますか。

EDIT: テキストを画面に描画する関数

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

ここで最初の問題:

シミュレーション コードの .h ファイルにカウント変数を配置し、視覚化のために .cpp ファイルに格納してから、ラインで提供される HD 関数を使用して画面に出力しようとしました。

変数のスコープとコンパイル単位について自分自身に知らせてください。すぐに解決するには、ヘッダー ( .h) ファイルの変数宣言を割り当てなしで extern に変更し、コンパイル ユニット ソース ファイルの 1 つ ( .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 は、プッシュ/ポップ フレーム内にないため、modelview マトリックスを破棄します。また、それは冗長です

    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 に答える