|
Здравствуйте Гость ( Вход | Регистрация ) Доступ из РоссииДля сохранения достпа из России к сайту и форуму GBX
|
||||||||||
| quasist |
Воскресенье, 05 октября 2008, 13:24
Отправлено
#1
|
|
Sing along at the Opera ![]() Группа: Профи Сообщений: 3 391 Регистрация: 06 янв. 2006 Пользователь №: 14 791 ![]() ![]() |
Эта тема для интересующихся разработкой будущих проектов для Wiz-а.
На примере проекта gp2x/win32 будет расмотрены пара особеннойстей написания приложений. 1. На gp2x/wiz у джойстика нет понятия "осей", как на компьютерных геймпадах. Крестовина (стик на gp2x f100) преставлена в виде 8 кнопок направления и 9-й кнопки - нажатия на сам стик. Но, геймпады подключаемые через кредл читаются аналогично как и на компе (2 оси как минимум + кнопки и.т.д.). Это первое маленькое неудобство, которое возникнет при написании приложения одновременно и для Windows и для Gp2x/Wiz. Для игровых проектов лучший вариант - завести структуру данных, описывающих состояние "виртуального" геймпада. Лично я предпочитаю для каждой кнопоки(но не для самой крестовины) завести по байту: 0- кнопка не нажата, 1- кнопка только что нажалась, 2- кнопка нажата, и была нажата в прошлом кадре. И игровые события (например перемещение в меню) "вешать" на 1. В случае повторяющего действия (непрерывный огонь) то на отличные от нуля значения. Для осей крестовины как вариант можно использовать два числа (int) со знаком. Особенно этот вариант хорош, если вы собираетесь сделать подобие аналогового стика (скажем через тачскрин) для передвижения персонажа. Мой вариант был - два числа (по байту со знаком). Центральному положению соответствует -1 (минус один). Значения 0-7 для направлений. Текущее направление стика держится в первом байте. А во второй байт "пишется" новое значение направления, если текущее направление отличается от предыдущего, иначе -1. (очень полезно для игровых менюшек) Историческая справка: На "перемоденных под ди-пад" Gp2x нужно было учитывать, что диагональные кнопки переставали нажиматься, а диагонали подразумеваются нажатыми, когда нажаты одновременно две ближлежащие кнопки (например вверх и влево). 2. На Gp2x и Wiz будет ARM процессор Что он "не очень любит" - это операции деления и числа с плавающей точкой. Советы: деления на степень двойки (2, ..., 64..., 1024...) стоит заменить на операцию битового сдвига. Причём делать это в отдельную строчку (совет из жизни), компилятор иногда любит проскакать мимо скобок Поэтому размеры тайлов и спрайтов в игре желательно делать по ширине-высоте кратным степени двойки. Замена чисел с плавающими точками (fixed point engine в двух словах, пригодится в OpenGL ES): Предположим у нас два 32битных числа со знаком (signed long int) первые 16 бит будут у нас целая часть(со знаком), а оставшиеся 16 бит - дробная. То есть 1.0 будет 65536 2.0 это 2 *65536 0.5 это 32768 и.т.д. Целая часть у нас будет примерно от -32 тысяч до +32 тысяч (хвостики не учтены). Для операций с ними заведём пару макросов в коде CODE #define FPMUL(x,y) ((((x)>>6)*((y)>>6))>>4) #define FPDIV(x,y) ((((x)<<6)/((y)>>6))>>4) Вот пример умножения 2.0 на 2.0 -----> FPMUL(2*65536,2*65536) Если вы уже догадались x*65536 равносильно x<<16 Я повторюсь - это не требование к написанию приложений для Gp2x (Wiz), а рекомендации для повышения производительности. Gp2x(Wiz) в любом случае будет для вас всё делить и работать с нецелыми (float) числами Ниже представлен в ознакомительных целях main.c из стандартного шаблона проекта Gp2x-шной SDKшки. (поскольку официально пока SDK от Wiz-а не вышел) CODE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <SDL.h> /* GP2X button mapping */ enum MAP_KEY { VK_UP , // 0 VK_UP_LEFT , // 1 VK_LEFT , // 2 VK_DOWN_LEFT , // 3 VK_DOWN , // 4 VK_DOWN_RIGHT , // 5 VK_RIGHT , // 6 VK_UP_RIGHT , // 7 VK_START , // 8 VK_SELECT , // 9 VK_FL , // 10 VK_FR , // 11 VK_FA , // 12 VK_FB , // 13 VK_FX , // 14 VK_FY , // 15 VK_VOL_UP , // 16 VK_VOL_DOWN , // 17 VK_TAT // 18 }; /* The screen surface, joystick device */ SDL_Surface *screen = NULL; SDL_Joystick *joy = NULL; void Terminate(void) { SDL_Quit(); #ifdef GP2X chdir("/usr/gp2x"); execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL); #endif } int main (int argc, char *argv[]) { int done; /* Initialize SDL */ if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) { fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ()); exit (1); } atexit (Terminate); SDL_ShowCursor(SDL_DISABLE); /* Set 320x240 16-bits video mode */ screen = SDL_SetVideoMode (320, 240, 16, SDL_SWSURFACE); if (screen == NULL) { fprintf (stderr, "Couldn't set 320x240x16 video mode: %s\n", SDL_GetError ()); exit (2); } /* Check and open joystick device */ if (SDL_NumJoysticks() > 0) { joy = SDL_JoystickOpen(0); if(!joy) { fprintf (stderr, "Couldn't open joystick 0: %s\n", SDL_GetError ()); } } #ifdef GP2X /* Only use GP2X code here */ #endif #ifdef WIN32 /* Only use Windows code here */ #endif done = 0; while (!done) { SDL_Event event; /* Check for events */ while (SDL_PollEvent (&event)) { switch (event.type) { case SDL_KEYDOWN: /* if press Ctrl + C, terminate program */ if ( (event.key.keysym.sym == SDLK_c) && (event.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) ) done = 1; break; case SDL_KEYUP: break; case SDL_JOYBUTTONDOWN: /* if press Start button, terminate program */ if ( event.jbutton.button == VK_START ) done = 1; break; case SDL_JOYBUTTONUP: break; case SDL_QUIT: done = 1; break; default: break; } } /* Processing */ } return 0; } -------------------- 12 удачных сделок в барахолке gbx.ru
|
Posts in this topic
quasist Шаблон проекта для Gp2x + пара советов Воскресенье, 05 октября 2008, 13:24
rbm13s Спасибо, ценный док для новичка. Сделать что-нибуд... Понедельник, 06 октября 2008, 09:17
Hahahoj Спасибо, жаль инфа очень сильно привязана к GP2X. ... Понедельник, 06 октября 2008, 09:31
quasist К GP2X сдесь привязан только код main.c
Я просто р... Понедельник, 06 октября 2008, 11:00![]() ![]() |
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
| Упрощённая версия | Сейчас: Сб., 24 окт. 2026, 02:08 |

Воскресенье, 05 октября 2008, 13:24










