Золотые страницы форума GP2X Community
Новостной форум посвященный консолям GP2X
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   СудокуСудоку    Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Программирование под GP2X

 
Начать новую тему   Ответить на тему    Список форумов GP2X Community -> Статьи сайта
Предыдущая тема :: Следующая тема  
Автор Сообщение
quasist

Профи


Пол: Пол:Мужской
Возраст: 37
Зарегистрирован: 28.10.2008
Сообщения: 43

Группы: 
[Модераторы Модераторы ]


СообщениеДобавлено: Вс Ноя 02, 2008 5:49 pm    Заголовок сообщения: Программирование под GP2X Ответить с цитатой

В статье на примере GP2X будут разобраны особености разработки проектов. Пара маленьких тонкостей которые останутся актуальными и на Gp2x Wiz.
Вернуться к началу
Посмотреть профильquasist сейчас оффлайн  Отправить личное сообщение
quasist

Профи


Пол: Пол:Мужской
Возраст: 37
Зарегистрирован: 28.10.2008
Сообщения: 43

Группы: 
[Модераторы Модераторы ]


СообщениеДобавлено: Вс Ноя 02, 2008 5:49 pm    Заголовок сообщения: Ответить с цитатой

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...) стоит заменить на операцию битового сдвига. Причём делать это в отдельную строчку (совет из жизни), компилятор иногда любит проскакать мимо скобок Smile
Поэтому размеры тайлов и спрайтов в игре желательно делать по ширине-высоте кратным степени двойки.

Замена чисел с плавающими точками (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) числами Smile


Ниже представлен в ознакомительных целях 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;
}

Вернуться к началу
Посмотреть профильquasist сейчас оффлайн  Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов GP2X Community -> Статьи сайта Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы




Powered by phpBB © 2001, 2005 phpBB Group

Locations of visitors to this page