Мне трудно понять, как заставить мой Счет отображаться на экране. В настоящее время у меня это работает и печать в окне консоли, но это все.
Когда мяч попадает в поле, счет увеличивается на единицу событие 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);
Первая проблема здесь:
Я поместил переменную count в файл .h для кода симуляции, а затем удалил ее в файл .cpp для визуализации, а затем попытался распечатать на экране, используя функцию 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);
Это на самом деле имеет смысл, так как скобка матрицы проекции может быть недостаточно глубокой для использования glPushMatrix / glPopMatrix. Но в конце функции отсутствует выделенная память. На самом деле лучше использовать статически размещенный массив. Количество элементов хорошо известно, и получение памяти из стека намного эффективнее, чем в куче.
glLoadIdentity();
glOrtho(0, 800, 0, 600, -5, 5);
Проблема здесь: Размеры ортографической проекции должны соответствовать размеру области просмотра. Здесь они не
glMatrixMode(GL_MODELVIEW);
Следующая glLoadIdentity будет уничтожать матрицу просмотра модели, так как она не находится в кадре push / pop. Также это избыточно
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();
}
Других решений пока нет …