Шаг 12 - Полноэкранный режим

Ну, если в дверях никто не застрял, то перейдем к следующему шагу.

Те, кто шагает с нами в ногу наверное уже столкнулись с проблемой отладки полноэкранного приложения. И это верно. Если кто-нибудь отлаживал приложения под Linux в SVGA режиме или хотя бы под DOS-ом в x-mode, то наверняка знает, что без remote debuger-а жить очень трудно. Но!!! Нас же никто не заставляет работать в полноэкранном режиме пока мы пишем и отлаживаем программу. А потом, в release мы всегда сможем переключиться в полноэкранный режим (да и сейчас это никто не мешает сделать, достаточно объявить какую-нибудь константу и в зависимости от ее состояния переключаться в оконный или полноэкранный режим). Поэтому давайте немного переделаем скелет нашего приложения так, чтобы оно работало в окне. Тогда мы сможем легко пользоваться отладчиком VC++, MFC Tracer-ом и всякими другими приятными штучками.

Я не буду подробно расписывать все шаги как я это делал первый раз при создании full screen приложения.

Все различия касаются только функции WinMain.

По сути дела мы добавили в стили окна параметр WS_OVERLAPPEDWINDOW и больше не возимся с сохранением контекста отображения, т.е. со структурой DEVMODE.

Как говорится: "Найдите 10 отличий".

И еще один момент. К сожалению есть реализации opengl32.dll и glu32.dll, с которыми наше приложение работает не совсем корректно. В часности у меня стояли dll-ки от SGI и при изменении размеров окна приложение завершается с ошибкой. Я проверял работу на "чистом" Win98 и WinNT 4.0 - все работает. Если у вас что-то не работает, сообщайте мне. Будем искать ошибку вместе.

Перейдем к основной теме.

Создадим новый проект. Я назвал его PiraCube. Скоприруйте в него шаблон, о котором я говорил выше, т.е. я имею в виду скелет оконного приложения под Windows и начнем портить исходник. Изменения кода будут касаться опять только функции Draw()

void Draw(void)
{
	// как обычно указываем какие буферы будем чистить
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	// обнуляем текущую матрицу
	glLoadIdentity();

	// отскакиваем назад и влево (по Х) и поворачиваем относительно Y и Z
	glTranslatef(-1.5f, 0.0f, -5.0f);
	glRotatef(Trot, 0.0f, 1.0f, 1.0f);

	// Начинаем рисовать все грани пирамидки
	glBegin(GL_TRIANGLES);
		glColor3f(1.0f,0.0f,0.0f);		
		glVertex3f( 0.0f, 1.0f, 0.0f);	
		glColor3f(0.0f,1.0f,0.0f);		
		glVertex3f(-1.0f,-1.0f, 1.0f);	
		glColor3f(0.0f,0.0f,1.0f);		
		glVertex3f( 1.0f,-1.0f, 1.0f);	

		glColor3f(1.0f,0.0f,0.0f);		
		glVertex3f( 0.0f, 1.0f, 0.0f);	
		glColor3f(0.0f,0.0f,1.0f);		 
		glVertex3f( 1.0f,-1.0f, 1.0f);	
		glColor3f(0.0f,1.0f,0.0f);		
		glVertex3f( 1.0f,-1.0f, -1.0f);	

		glColor3f(1.0f,0.0f,0.0f);		
		glVertex3f( 0.0f, 1.0f, 0.0f);	
		glColor3f(0.0f,1.0f,0.0f);		
		glVertex3f( 1.0f,-1.0f, -1.0f);	
		glColor3f(0.0f,0.0f,1.0f);		
		glVertex3f(-1.0f,-1.0f, -1.0f);	

		glColor3f(1.0f,0.0f,0.0f);		
		glVertex3f( 0.0f, 1.0f, 0.0f);	
		glColor3f(0.0f,0.0f,1.0f);		
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glColor3f(0.0f,1.0f,0.0f);	
		glVertex3f(-1.0f,-1.0f, 1.0f);
	glEnd();

	// очищаем матрицу
	glLoadIdentity();
	
	// переносимся и поворачиваемся
	glTranslatef(1.5f, 0.0f, -5.0f);
	glRotatef(Qrot, 1.0f, 1.0f, 0.0f);

	// рисуем кубик
	glBegin(GL_QUADS);
		glColor3f(0.0f,1.0f,0.0f);	
		glVertex3f( 1.0f, 1.0f,-1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
		glVertex3f(-1.0f, 1.0f, 1.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f); 

		glColor3f(1.0f,0.5f,0.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f); 

		glColor3f(1.0f,0.0f,0.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f); 

		glColor3f(1.0f,1.0f,0.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
		glVertex3f( 1.0f, 1.0f,-1.0f);
 
		glColor3f(0.0f,0.0f,1.0f);	
		glVertex3f(-1.0f, 1.0f, 1.0f);
		glVertex3f(-1.0f, 1.0f,-1.0f);
		glVertex3f(-1.0f,-1.0f,-1.0f);
		glVertex3f(-1.0f,-1.0f, 1.0f);
 
		glColor3f(1.0f,0.0f,1.0f);	
		glVertex3f( 1.0f, 1.0f,-1.0f);
		glVertex3f( 1.0f, 1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f, 1.0f);
		glVertex3f( 1.0f,-1.0f,-1.0f);
	glEnd();
	
	// Поврачиваемся еще немного
	Trot += 0.3f;
	Qrot -= 0.3f;
}

Вот и все. Это все очень легко.

Не хорошо как-то получается. Фигурки есть, а из чего они сделаны не понятно. Так что переходим в следующий шаг и делаем их из какого-нибудь материала.

А на последок рекоммендую посмотреть пример скелета приложения, которое может работать как в окне, так и в full screen.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Kirill V. Ratkin - 20.01.2000