quasist
Профи
Пол: Возраст: 38 Зарегистрирован: 28.10.2008 Сообщения: 43
Группы:
|
|
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 тысяч (хвостики не учтены).
Для операций с ними заведём пару макросов в коде
Код: |
#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-а не вышел)
Код: |
#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;
}
|
|
|