Войти
ПрограммированиеСтатьиГрафика

Пара слов о FastGraph.

Автор: Макс Бойков


Итак, что же такое FastGraph? Это набор линкуемых библиотек (DLL'ек для Visual Basic и PowerBASIC), применяемый для программирования графики в Windows на низком уровне.

На момент написания обзора последней версией была 6.02. Работает сея особа под Win9x/2000/ME/NT4.0(+SP3). С ней можно использовать такие компиляторы как Borland C++, Borland C++ Builder, Symantec C++, Visual C++, Watcom C/C++, Delphi, Visual Basic и PowerBASIC.

По заявлению разработчиков, библиотека очень проста в использовании: сначала вы создаете так называемые виртуальные буферы (virtual buffers) - являющиеся прямоугольными поверхностями для рисования, затем, рисуете на них, используя интуитивные функции FastGraph. Например, чтобы нарисовать линию, используйте функцию fg_draw(x,y). В библиотеке насчитывается более 360 функций.

Попытаюсь сравнить FastGraph с таким гигантом как DirectX. На мой взгляд, FastGraph превосходит DirectX по надежности, функциональности и простоте использования. DirectDraw это мощное средство для переноса растровых изображений и управления видеопамятью, однако, одного его не достаточно для быстрого написания графических приложений под Windows. Когда вы создали картинку или анимированный фрейм, DirectDraw безупречно подходит для его вывода на экран, но как вы рисовали эту картинку? Вот, именно для этого и служит FastGraph. Она умеет обращаться с поверхностями для рисования DirectDraw так же хорошо, как и со своими виртуальными буферами.

Direct3D отвечает за аппаратный рендеринг в 3D играх. Это работает эффективно, если пользователь имеет подходящие драйвера для своих видеокарт (по статистике таких примерно половина), а также, если вы хотите рендерить просто треугольники. FastGraph позволяет рендерить как треугольники, так и полигоны, да и вообще рендеринг проходит быстрее, и работает эффективно под любое железо.

FastGraph API на много легче, чем DirectX. Вы можете использовать FastGraph API , в тоже время, имея доступ к DirectX. Это возможно благодаря тому, что функции FastGraph имеют доступ к DirectX на низком уровне. Это большой плюс, так как, я повторюсь, API у FastGraph на много легче чем у DirectX.

Наконец, приложения, написанные на FastGraph стабильно работают на ВСЕХ версиях Windows. DirectX, в частности Direct3D глючит на системах с проблематичными драйверами, неподдерживаемыми версиями видео карт и т.д. Приложения на FastGraph запускаются без проблем.

На мой взгляд, наиболее разумно использовать обе библиотеки. Используя FastGraph, вы можете менять разрешение экрана на ходу, например, если было 1024х768 или 640х480 можно принудительно изменить на 640х480. А если использовать комбинацию FastGraph + DirectX, то можно так же менять color resolution , например, если было high color, то можно изменить на 256 colors.

Это чудо распространяется не бесплатно, и стоит довольно внушительно для среднего программиста. Его продают за 299$. В комплект входят все библиотеки для всех платформ, но нет исходников самой FastGraph. Для их (написанных, кстати, на хорошо форматированном ассемблере) получения, вам нужно связаться с их сервисным центром и получить лицензию, полагаю не бесплатно.

Обновление происходит примерно раз в год. Радует одно: обновить FastGraph можно абсолютно бесплатно.

Итак, резюме следующее: если вам лень учить DirectX API и есть лишние 300 вечнозеленых, то эта библиотека для вас. Больше я не вижу причин для ее приобретения. Хотя сколько людей, столько и мнений. У меня есть знакомые, которые просто без ума от FastGraph, и говорят, что все остальное суксь и отстой. Выбор за вами. Вот пример простенькой игры, написанной с ее помощью.

Итак, попытаемся написать незамысловатую программку. Стандартный каркас приложения под Windows останется без подробных комментариев, а вот процедура окна будет объяснена детально.

#include <fgwin.h>

HDC hDC;
HPALETTE hPal;
int hVB;
UINT cxClient, cyClient;

LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
   PSTR szCmdParam, int iCmdShow)  //  стандартная функция WinMain
{
  static char szAppName[] = "FGfirst";
  HWND hWnd;
  MSG msg;
  
  WNDCLASSEX wndclass;  // создаем класс окна
  wndclass.cbSize = sizeof(wndclass);
  wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  wndclass.lpfnWndProc = WindowProc;
  wndclass.cbClsExtra = 0;
  wndclass.cbWndExtra = 0;
  wndclass.hInstance = hInstance;
  wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
  wndclass.hbrBackground = NULL;
  wndclass.lpszMenuName = NULL;
  wndclass.lpszClassName = szAppName;
  wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
  
  RegisterClassEx(&wndclass); // регистрируем класс
  hWnd = CreateWindow(szAppName,"First Fastgraph for Windows Program",
                      WS_OVERLAPPEDWINDOW, // стиль окна
                      CW_USEDEFAULT, // координата х
                      CW_USEDEFAULT, // координата у
                      CW_USEDEFAULT, // размер окна по х
                      CW_USEDEFAULT, // размер окна по у
                      NULL, // родительский хендл
                      NULL, // хендл меню
                      hInstance, // хендл экземпляра программы
                      NULL); // дополнительные параметры

  ShowWindow(hWnd,iCmdShow); // отображаем окно
  UpdateWindow(hWnd); // перерисовываем окно
  while (GetMessage(&msg,NULL,0,0)) // главный цикл программы
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT iMsg, 
                            WPARAM wParam, LPARAM lParam) // оконная процедура
{
  PAINTSTRUCT ps;
  switch (iMsg)
  {
    case WM_CREATE:
      hDC = GetDC(hWnd);
      fg_setdc(hDC);
      hPal = fg_defpal();
      fg_realize(hPal);
      fg_vbinit();
      hVB = fg_vballoc(640,480);
      fg_vbopen(hVB);
      fg_vbcolors();
      fg_setcolor(19);
      fg_fillpage();
      return 0;
    case WM_PAINT:
      BeginPaint(hWnd,&ps);
      fg_vbscale(0,fg_getmaxx(),0,fg_getmaxy(),0,cxClient-1,0,cyClient-1);
      EndPaint(hWnd,&ps);
      return 0;
    case WM_SETFOCUS:
      fg_realize(hPal);
      InvalidateRect(hWnd,NULL,TRUE);
      return 0;
    case WM_SIZE:
      cxClient = LOWORD(lParam);
      cyClient = HIWORD(lParam);
      return 0;
    case WM_DESTROY:
      fg_vbclose();
      fg_vbfree(hVB);
      fg_vbfin();
      DeleteObject(hPal);
      ReleaseDC(hWnd,hDC);
      PostQuitMessage(0);
      return 0;
  }
  return DefWindowProc(hWnd,iMsg,wParam,lParam);
}

В первой части программы в объяснении нуждается только хедер FGWIN.H. В нем содержаться прототипы функций FastGraph, определения символьных констант, а также вызов WINDOWS.H, если это необходимо. Разберем подробнее оконную процедуру, в частности обработчик сообщений.

WM_CREATE. Windows генерирует это сообщение когда впервые создается окно приложения. Обычно, это сообщение возникает один раз, при запуске приложения. Это можно использовать, для всяческих инициализаций. Сначала мы вызываем стандартную функцию WinAPI - GetDC() для получения контекста устройства. Затем делаем контекст устройства доступным из FastGraph, с помощью fg_setdc():

hDC = GetDC(hWnd);
fg_setdc(hDC);

Далее, создаем и активируем дефолтовую логическую палитру:

hPal = fg_defpal();
fg_realize(hPal);

Инициализируем виртуальный буфер размером (640 х 480), делаем его активным и привязываем палитру к буферу:

fg_vbinit();
hVB = fg_vballoc(640,480);
fg_vbopen(hVB);
fg_vbcolors();

Наконец, заполняем буфер синими пикселями (синему цвету соответствует номер 19 при 256 цветах и дефолтовой палитре)

fg_setcolor(19);
fg_fillpage();

WM_PAINT. Это сообщение генерируется когда необходимо перерисовать клиентскую область окна. Сначала, мы вызывает BeginPaint() - стандартную функцию WinAPI, а затем fg_vbscale() - чтобы спроектировать содержимое нашего виртуального буфера в клиентскую область окна. EndPaint() - функция WinAPI . Это стандартная последовательность для большинства FastGraph-приложений.

WM_SETFOCUS. Генерируется, когда окно получает клавиатурный фокус. Здесь мы начинаем с вызова fg_realize(), что бы активировать дефолтовую палитру. Затем, вызываем стандартную функцию InvalidateRect(), которая генерирует WM_PAINT и окно перерисовывается. Эта последовательность стандартная для большинства FastGraph — приложений.

WM_SIZE. Генерируется при изменении размеров окна, а так же при создании окна. В нашем примере, сохраняются новые координаты ( в пикселях) ширины и высоты в переменных cxClient и cyClient.

WM_DESTROY. Посылается после закрытия окна. Здесь происходит следующее: закрываем виртуальные буферы, очищаем память и закрываем процесс обработки буферов.

fg_vbclose();
fg_vbfree(hVB);
fg_vbfin();

Далее, вызывается 3 стандартные функции, для очистки дефолтовой палитры, созданной с помощью fg_defpal(), освобождения контекста устройства и выхода.

DeleteObject(hPal);
ReleaseDC(hWnd,hDC);
PostQuitMessage(0);

Вот и все, удачи!

28 января 2002