kvv's home

Форма входа

Категории раздела

Лекции [14]
Разное [4]
Статьи на тему WM, не попавшие в лекции по разным причинам.

Поиск

Каталог статей

Главная » Статьи » Программирование под Windows Mobile » Лекции

Часть 7. Чуть-чуть про GAPI
Что такое GAPI

GAPI (Game API)- специальный API , предназначенный для разработки приложений, которым необходим быстрый доступ к экрану , в частности, игр. GAPI позволяет получить полный доступ к видеобуферу и очереди хардверных клавиш.

На сегодняшний день, технология использования GAPI считается устаревшей, в девайсах под WM5 и WM6 используется DirectDraw Mobile и Direct3D Mobile, однако многие производители игр до сих пор используют библиотеки-надстройки над GAPI для построения своих игр. И, поскольку поддержка GAPI в новых версиях OS сохраняется, то изучение функций GAPI не будет являться лишним.

Итак, посмотрим на список функций GAPI:
ФункцияНазначение
GXGetDisplayPropertiesвозвращает структуру, описывающую параметры экрана девайса
GXGetDefaultKeysвозвращает список виртуальных кодов клавиш, используемых в девайсе
GXOpenDisplayоткрывает экран для полного доступа
GXOpenInputвключает режим прямого доступа к сообщениям от клавиш
GXCloseDiaplayзакрывает режим прямого досупа к экрану
GXCloseInputзакрывает режим прямого доступа к сообщениям
GXSuspendостанавливает работу GAPI при потере фокуса
GXResumeпродолжает работу операций GAPI при возврате фокуса
GXBeginDrawподготавливает экран для записи
GXEndDrawвызывается после завершения цикла записи

Общий цикл работы выглядит следующим образом:

Посмотрим на реальном примере, как это делается.

1. Получение свойств экрана и начальная инициализация

 // display properties
 GXDisplayProperties gx_props = {0}; 
 // keycodes list 
 GXKeyList g_KeyList; 
 // ptr to screen buffer 
 byte* g_pScreen = NULL; 
 // handle to main window
 HWND hWnd; 
 //... InitInstance
 if (GXOpenDisplay( hWnd, GX_FULLSCREEN) == 0)return FALSE;
 gx_props = GXGetDisplayProperties();
 GXOpenInput();
 g_KeyList = GXGetDefaultKeys(GX_NORMALKEYS);

gx_props - структура описания свойств экрана. ее состав:
struct GXDisplayProperties {
 DWORD cxWidth; // ширина экрана в пикселях
 DWORD cyHeight; // высота экрана в пикселях
 long cbxPitch; // количество байт для смещения на один пиксел
 long cbyPitch; // количество байт в строке экрана
 long cBPP; // число бит в пикселе
 DWORD ffFormat; // цветовой формат
};
Основные форматы - RGB888 RGB555 и RGB565

Большинство девайсов используют формат RGB565 что дает максимальное количество цветов при 16 битах на пиксель. В дальнейшем будем ориентироваться на него.

2. Деинициализация
Операции деинициализации осуществляются обычно в обработчике события WM_DESTROY:

case WM_DESTROY:
 KillTimer(hWnd,100);
 GXCloseInput();
 GXCloseDisplay();
 PostQuitMessage(0);
 break;

3. Обработка клавиш
При использовании прямого доступа к сообщениям клавиш, виртуальные коды клавиш приходят в сообщении WM_KEYDOWN

 case WM_KEYDOWN:
 {
 short vkKey = (short)wParam;
 if (vkKey == g_KeyList.vkUp) MoveSprite(0,-1); 
 if (vkKey == g_KeyList.vkDown) MoveSprite(0,1); 
 if (vkKey == g_KeyList.vkLeft) MoveSprite(-1,0); 
 if (vkKey == g_KeyList.vkRight) MoveSprite(1,0); 
 if (vkKey == g_KeyList.vkStart) SendMessage (hWnd, WM_CLOSE, 0, 0); 
 break;
 }

4. Фокус
При потере и возврате фокуса необходимо вызвать функции GAPI. Это нужно для снижения энергопотреления во время простоя.

 case WM_KILLFOCUS:
 GXSuspend();
 break;
 case WM_SETFOCUS:
 GXResume();
 break;

5. Рисование
Процедура рисования в самом простом случае заключается в следующем:

  1. Получение адреса буфера экрана
  2. Рассчет адреса точки
  3. Заполнение нужным цветом
  4. Уведомление системы о завершении цикла рисования
Адрес точки экрана вычисляется по формуле: address = pb + (x * cbxPitch) + (y * cbyPitch); , где pb - адрес начала экрана; x,y - координаты точки; cbxPitch, cbyPitch - параметры экрана
Цвет точки определяется по формуле : nColor = (WORD)(((r & 0xf8) << 8) | ((g & 0xfc)<< 3) | (b & 0xf8));
Таким образом, рисование в простейшем случае происходит так:
void PutPixel(int x, int y, int r, int g, int b)
{
 WORD nColor = (WORD)(((r & 0xf8) << 8) | ((g & 0xfc)<< 3) | (b & 0xf8));
 WORD* ptr = (WORD*) (g_pScreen + x * gx_props.cbxPitch + y * gx_props.cbyPitch);
 *ptr = nColor;
}
void DrawFrame()
{
 g_pScreen = (byte*)GXBeginDraw();
 if (NULL == g_pScreen) return;
 int i=1000;
 while (--i)
 {
 int y = (rand()*gx_props.cyHeight)/RAND_MAX;
 int x = (rand()*gx_props.cxWidth)/RAND_MAX;
 PutPixel(x,y,rand()%255,rand()%255,rand()%255);
 }
 GXEndDraw();
}
Функцию DrawFrame можно вызывать по таймеру, в цикле выборки сообщений WinMain или в отдельном потоке.

Естесвенно, такой подход не оптимален и не дает высокий fps. В реальных приложениях используется технология буферизации, когда изображение подгатавливается в экранном буфере, а затем копируется на экран одним memcpy.

Небольшим минусом работы с GAPi является отсутствие поддержки функций GDI, но в интернете существует масса библиотек-надстроек над GAPI, в которых реализованы все необходимые функции рисования.

Категория: Лекции | Добавил: kvv (20.11.2007) | Автор: Владимир Кошелев E W
Просмотров: 5927 | Комментарии: 3 | Теги: Лекции | Рейтинг: 0.0/0
Всего комментариев: 3
0
3 Fromtoridrext   [Материал]
Рекомендовал мне url: http://srub-dizain.ru/price - цены на брус и комплектующие материалы
и я захотел быстренько выстроить себе халабудку на даче! Мне тогда срочно нужен был брус для дачи. В общем после этого я и не смог уйти! Там совсем всё профессионально сделано и сухой брус от производителя не тяжело выбрать. Всему данному событию сопутствовала тяжёлая навигация ресурса, которую не мог не обнаружить.Очень круто конечно то, что это первые руки – но сайтец очень трудно понять.

0
2 quepSmoomma   [Материал]
Совсем беспредел наступил! Вот в поисковике яху случайно зашёл на статью http://rentrealtycrimea.com/dlitelno/page/6/ - сдам квартиру в Симферополе Крым
и обалдел. Вот теперь даже не поздоровался с Вами! В общем сдам квартиры
,я заценил и понял, что настоящая жизнь только начинается – раз имеют место такие апартаменты. Поэтому каждому рекомендую ссылку http://rentrealtycrimea.com с жильем в областном центре Симферополя.

0
1 zbuffer   [Материал]
Замечательная статья. Все коротко и ясно :)

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Облако тэгов