PDA

Ver la versión completa : guiChan2X - Biblioteca GUI



Theck
08/04/2009, 16:30
Algunos sabrán de este proyecto que tenía entre manos desde hace tiempo y que en estas últimas semanas he retomado.

Para los que no, comentar que guiChan (http://guichan.sourceforge.net/wiki/index.php/Main_Page) es una biblioteca escrita en C++ que permite implementar una GUI (Graphic User Interface) a nuestros proyectos.

De hecho esto empezó por un proyecto de juego que teníamos en mente un colega (nokto) y yo y que por raro que parezca (alerta de ironía), ha quedado parado (nunca diremos muerto mientras haya testigos xD).

La cosa es que tener algo que te solucione todo lo que es la interfaz de usuario (botones, pestañas, barras de desplazamiento) se agradece, y si encima está pensada para meterla en un juego (porque Visual Basic hace lo mismo, pero no sirve para hacer juegos ;)), pues mejor.
Si encima es BSD y puedes trastear con ella sin miedo, aun más chachi.

La cosa es que guiChan tiene un problema y es que está pensada para PC y solo lee teclado y ratón mientras que de cara a leer los controles de una GP2X, esta se comporta como un joystick.

Así que me dio por mirar si era muy complejo meterle el joystick como un "teclado" al invento y bueno, después de un tiempo, tengo una primera versión que "va".


Y digo "va" porque aunque funciona perfectamente, solo lo hace para mi flamante mando de PSX conectado al PC con un adaptador USB.
Esto tiene una explicación sencilla, mientras que todos los teclados del mundo devuelven el mismo código para el Enter, un mando no tiene de eso, solo tiene botones con unos bonitos índices. Además tienes las direcciones que esas si parecen estándar, menos en la 2X que son botones aparte :P.

Ahora tengo hecho un apaño para saber que índice es cada botón e incluso remapeo los botones de la GP2X para que la gui ni se entere de que no es un joystick normal.

Esta versión BETA os la dejo para que la veáis y para que haya algo ya tangible que toquetear aunque ya os aviso que no está mapeado para la 2X.
Eso si, para hacerlo es tan "sencilo" como ir a joyButton.hpp y cambiar el enum con los índices que además encontraréis en un TXT que se llama mapeado.txt.


Mi idea a partir de ahora es 1. probar que funciona correctamente y 2. mirar de hacer algo para que el tema del joystick sea más genérico y se pueda adaptar con facilidad a cualquier proyecto sin tener que ir marraneando el "core" de la gui.

Para ello intuyo que tendré que poner algunas cosas fijas, como que todo mando tendrá un "boton A" que será para accionar (enter) y un "botón start" equivalente al "Escape" de un teclado. También tendremos un equivalente al "Tab adelante" y al "Tab atrás" que tengo en "R" y "L" ahora mismo.

Ya os iré contando.


Por cierto, si alguien la compila para 2X y mira si la gui pilla la táctil como un ratón y responde a los clics me hace un favor que no se donde tengo mi F200 xD


Sin más, os dejo un enlace a megaupload de la biblioteca, acompañada de un bonito programa con todos los "widgets" funcionando. Se sale con Esc. en PC o dando al botón
http://i8.photobucket.com/albums/a16/theck/gp2x/guichan2x.jpg (http://www.megaupload.com/?d=HXLVKPUW)
guiChan 2X (http://www.megaupload.com/?d=HXLVKPUW)

hardyx
08/04/2009, 17:44
La Guichan es una librería que está muy bien para hacer aplicaciones. Yo probé a compilarla para la GP2X y se muestra bien todo, pero no responde a botones, ni táctil ni nada. Habría que adaptar donde coge los eventos del teclado y el ratón con los códigos correctos. Puedes poner en el código #ifdef WIN32 y #ifdef GP2X para que no haya que mapear los controles.

Theck
08/04/2009, 18:03
No los detecta porque la GP2X es un joystick para SDL que es uno de los input que usa guichan.

GuiChan2X es precisamente guiChan modificada para que lea los eventos de joystick (de ahí que sirva también para PC y PSP por ejemplo) de modo que responda.

Todo lo que es moverse como con el TAB, apretar botones (acciones en general) y cursores (moverse por el desplegable, por ejemplo) ya funciona correctamente en mi PC con el mando USB.

Con el IfDef tuve un problema y es que si lo hacía de la siguiente manera me detectaba los 2 y se hacía la picha un lío porque para él el primer JoyButton::BUTTON_A y el segundo no eran el mismo :S


/**
* An enum with joy values.
*/
enum
{
#ifdef GP2X
BUTTON_UP = 0,
BUTTON_DOWN = 4,
BUTTON_LEFT = 2,
BUTTON_RIGHT = 6,
BUTTON_UPLEFT = 1,
BUTTON_UPRIGHT = 7,
BUTTON_DOWNLEFT = 3,
BUTTON_DOWNRIGHT = 5,
BUTTON_CLICK = 18,
BUTTON_A = 12,
BUTTON_B = 13,
BUTTON_X = 14,
BUTTON_Y = 15,
BUTTON_L = 10,
BUTTON_R = 11,
BUTTON_START = 8,
BUTTON_SELECT = 9,
BUTTON_VOLUP = 16,
BUTTON_VOLDOWN = 17
#else
BUTTON_UP = 90,
BUTTON_DOWN = 91,
BUTTON_LEFT = 92,
BUTTON_RIGHT = 93,
BUTTON_UPLEFT = 94,
BUTTON_UPRIGHT = 95,
BUTTON_DOWNLEFT = 96,
BUTTON_DOWNRIGHT = 97,
BUTTON_CLICK = 18,
BUTTON_A = 1,
BUTTON_B = 0,
BUTTON_X = 3,
BUTTON_Y = 2,
BUTTON_L = 4,
BUTTON_R = 5,
BUTTON_START = 10,
BUTTON_SELECT = 9,
BUTTON_VOLUP = 8,
BUTTON_VOLDOWN = 7
#endif
};
¿Quizá debería meter dentro del ifDef el inicio y final del enum o algo? xD

De todas formas quiero cambiar eso porque como he dicho me gustaría que cambiar de GP2X a PSP o a PC no sea modificar el core de la Gui porque si no si alguien quiere linkarla dinámicamente imagino que tendría que usar varias versiones distintas con el enum cambiado y es un palo.


Mmm, pensaba que ya detectaba de por si la táctil como un ratón, si no es así, ya se cual será el siguiente paso :D
[/code]

hardyx
08/04/2009, 18:10
Lo del ifdef te tiene que funcionar bien, eso lo preprocesa antes de compilar. O te coge un código o te coge otro, prueba crear un enum en cada ifdef por si acaso. Sobre las distintas versiones ten en cuenta que una será para Intel otra para ARM, por fuerza tienes que compilarlas. No vas a usar la librería de windows en la consola, además el fichero de cabecera con el ifdef te cogerá el deseado siempre.
P.D. No me acuerdo si la probé con el firm 4.1.1 y por eso no iba la táctil, luego lo miro.

Theck
08/04/2009, 18:26
No, el problema fuera de la GP2X es que cada mando puede tener como botón A uno distinto. O sea, imagina un mando de PSX donde el botón Redonda es el que yo defino como A (que es como está ahora) y que para él es el 1. Ahora pongo mi logitech y sorpresa, quizá el equivalente por posición es el índice 3.

Por eso estaba pensando que hubiera una forma de decirle al core los índices sin tener que tocar la propia librería, algo en el input o yo que se, por ver me queda :P


A ver que me dices y me das la alegría que ya pilla la táctil sola como mouse xD

NINJA EDIT
Importante, antes de compilar cambia el Enum por el de GP2X que ahora mismo dejé solo 1 enum con el de mi mando :V

juanvvc
08/04/2009, 20:10
Por eso estaba pensando que hubiera una forma de decirle al core los índices sin tener que tocar la propia librería, algo en el input o yo que se, por ver me queda :P

Eso en teoría lo arregla el firmware Open2x transparentemente, sin que te enteres: incluye una configuración personalizada por el usuario de forma que el kernel mapea los botones de los mandos externos a los botones de la consola. De pronto ¡Todos los programas de Gp2x soportan mandos externos configurables! :) Si lo quieres arreglar tú en el firmware oficial, que no incluye esta opción, tendrás que permitir configuración externa de los botones. Como puedes ver por PocketSnes, Cps2emu y tantos otros que no lo implementan, no es algo trivial de un par de líneas :)

hardyx
08/04/2009, 22:04
He vuelto a probar mi versión con el firmware 4.0 y no coge la táctil. He probado conectando un ratón a la cradle y tampoco va, pero tampoco se enciende el usb. No sé si se me ha estropeado la cradle. Luego puedo probar tu versión en la F200 si me la mandas compilada.

Theck
09/04/2009, 15:36
Ale, versión con solo el GPE y las imágenes que carga para el botón y las pestañas marchando:
http://www.megaupload.com/?d=BS27ZNV8

A ver si te funciona, para moverte entre los controles debes usar L y R (como si fuera el tabulador, vamos) y para "accionar" (enter) usa el botón A. Ojo que el botón "salir" funciona (o debería).

Y de paso a ver lo de la táctil, diciéndome lo que dices, que no te va ni con un ratón enchufado en la cradle me has dejao pillao. A ver si se pasa otro y lo comprueba para estar seguros.

De todas formas ya te digo que yo no he hecho nada con el ratón, vamos que si lo pilla es porque las SDL ya interpretan de por si la táctil como un ratón, cosa que no se si hacen, diría que no. Puck sabrá, ¿no?, el Fenix usa o usaba SDL y pilla la táctil.

hardyx
09/04/2009, 20:34
Lo de coger la táctil como un ratón si mal no recuerdo era con las SDL de paeryn, no con las oficiales de GPH. Siento no poder probarlo ahora ya que estoy de viaje, pero el sabado lo pruebo y te cuento. Lo del ratón, creo que no me va la cradle, porque no se encienden las luces verdes.

Puck2099
09/04/2009, 20:49
De todas formas ya te digo que yo no he hecho nada con el ratón, vamos que si lo pilla es porque las SDL ya interpretan de por si la táctil como un ratón, cosa que no se si hacen, diría que no. Puck sabrá, ¿no?, el Fenix usa o usaba SDL y pilla la táctil.

Mmm, en los primeros firmwares había que hacerlo a mano (yo implementé por debajo de las funciones de Fenix el control de la táctil), pero no sé si en los últimos ya era automático como en las de Paeryn...

Lo que sí os puedo asegurar es que en la Wiz se pilla como un ratón directamente.

Saludos

Theck
09/04/2009, 23:53
Lo acabo de probar y se queda la pantalla en negro :V

Cuando vuelva ya miraré que xD

hardyx
11/04/2009, 14:34
Lo he probado y me dice por el puerto serie que falta el fichero fixedfont.bmp. "Unable to load image file: images/fixedfont.bmp". Le he puesto ese fichero de guichan y dice que la fuente está corrupta.

Te paso mi versión compilada para GP2X, se ve todo bien y colocado, pero no responde a la táctil ni a la teclas, ya que no he cambiado las teclas. Te puedo pasar el código fuente si quieres.

Theck
28/04/2009, 15:13
Hola, primero perdón por tardar en contestar pero taba de vacaciones.

Si, faltaba el directorio images, lo tenías en el primer rar que subí. Yo lo he probado en mi F200 (que no veas lo bien que ha ido estas vacaciones con 18h de avión, amo el tilematch xD) y responde a las teclas y al ratón casi.

Digo casi porque aunque mueve el cursor no hace clic. Como dice puck en el firm que tengo que es el siguiente del 4.0 si no recuerdo mal, lo pilla directamente con el ratón, a excepción del clic. He mirado en el sdlinput.cpp de la gui y parece que no salta el "SDL_MOUSEBUTTONDOWN" mirando el event.type. ¿Sabéis porque puede ser?

De todas formas, ahora que lo he visto funcionando en la 2X con teclas ya me he emocionado un rato largo ya que al menos sin la táctil ya se puede trabajar con ella si alguien quiere ^^.

hardyx
04/05/2009, 22:43
Disculpa por no haber podido probarlo antes. He probado tu versión y ¡¡¡ funciona la táctil !!! Bueno, algunos controles si o otros no muy bien. Te comento cada control.

- Formulario: el ratón se mueve bien junto con la táctil.
- Cuadro verde: salen números al pulsar, coordenadas?
- Radio button: se seleccionan pero no cambia la marca.
- Scroll bar: funciona tanto el arrastre como el click.
- Tabs: se seleccionan pero no cambian.
- Checkbox: se selecciona pero no se marca.
- Combobox: se seleciona pero no se despliega.
- Imagen scroll: funciona tanto las flechas como el scroll.
- List box: no se seleccionan ni se marcan las opciones
- Botón: se marca, pero no sale (estará desactivado?)

Espero que te sirva de ayuda y ánimo. La de aplicaciones gráficas que se pueden hacer con esta librería...
Eres un artista!! :brindis:

fmayosi
04/05/2009, 23:33
Que crack!!!!!

A ver si tengo tiempo y la miro, porque tiene muy buena pinta la librería.

Muchas gracias Theck.

Un saludo.

Theck
05/05/2009, 14:50
Si, te pasa como a mi. "Marca" pero no hace nada.

Por lo que he ido viendo, como puse en el anterior post, el firmware hace creer a SDL que la táctil es un ratón, es por eso que sin yo haber tocado nada, funciona.

Pero hay una excepción, el clic o tipo de evento "SDL_MOUSEBUTTONDOWN" no salta. No se si está hecho a propósito, tengo que mirar otro evento o tengo que currarme que pille el clic con cada movimiento (ya que siempre que detecte por huevos hemos hecho click).

Tengo que mirarlo, si no es que alguien sabe porque SDL no pilla el "click" de la táctil porque GPH lo quiso así o porque me falta hacer algo.

Theck
21/05/2009, 14:37
Subo una nueva versión que si alguien la puede arrancar me hace un favor.

guichan2X con Testeo de eventos (http://www.megaupload.com/?d=F9TFJY8P)

Básicamente es lo mismo con un printf para ver que eventos está pillando. Si alguien puede probarlo en la F200 y hacer clic en la pantalla varias veces antes de salir y ponerme aquí el contenido del fichero stdout.txt que se debería crear en el directorio de la aplicación me hace un favor, que no tengo la 2X a mano.

Bizkaitarra
21/05/2009, 14:40
Te ayudaría, pero solo tengo la Wiz y en casa :(

hardyx
21/05/2009, 14:45
A ver si lo puedo probar esta tarde en la F200, que me interesa el tema.

Theck
21/05/2009, 14:52
Chemaris va a probarlo ahora en su WIZ a ver si va directamente. En un principio esto solo tira de SDL y está enlazado dinámicamente a ella por lo que hay posibilidades de que funcione sin tocar. Si no, pues será cosa de llevarlo a la WIZ también ^^

Bizkaitarra
21/05/2009, 14:55
Por lo que he visto con esto me sería más sencillo cuando termine examenes hacer el juego que quiero hacer ;)
Quiero hacer el típico juego de trivial con distintas versiónes (contra tiempo, vidas con respuestas falladas, multiples respuestas, calculo de nota para examenes, etc.).
Y lo que más miedo me da es el aspecto gráfico y control de eventos y así...

Theck
21/05/2009, 15:08
Por el aspecto gráfico no te preocupes, puedes hacer una clase nueva que herede de alguna existente y reescribir el método "draw" para que tenga el aspecto que tu quieras.

Por ejemplo los containers por defecto son rectángulos de un color plano. Para un proyecto estuve mirando y en nada tenía una ventana rollo RPG de toda la vida:
http://i8.photobucket.com/albums/a16/theck/gp2x/muestraBorde.jpg


De esta forma si quisieras unos botones rollo 50x15 no te sería muy complejo hacértelo.

< - >
EDIT: Chemaris me acaba de dar una alegría, en la WIZ funciona perfecta sin el problema que me da a mi en la F200 con el click de la táctil, es completamente funcional por lo que parece ^^

Muchas gracias campeón ^^

chemaris
21/05/2009, 15:14
EDIT: Chemaris me acaba de dar una alegría, en la WIZ funciona perfecta sin el problema que me da a mi en la F200 con el click de la táctil, es completamente funcional por lo que parece ^^

Muchas gracias campeón ^^

doy fé :brindis:

Bizkaitarra
21/05/2009, 15:15
Por lo que entiendo con esto he integrandolo a un entorno de desarrollo como eclipse que funcione para C++ podría usar dichar clases para dibujar por ejemplo un gráfico como el siguiente:


-------------------------------------------------------------------
+ +
+ ¿Quién es el hijo de tu madre +
+ que no es tu hermano? +
+ +
--------------------------------------------------------------------
+ + +
+ A) Yo + B)Tu abuela +
+ + +
+___________________+____________________+
+ + +
+ C)Tu tio + D)Tu padre +
+ + +
+___________________+____________________+Me gustaría saber si eso puedo hacerlo facilmente teniendo en cuenta que si las preguntas son muy largas tengo que hacer más pequeña la letra. ¿Se pondría solo en dos líneas si no cabe en el cuadro?

Theck
21/05/2009, 15:44
Los label tienes un método adjustSize que lo hace más ancho para adaptarse al texto pero no son multilínea, o al menos, no he visto ninguna propiedad ni nada que me lo indique.

Ahora te estoy mirando si los textarea si que hacen el salto de línea cuando el texto es largo. Aunque originalmente estén pensados para que el usuario escriba texto tienes la ventaja que aquí no hay teclado por lo que no podrían escribir.

Lo de la letra pequeña es complejo, yo estoy usando letras bitmap no TTF y no estoy muy seguro que trabaje con ellas ahora mismo (con las TTF).


De cara a integrarlo, es una librería pensada para mezclarse con el resto del código.

Mi main tiene el siguiente aspecto:

int main(int argc, char **argv)
{
try
{
init();
run();
halt();
}
catch (gcn::Exception e)
{
std::cerr << e.getMessage() << std::endl;
}
catch (std::exception e)
{
std::cerr << "Std exception: " << e.what() << std::endl;
}
catch (...)
{
std::cerr << "Unknown exception" << std::endl;
}

return 0;
}

Luego, para que veas lo que hacen las 3 funciones te las pongo a continuación. Le he quitado mucho código y he dejado lo mínimo, un contendedor principal con un segundo contenedor dentro con un label dentro.


bool init()
{
//SDL & CO.
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK);
screen = SDL_SetVideoMode(320, 240, 16, SDL_SWSURFACE);
SDL_EnableUNICODE(1);
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
SDL_Joystick* joystick = SDL_JoystickOpen(0);

/* Puesto que guiChan puede trabajar con SDL u otros hemos de decirle cual
ha de usar como cargador de imágenes, como gestor de gráficos y como gestor
de input */
imageLoader = new gcn::SDLImageLoader();
gcn::Image::setImageLoader(imageLoader);
graphics = new gcn::SDLGraphics();
graphics->setTarget(screen);
input = new gcn::SDLInput();

//GUI-CHAN
font = new gcn::ImageFont("images/fixedfont.bmp",
" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789?!");
gcn::Widget::setGlobalFont(font);
gcn::ImageFont* selectedFont = new gcn::ImageFont("images/fixedfont_gray.bmp",
" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX YZ0123456789?!");

// Inicialización de la gui.
gui = new gcn::Gui();
gui->setGraphics(graphics);
gui->setInput(input);

/* Hemos de tener un contenedor principal (top) para la gui, hacemos que
ocupe toda la pantalla de la 2X en este caso */
fondo = new gcn::Container();
fondo->setDimension(gcn::Rectangle(0,0,320,240));
fondo->setBaseColor(gcn::Color(200,0,0));

// Aquí es donde asignamos el top a la gui
gui->setTop(fondo);

// Un contenedor simple
cuadro = new gcn::Container();
cuadro->setDimension(gcn::Rectangle(20,20,50,50));
cuadro->setBaseColor(gcn::Color(0,200,0));

/* Label para los FPS, lo ponemos dentro del cuadro, así si movemos
el cuadro movemos todo su contenido */
label = new gcn::Label();
cuadro->add(label,10,10);
fondo->add(cuadro,10,10);

return true;
}


void run()
{
startclock = SDL_GetTicks();

while (running)
{
while(SDL_PollEvent(&event))
{
/* Aquí es donde realmente le decimos a guiChan que está pasando
al enviarle el event de SDL y él lo distribuye internamente. */
input->pushInput(event);
}

//Aquí gestiona la lógica de lo que ha pasado
gui->logic();
//Aquí es donde él pinta la Gui
gui->draw();
}
}


void halt()
{
delete label;
delete font;
delete fondo;
delete cuadro;
delete gui;

delete input;
delete graphics;
delete imageLoader;

SDL_Quit();
#ifdef GP2X
chdir("/usr/gp2x");
execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif
}

Bizkaitarra
21/05/2009, 16:03
Muchas gracias por la info!! Lo tendré en cuenta entonces, haber si en cuanto termine examenes me pongo con ello y ya os ire preguntando!!

Theck
21/05/2009, 17:41
A ver, el textBox es un poco raro o yo no lo se usar, aunque para lo que quieres "te serviría".
Me explico, usando el método setdimension le podrías dar la forma que quieras pero no reajusta el texto haciendo saltos de línea "falsos" para que quepa si no que se corta y punto.

Digo que te serviría porque podrías mirar cuanto te cabe y poner tu los saltos de línea en el texto y palante.

hardyx
22/05/2009, 20:18
Esto es lo que sale en la F200 cuando se pulsa en la pantalla, salen series de eventos que empiezan en 4 y terminan en 6. Esto con el firmware 4.0.0, digo voy a probar con el 4.1.0 que lo mismo va mejor. Actualizo y con éste no marca ni selecciona nada, ya que cambiaron la forma de acceder a la táctil.

Eventos del firm 4.0.0:
Evento: 4
Evento: 5
Evento: 4
Evento: 4
Evento: 6
Evento: 4
Evento: 5
Evento: 6
Evento: 4
Evento: 5
Evento: 6

Theck
26/05/2009, 16:53
Ya veo, parece que la 4.0 (que debe ser el que tengo yo, ya ni me acuerdo) hace que SDL pille la táctil como un mouse.

¿En el 4.1 has puesto el parche que había?

hardyx
26/05/2009, 18:10
No he usado el parche, se supone que con él funciona igual que en el 4.0. Pero creo que volveré a la 4.0, ya que con la 4.1.0 se ralentiza todo, hasta los vídeos.