Forums Logo

Здравствуйте Гость ( Вход | Регистрация )

 
Reply to this topicStart new topicStart Poll

Каскадный · [ Стандартный ] · Линейный

> Шаблон проекта для Gp2x + пара советов, для интересующихся

quasist
post Воскресенье, 05 октября 2008, 13:24
Отправлено #1


Sing along at the Opera
Group Icon

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

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


Ниже представлен в ознакомительных целях 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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
rbm13s
post Понедельник, 06 октября 2008, 09:17
Отправлено #2


Ветеран
******

Группа: Пользователи
Сообщений: 1 195
Регистрация: 28 фев. 2008
Из: Königsberg ака Калининград
Пользователь №: 25 820





Спасибо, ценный док для новичка. Сделать что-нибудь на GP2X у меня не получилось, может хоть для Виза напишу какую-нибудь ерунду.


--------------------
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Hahahoj
post Понедельник, 06 октября 2008, 09:31
Отправлено #3


Зомби
*******

Группа: Пользователи
Сообщений: 10 730
Регистрация: 17 дек. 2004
Пользователь №: 12 002





Спасибо, жаль инфа очень сильно привязана к GP2X. Посмотрим как будет с Wiz-ом.


--------------------
«Не стоит сердиться на плохих людей. Знаешь, для чего их создал Бог? Чтоб мы смотрели на них и старались быть совсем другими».
» Моя прелесть «

user posted image
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
quasist
post Понедельник, 06 октября 2008, 11:00
Отправлено #4


Sing along at the Opera
Group Icon

Группа: Профи
Сообщений: 3 391
Регистрация: 06 янв. 2006
Пользователь №: 14 791





К GP2X сдесь привязан только код main.c
Я просто рассмотрел пару подводных камней. Надеюсь с возраждением GP2X.RU появится место для подробных туториалов.


--------------------
12 удачных сделок в барахолке gbx.ru
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (2 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
 

Упрощённая версия Сейчас: Сб., 20 апр. 2024, 06:06
Skin Designed (c) by Rooq.net, All Rights Reserved.