Tengo problemas de funciones no reconocidas

Started by FreeYourMind, July 30, 2009, 06:54:59 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

Quote from: SplinterGU on August 01, 2009, 07:38:43 PM
ponme un ejemplo o pasame el codigo para ver lo del loading...
si, pero deberias cargarlo en una variable... para no llamar 2 veces a la joy_getbutton sobre el mismo boton...



Hola.
El ejemplo lo tienes en esta página 2 o 3 posts más arriba.

Lo de la variable no te entendido muy bien, dices ponerlo como en pac-man:

...

/* Wiz */

        if (joy_number())
            player_key_state[PLAYER_1][KEY_UP]    |= joy_getbutton(0,WIZ_UP);
            player_key_state[PLAYER_1][KEY_DOWN]  |= joy_getbutton(0,WIZ_DOWN);
            player_key_state[PLAYER_1][KEY_LEFT]  |= joy_getbutton(0,WIZ_LEFT);
            player_key_state[PLAYER_1][KEY_RIGHT] |= joy_getbutton(0,WIZ_RIGHT);
            player_key_state[PLAYER_1][KEY_A]     |= joy_getbutton(0,WIZ_A);
            player_key_state[PLAYER_1][KEY_B]     |= joy_getbutton(0,WIZ_B);
            player_key_state[PLAYER_1][KEY_C]     |= joy_getbutton(0,WIZ_X);
            player_key_state[PLAYER_1][KEY_D]     |= joy_getbutton(0,WIZ_Y);
            player_key_state[PLAYER_1][KEY_START] |= joy_getbutton(0,WIZ_SELECT);
            player_key_state[PLAYER_1][KEY_CLOSE] |= joy_getbutton(0,WIZ_MENU);
        end
...

??

Gracias de antemano.

SplinterGU

ejemplo es un prg completo, que no tenga que estar armando el resto para probar... algo que pueda probar directamente y tocar el codigo sin tener que armarlo de cero.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Quote from: SplinterGU on August 01, 2009, 09:29:17 PM
ejemplo es un prg completo, que no tenga que estar armando el resto para probar... algo que pueda probar directamente y tocar el codigo sin tener que armarlo de cero.

Te lo pongo despues con tiempo, ahora estoy con cosas más urgentes, pero vamos es cargar algo y mientras tanto poner el texto, así que no tiene nada más.

Sobre los botones, tengo un nuevo problema:

Acabo de montar una estructura para los botones al estilo del pac-man, o sea tengo los botones por variables (para no repetir la llamada 'joy_getbutton' para asignar el !=1). Y utilizo una funcion modificada de controls(), donde guardo los botones cada uno en una distinta variable global (no en un array como en pac-man, pero que es lo mismo vamos).


La funcion es esta:

PROCESS controls()
BEGIN

    LOOP

    #define WIZ_UP          0
    #define WIZ_UP_LEFT     1
    #define WIZ_LEFT        2
    #define WIZ_DOWN_LEFT   3
    #define WIZ_DOWN        4
    #define WIZ_DOWN_RIGHT  5
    #define WIZ_RIGHT       6
    #define WIZ_UP_RIGHT    7
    #define WIZ_MENU        8
    #define WIZ_SELECT      9
    #define WIZ_L_BUTTON    10
    #define WIZ_R_BUTTON    11
    #define WIZ_A           12
    #define WIZ_B           13
    #define WIZ_X           14
    #define WIZ_Y           15
    #define WIZ_VOL_UP      16
    #define WIZ_VOL_DOWN    17

        IF (joy_number())
            Wiz_SetaCima |= joy_getbutton(0, WIZ_UP);
            Wiz_SetaBaixo |= joy_getbutton(0, WIZ_DOWN);
            Wiz_SetaEsquerda |= joy_getbutton(0, WIZ_LEFT);
            Wiz_SetaDireita |= joy_getbutton(0, WIZ_RIGHT);
            Wiz_SetaCimaEsquerda |= joy_getbutton(0, WIZ_UP_LEFT);
            Wiz_SetaCimaDireita |= joy_getbutton(0, WIZ_UP_RIGHT);
            Wiz_SetaBaixoEsquerda |= joy_getbutton(0, WIZ_DOWN_LEFT);
            Wiz_SetaBaixoDireita |= joy_getbutton(0, WIZ_DOWN_RIGHT);
            Wiz_Botao_A |= joy_getbutton(0, WIZ_A);
            Wiz_Botao_B |= joy_getbutton(0, WIZ_B);
            Wiz_Botao_X |=  joy_getbutton(0, WIZ_X);
            Wiz_Botao_Y |= joy_getbutton(0, WIZ_Y);
            Wiz_Botao_L |= joy_getbutton(0, WIZ_L_BUTTON);
            Wiz_Botao_R |= joy_getbutton(0, WIZ_R_BUTTON);
            Wiz_Volume_Menos |= joy_getbutton(0, WIZ_VOL_DOWN);
            Wiz_Volume_Mais |= joy_getbutton(0, WIZ_VOL_UP);
            Wiz_Botao_Select |= joy_getbutton(0, WIZ_SELECT);
            Wiz_Botao_Menu |= joy_getbutton(0, WIZ_MENU);
        END

        FRAME;
    END
END

en las variables globales tengo:

CONST

WIZ_UP = 0;
WIZ_UP_LEFT = 1;
WIZ_LEFT = 2;
WIZ_DOWN_LEFT = 3;
WIZ_DOWN = 4;
WIZ_DOWN_RIGHT = 5;
WIZ_RIGHT = 6;
WIZ_UP_RIGHT = 7;
WIZ_MENU = 8;
WIZ_SELECT = 9;
WIZ_L_BUTTON = 10;
WIZ_R_BUTTON = 11;
WIZ_A = 12;
WIZ_B = 13;
WIZ_X = 14;
WIZ_Y = 15;
WIZ_VOL_UP = 16;
WIZ_VOL_DOWN = 17;

GLOBAL

Wiz_SetaCima;
Wiz_SetaBaixo;
Wiz_SetaEsquerda;
Wiz_SetaDireita;
Wiz_SetaCimaEsquerda;
Wiz_SetaCimaDireita;
Wiz_SetaBaixoEsquerda;
Wiz_SetaBaixoDireita;
Wiz_Botao_A;
Wiz_Botao_B;
Wiz_Botao_X;
Wiz_Botao_Y;
Wiz_Botao_L;
Wiz_Botao_R;
Wiz_Botao_Select;
Wiz_Botao_Menu;
Wiz_Volume_Menos;
Wiz_Volume_Mais;



El problema es que de esta forma me guarda las acciones que hago con los botones, entre pantallas (o sea, procesos que no tienen comunicación ya que esta puesto el 'let_me_alone'). O sea si ejecuto un comando de botones en una pantalla (L+ R por ejemplo), al entrar despues en otra pantalla donde esos botones si tienen una acción asociada, la accion de estos botones se ejecuta y no deberia ya que lo hice en otra pantalla y no en la actual !!!!


De la forma antigua funciona bien:

Por ejemplo en el menu del titulo con 'L + R' sales del juego:

IF (joy_getbutton(0, WIZ_L_BUTTON) AND joy_getbutton(0, WIZ_R_BUTTON) AND
    joy_getbutton(0, WIZ_L_BUTTON) != -1 AND joy_getbutton(0, WIZ_R_BUTTON) != -1) exit ("Bye Bye", 0); END



De la nueva forma tengo:


PROCESS menu_titulo()
BEGIN

signal(type controls, s_kill); controls();

IF (Wiz_Botao_L AND Wiz_Botao_R AND Wiz_Botao_L != -1 AND Wiz_Botao_R != -1) exit ("Bye Bye", 0); END

lo que ocurre, es que en otra pantalla (el los creditos por ejemplo) tengo:


PROCESS staff();

...

let_me_alone();

signal(type controls, s_kill); controls(); // Para utilizar los botones para otras cosas (aqui no tengo nada que se ejecute con 'L + R')

.... (contenido del proceso)

END

Vale pues en la pantalla de staff le doy a 'L + R' no hace nada porque aqui tampoco tengo ningun if asociado a esa acción de botones, pero cuando sale del staff y vuelve a la pantalla de titulo (donde si existe el if asociado que sale del juego), se ejecuta la acción de los botones y sale del juego!!!

Como se pueden resetear los botones entre pantallas ?? el signal(type controls, s_kill); controls(); no deberia funcionar ?

Pienso que esto deberia matar el processo de la otra pantalla y volver a cargar los botones, no deberian dejar rastro!!

Gracias.

Drumpi

Sólo una cosilla: en GP2X se suponía que teníamos 32MB de RAM, pero estaba dividida en 16+16MB (mitad y mitad para cada core) y se suponía que con un truco se podía acceder a toda la RAM usando una única CPU. A eso añádele la carga del sistema, la memoria que consume el propio Fenix...
Hice un experimento: cree un pequeño programa cuya única misión era decir la memoria disponible del sistema (mem_free o algo así se llamaba la función) y me sorprendió ver que apenas tenía 8MB para mis juegos. También use dicha función para un juego que estaba portando de PC a GP2X y veía cosas rarísimas (caidas en picado de la memoria libre con archivos pequeños, otros de un par de megas ocupaban unos cientos de kas...).

Así que, antes de dar por sentado nada, asegúrate del espacio que tienes. Conozco a más de uno que anda de cabeza con este problema (por ejemplo, el proyecto FireWhip, que usa enormes mapas de scroll y música en OGG).

Por cierto, cuidado con el uso de variables globales, no he leido bien el último mensaje, pero mi intuición me dice que no tienes en cuenta que las variables globales mantienen sus valores, muera el proceso que sea.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

FreeYourMind

#19
Quote from: Drumpi on August 01, 2009, 11:44:02 PM
Sólo una cosilla: en GP2X se suponía que teníamos 32MB de RAM, pero estaba dividida en 16+16MB (mitad y mitad para cada core) y se suponía que con un truco se podía acceder a toda la RAM usando una única CPU. A eso añádele la carga del sistema, la memoria que consume el propio Fenix...
Hice un experimento: cree un pequeño programa cuya única misión era decir la memoria disponible del sistema (mem_free o algo así se llamaba la función) y me sorprendió ver que apenas tenía 8MB para mis juegos. También use dicha función para un juego que estaba portando de PC a GP2X y veía cosas rarísimas (caidas en picado de la memoria libre con archivos pequeños, otros de un par de megas ocupaban unos cientos de kas...).

Así que, antes de dar por sentado nada, asegúrate del espacio que tienes. Conozco a más de uno que anda de cabeza con este problema (por ejemplo, el proyecto FireWhip, que usa enormes mapas de scroll y música en OGG).

Por cierto, cuidado con el uso de variables globales, no he leido bien el último mensaje, pero mi intuición me dice que no tienes en cuenta que las variables globales mantienen sus valores, muera el proceso que sea.

Si, ya sabia del lio de la memoria cuando empeze a portar el juego a Gp2x con Fenix, lo que ocurre es que creo que la musica ogg la descomprime en memoria por eso ocupan más en la memoria ram que fisicamente (tambien me lo comento Puck personalmente, una vez que tuve ocasión de encontralo en Retromadrid). Esto lo voy a resolver cargando y descargando musicas entre fases, por 3 musicas no consigo cargar todo de golpe al principio ;)

Lo del joystic me temo que es eso, no se como resetear estas variables, igual lo voy a dejar de la anterior forma, haciendo el joy_getbutton cada vez que utilizo un boton, por lo menos evito este problema (lo estaba haciendo por supuesto rendimiento, pero esto en este caso es minimo, no llega ni a nivel de poder obserbarse).

Otra cosa que noto es que las condiciones no funcionan al 100% de igual forma, ejecutando Bennu en el PC o en la Wiz, pongo un ejemplo:

Este IF, en el PC no ultrapasa la opcion 4 (si te mueves hasta la opcion 4 no pasas de ella) pero en la Wiz si que la ultrapasa
IF ((joy_getbutton(0, WIZ_DOWN) AND joy_getbutton(0, WIZ_DOWN) != -1) OR key(_down) AND presiona == 0 AND opcion < 4)
    opcion++; presiona=1; END

Esta es la corrección para que funcione correctamente tanto en el PC como en Wiz
IF (((joy_getbutton(0, WIZ_DOWN) AND joy_getbutton(0, WIZ_DOWN) != -1) OR key(_down)) AND presiona == 0 AND opcion < 4)
   opcion++; presiona=1; END


SplinterGU

#20
lo que digo es que si tenes un programa que vas a probar en PC no hagas esto:

            Wiz_SetaCima |= joy_getbutton(0, WIZ_UP);

ni tampoco esto

            Wiz_SetaCima |= ( joy_getbutton(0, WIZ_UP) && joy_getbutton(0, WIZ_UP) != -1);

tenes que hacer esto

            joys_up = joy_getbutton(0, WIZ_UP);
            Wiz_SetaCima = joys_up && ( joys_up != -1);

y tampoco usar | (or binario) de esa forma.

hay una gran diferencia.

puede que cuando llamas otra vez a joy_getbutton en una plataforma u otra, el evento ya se consumio, y no devolvera o quien sabe que propiedad de la SDL existe...

esto es algo que ya dije muchas veces, pero cuando pido un ejemplo compilable, lo hago porque yo tambien estoy en otras cosas mas urgentes... y pensa que el soporte que doy se multiplica por cada uno que hace preguntas, si tengo que hacer ejemplos para cada uno estaria mi vida dedicada completamente a esto, ya que me requiere mucho esfuerzo... en cambio si cada uno que necesita ayuda aporta su granito de arena haciendo un ejemplito de lo que falla, yo solo tengo que correrlo y mirar que falla... en otro caso tengo que armar ejemplo, correrlo, y ver que falla, con el riesgo de que el problema sea que estas haciendo algo mal, y a mi nunca me fallara al hacerlo bien, resumiendo, no es lo mismo lo que probaria.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Quote from: SplinterGU on August 02, 2009, 03:28:34 AM
lo que digo es que si tenes un programa que vas a probar en PC no hagas esto:

            Wiz_SetaCima |= joy_getbutton(0, WIZ_UP);

ni tampoco esto

            Wiz_SetaCima |= ( joy_getbutton(0, WIZ_UP) && joy_getbutton(0, WIZ_UP) != -1);

tenes que hacer esto

            joys_up = joy_getbutton(0, WIZ_UP);
            Wiz_SetaCima = joys_up && ( joys_up != -1);

y tampoco usar | (or binario) de esa forma.

hay una gran diferencia.

puede que cuando llamas otra vez a joy_getbutton en una plataforma u otra, el evento ya se consumio, y no devolvera o quien sabe que propiedad de la SDL existe...

esto es algo que ya dije muchas veces, pero cuando pido un ejemplo compilable, lo hago porque yo tambien estoy en otras cosas mas urgentes... y pensa que el soporte que doy se multiplica por cada uno que hace preguntas, si tengo que hacer ejemplos para cada uno estaria mi vida dedicada completamente a esto, ya que me requiere mucho esfuerzo... en cambio si cada uno que necesita ayuda aporta su granito de arena haciendo un ejemplito de lo que falla, yo solo tengo que correrlo y mirar que falla... en otro caso tengo que armar ejemplo, correrlo, y ver que falla, con el riesgo de que el problema sea que estas haciendo algo mal, y a mi nunca me fallara al hacerlo bien, resumiendo, no es lo mismo lo que probaria.


1 - He cambiado la funcion control() segun tu ejemplo, muchas gracias ya funciona a la perfección y no tengo problemas entre pantallas :)

2-

En relación al ejemplo, no me mal interpretes, se perfectamente que no tienes tiempo para montar el ejemplo, yo dije que que ya te lo pasaria, porque tenia cosas mas urgentes, con esto solo quiero decir, que el problema del loading es de los que tiene menos prioridades (es una cosa mas de estetica que funcional), que lo dejaria para el final, porque tengo cosas mas importantes en el port. Estoy hablando de urgencia mia no de quien me pueda ayudar :)

Tambien he puesto la pregunta del loading  pensando que habria gente que ya haya tenido el mismo problema, y que no sea necesario ponerlo a ejecutar para encontrar el problema.


Saludos.




SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Ya tengo el ejemplo del loading listo para quien lo quiera probar.

Pongo una carpeta para copiar a la wiz con el ejemplo listo a correr, y en otra el ejemplo listo a correr y con todo lo necesario para compilar y correr en el PC.

Como se puede observar si ejecutas en el PC podras ver el texto 'loading...' en pantalla antes que salga de la aplicación (que es cuando termina de hacer el loading de las musicas).
En la Wiz no veras el texto, solo la pantalla negra mientras hace el loading y sale.

Saludos.

P.S. Lo pongo en 7 partes por la limitación de 256 kb/4 ficheros por post.




SplinterGU

ajap... y no probaste compilando directo en la wiz? me parece que hay algo raro que se me escapa que a veces el dcb compilado en una plataforma no funciona en otra... quizas no es eso, pero no es mala idea intentar...
en un rato lo pruebo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Quote from: SplinterGU on August 02, 2009, 05:43:46 PM
ajap... y no probaste compilando directo en la wiz? me parece que hay algo raro que se me escapa que a veces el dcb compilado en una plataforma no funciona en otra... quizas no es eso, pero no es mala idea intentar...
en un rato lo pruebo...

Creo que compilando directamente ocurre lo mismo, porque la primera vez que probe el juego en la Wiz fue compilando directamente en ella, y recuerdo que no salia.

Gracias.

FreeYourMind

Gracias por vuestra ayuda... Esta resuelto...