xxx-men, я что-то не понял. Нахрена нам класс Super3D, если у нас 2D шахматы? Вот мой вариант движка:
#include <windows.h>
#include <GL/gl.h> // Наша OpenGL библиотека
#include <GL/glu.h> // Библиотека утилит OpenGL
#include <GL/glaux.h> // И еще одна, с ее помощью можно рисовать стандартрые обьекты(сферы, кубы, и др.)
#pragma comment (lib, "OpenGL32.lib")
static GLint resW = 640, resH = 480; // Размер окна
bool isFullscr = false; // Полноэкранный режим (по умолчанию - нет)
BOOL keys[256]; // Массив для процедуры обработки клавиатуры
HGLRC hGLRC; // Контекст рендеринга OpenGL
HDC hDC; // Контекст устройства Windows
GLvoid InitGL() // Вызвать после создания окна GL
{
GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};
glShadeModel (GL_SMOOTH); // Метод закраски: СГЛАЖЕНЫЙ
glEnable (GL_DEPTH_TEST); // Включаем тест глубины
// ВКЛ. АВТОМАТИЧЕСКИЙ ПЕРЕСЧЕТ НОРМАЛЕЙ
glEnable (GL_AUTO_NORMAL);
glEnable (GL_NORMALIZE);
}
void reshape(int width,int height)
{
glViewport(0,0,width,height); // Устанавливаем размер порта просмотра
glMatrixMode( GL_PROJECTION ); // Переключаемся на матрицу проэкции
glLoadIdentity(); // Сбрасываем матрицу проэкции путем установки еденичной матрицы
gluPerspective (50.0, (GLfloat)width/(GLfloat)height, 1.0, 100.0); // настраиваем нашу камеру
glMatrixMode( GL_MODELVIEW ); // Переключаемся на матрицу модели-вида
glLoadIdentity(); // Сбрасываем матрицу модели-вида путем установки еденичной матрицы
}
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Очищаем буфера
glLoadIdentity(); // Грузим нулевую матрицу
glPushMatrix();
glTranslatef(0, -2, -15);
glBegin(GL_QUADS);
// Здесь рисуем доску и клетки!
glEnd();
glPopMatrix();
glFlush(); // Досрочное завершение рисования (ф-я необязательна)
}
LRESULT CALLBACK WindowFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
RECT Screen;
GLuint PixelFormat;
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), //Размер структуры
1, // Номер версии
PFD_DRAW_TO_WINDOW | // Рисовать будем в окно
PFD_SUPPORT_OPENGL | // Установим поддержку OpenGL
PFD_DOUBLEBUFFER, // Выберем двойной буфер
PFD_TYPE_RGBA, // Режим цветности - RGBA
32, // Выберем 32 битную глубину цвета
0, 0, 0, 0, 0, 0, // Игнорирование цветовых битов
0, // Нет буфера прозрачности
0, // Игнорируем сдвиговый бит
0,//---------------------// Нет буфера аккумуляции
1, 1, 1, 1, // Биты аккумуляции игнорируются
32, // 32 битный Z-буфер (буфер глубины)
0, // Нет буфера траффарета
0, // Нет вспомогательных буферов
PFD_MAIN_PLANE, // Рисовать в главный слой рисования
0, // Резерв
0, 0, 0 // Маски слоя игнорируются
};
switch(message)
{
// сообщение WM_CREATE приходит
// один раз при создании окна
case WM_CREATE:
hDC = GetDC(hWnd); // Получить контекст устройства для окна
PixelFormat = ChoosePixelFormat(hDC, &pfd);// Найти ближайшее совпадение для нашего формата пикселов
if (!PixelFormat) // Если неудалось то...
{
// Выводим сообщение об ошибке
MessageBox (0, "Не удается найти подходящий PixelFormat!",
"Error", MB_OK | MB_ICONERROR);
SendMessage(hWnd, WM_DESTROY, wParam, lParam);// Это сообщение говорит, что программа должна завершится
break; //Предотвращение повтора кода
}
SetPixelFormat (hDC, PixelFormat, &pfd); // Теперь нкжно установить наш формата пикселов
if (!SetPixelFormat (hDC, PixelFormat, &pfd)) // Если неудалось то...
{
// Выводим сообщение об ошибке
MessageBox (0, "Не удается установить PixelFormat!",
"Ошибка!!!", MB_OK | MB_ICONERROR);
// Уничтожаем окно!
SendMessage(hWnd, WM_DESTROY, wParam, lParam);
break;
}
hGLRC = wglCreateContext (hDC); //Захватывает Контекст Рендеринга и сохраняет его в переменной hGLRC
if (!hGLRC) // Захватить не удалось...
{
// Выводим сообщение об ошибке
MessageBox (0, "Не удается создать контекст рендеринга OpenGL!",
"Ошибка!!!", MB_OK | MB_ICONERROR);
// Уничтожаем окно!
SendMessage(hWnd, WM_DESTROY, wParam, lParam);
break;
}
wglMakeCurrent(hDC, hGLRC); // делаем его текущим
if (!wglMakeCurrent(hDC, hGLRC))
{
MessageBox (0, "Не удается активировать контекст рендеринга GLRC!",
"Ошибка!!!", MB_OK | MB_ICONERROR);
// Уничтожаем окно!
SendMessage(hWnd, WM_DESTROY, wParam, lParam);
break;
}
// Все... окошко создано...
InitGL (); // Инициализируем наш GL
break;
// это сообщение приходит при уничтожении окна
case WM_DESTROY: //Уничтожает окно
case WM_CLOSE: //-|-|-|-|-|-|-
ChangeDisplaySettings (NULL, 0);//Восстанавливает первоначальное разрешение
if(hDC) wglMakeCurrent(hDC, NULL); // Освобождаем контекст рендеринга...
if(hGLRC) wglDeleteContext(hGLRC); // ...и удаляем его
if(hWnd) ReleaseDC(hWnd, hDC); // Рвем с ним всякие связи.
PostQuitMessage(0); // Убиваем окно!
break;
case WM_SIZE:
GetClientRect (hWnd, &Screen);//Создает область рисования и возвращает высоту и ширину окна
reshape(Screen.right, Screen.bottom );
break;
case WM_SYSKEYDOWN:
case WM_KEYDOWN: //Если клавиша нажата то...
keys[wParam] = TRUE; //В масив keys[key number] заносится TRUE
break;
case WM_SYSKEYUP:
case WM_KEYUP: //Если клавиша отпущена то...
keys[wParam] = FALSE; //В масив keys[key number] заносится FALSE
break;
default: // Реакция на все осталные сообщения ОС...
return DefWindowProc(hWnd,message,wParam,lParam); // ...по умолчанию
}
// если гдето чтото не так...
return 0; // ...возвращаем ошибку
}
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInst,
LPSTR str,int nWinMode)
{
MSG msg;//Структура сообщения Windows
WNDCLASS wc; //Структура класса Windows для установки типа окна
HWND hWnd;//Сохранение дескриптора окна
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Стиль нашего окна
wc.lpfnWndProc = WindowFunc; // Определяем ф-цию ответственную за обработку сообщений ОС
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL; // иконка нашего окошка (по умолчанию)
wc.hCursor = LoadCursor (NULL, IDC_ARROW); // Курсор который будет отображаться при наведении на наше окошко (стрелка)
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = "OpenGLWinClass"; // Определяем название класса окна
if (!RegisterClass(&wc)) // Если класс зарегистрировать не удалось...
{
MessageBox(0, "Ошибка при регистрации класса окна!","Ошибка!!!", MB_OK | MB_ICONERROR);
return FALSE;
}
if(isFullscr) // Если режим полноэкранный - создаем окно с соответствующими параметрами
{
// создаем окно
hWnd = CreateWindow(
"OpenGLWinClass", // название класса окна
"УРОК 01 >OpenGL is COOL", // Заголовок окна
WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, // Стиль (вид) окна
0, 0,
resW, resH, // Размеры окна
NULL, NULL, hInstance, NULL);
}
else // Иначе утанавливаем наше окошко, его вид и свойства
{
// создаем окно
hWnd = CreateWindow(
"OpenGLWinClass", // название класса окна
"УРОК 01 >OpenGL is COOL", // Заголовок окна
WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE | WS_SIZEBOX, // Стиль (вид) окна
0, 0,
resW, resH, // Размеры окна
NULL, NULL, hInstance, NULL);
}
if (!hWnd) // если создать окно не удалось
{
MessageBox(0, "Ошибка при создании окна!","Ошибка!!!",
MB_OK | MB_ICONERROR);
return FALSE;
}
if(isFullscr)
{
DEVMODE dmScreenSettings; // Режим работы устройства (видяхи)
memset (&dmScreenSettings, 0, sizeof(DEVMODE));// Очистка для хранения установок
dmScreenSettings.dmSize = sizeof(DEVMODE); // Размер структуры Devmode
dmScreenSettings.dmPelsWidth = resW; // Ширина экрана
dmScreenSettings.dmPelsHeight = resH; // Высота экрана
dmScreenSettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;// Режим Пиксела
ChangeDisplaySettings (&dmScreenSettings, CDS_FULLSCREEN);// Переключение в полный экран
}
//else ChangeDisplaySettings (&dmScreenSettings, CDS_GLOBAL);
ShowWindow(hWnd,nWinMode); // Показать окно
UpdateWindow(hWnd); // Обновить окно
SetFocus(hWnd); // Сделать окно активным
while (1)
{
// Обработка всех сообщений
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
else return TRUE;
}
display(); // Нарисовать сцену
SwapBuffers(hDC); // Переключить буфер экрана
if (keys[VK_ESCAPE]) SendMessage(hWnd, WM_CLOSE, 0, 0);// Если ESC - выйти
}
}
Признаюсь, движок писал не полностю, нашёл программу, выводящую 3D шар, удалил освещение, сам шар, добавил glPushMatrix();
glTranslatef(0, -2, -15);
glBegin(GL_QUADS);
// Здесь рисуем доску и клетки!
glEnd();
glPopMatrix();
Пока всё!
[Ответ]