Hola.
Estoy empezando a portar un juego a Bennu que tengo en Fenix (Fenix para Wiz).
He creado el 'bgdc.import', he empezado poniendo la dll 'mod_text', porque era lo primero que el compilador me decia no reconocer (trabajo en Windows vista).
El problema es que ahora me dice que no encuentra la 'SDL.dll'. Tampoco se que revisión descompacte, es una que te pone todas las dll's en la misma carpeta del compilador (me he fijado que la bgd-1.0.0RC7(r99)-win32.rar ya te lo pone todo por carpetas).
Me fijo que la otra version tiene en la carpeta 'externals' esa dll, pero estoy casi seguro que la que descompacte no la tenia.
Por cierto si me decis para utilizar la otra version, necesito poner las dll's en la misma carpeta del compilador o ya no es necesario ?
Gracias de antemano.
usa el instalador y resetea la pc luego de terminar...
el rar es solo para maniaticos como Sandman.
Quote from: splinter_work on July 30, 2009, 08:03:17 PM
usa el instalador y resetea la pc luego de terminar...
el rar es solo para maniaticos como Sandman.
Resetea la pc ? No entiendo perdona.
No quiero usar el instalador, prefiero descompactarlo manualmente (la unica vez que probe el instalador se quedo la pantalla del cmd en negro y no pasaba de ello).
La ultima que encuentro en rar (aparte de un supuesto fix: Fix-bgd-1.0RC7(r100)-win32.zip) es esta: bgd-1.0.0RC7(r99)-win32.rar
Utilizo esta o que ?
La verdad es que, de entre las versiones que hay para descarga y las que han pasado ya por todo el forum, uno se pierde, ya que las ayudas son siempre sobre versiones y ocasiones antiguas.
Gracias de antemano.
Si usas el rar, tendrás que poner TODAS las rutas en el path (es decir, si lo descomprimes por ejemplo todo en c:\bennugd, poner en el path c:\bennugd\modules, c:\bennugd\libs, c:\bennugd\externals y c:\bennugd\bin).
Quote from: osk on July 30, 2009, 09:07:19 PM
Si usas el rar, tendrás que poner TODAS las rutas en el path (es decir, si lo descomprimes por ejemplo todo en c:\bennugd, poner en el path c:\bennugd\modules, c:\bennugd\libs, c:\bennugd\externals y c:\bennugd\bin).
Vale muchas gracias, yo he decidido poner todas las dll's en la misma carpeta del compilador. Ahora solo me queda una duda, no hay ninguna lista que ponga el nombre de la dll y las respectivas funciones que esa dll contiene (o es responsable) ? Es que al compilar no se que dll's importar para cada funcion desconocida que me pueda surgir.
En el punto actual de la compilación, me pone los siguientes errores:
1 - Warning: variable redeclared ("ALPHA_STEPS"); (Aqui me dice que ya esta declarada 2 o mas vezes, me imagino que es interno al compilador.)
2 - Error: Unknown identifier ("S_KILL"); (Aqui no conozco la respectiva dll que tengo que importar.)
Saludos.
los warnings no les des importancia...
la lista, tenes un script (.bat) para generarla... http://forum.bennugd.org/index.php?topic=129.0
Quote from: SplinterGU on July 31, 2009, 01:34:32 AM
los warnings no les des importancia...
la lista, tenes un script (.bat) para generarla... http://forum.bennugd.org/index.php?topic=129.0
Gracias SplinterGU.
Me acabo de enterar que no tiene total compatibilidad con Fenix.
Al importar el modulo para uso del Joystic 'mod_joy' me seguia dando error 'unnknown identifier ('JOY')', me entero que el joystic no se asigna de la misma forma,
o sea, tengo que cambiar por ejemplo 'joy.down' (Fenix) por 'joy_hat_down' (Bennu).
Tengo razón o hay algo que se me escapa ?
Edito: Me entero por el ejemplo del pac-man como se asignan los botones, en el caso anterior seria (joy_getbutton(0, WIZ_DOWN)).
Para que sirve entonces el 'joy_hat' ?
Saludos.
Este es el ejemplo con el que aprendí yo a manejar los joysticks:
http://wiki.bennugd.org/index.php?title=Tutorial:Joystick_tester
Está en el wiki de Bennu. Espero que te sirva.
Gracias por el ejemplo del Joystic, pero ya los habia mapeado (mirando el ejemplo del pac-man).
Por fin he podido compilar.
Bueno lo mas importante es que por fin puedo sacar el juego en Wiz ya que la diferencia de rendimiento es brutal (en los procesos),
tenia la conversión para la Gp2x aparcada hace 2 años esperando un Fenix con mejor rendimiento o la salida de la Wiz.
Probe esa compilación de Fenix en la Wiz, y la velocidad ya casi me convencia, pero aún no era el esperado.
Por fin con Bennu, es un sueño echo realidad, va a la perfección en rendimiento (como la versión PC).
Ahora me salen mas cosillas, pero en esto con tiempo creo que lo adaptaré todo, os la pongo por puntos a ver si alguien me puede ayudar.
Problemas que he tenido (comparada con la compilación que tenia en Fenix y la cual no tenia estos problemas):
1 - Al ejecutarlo en el ordenador, los mandos (botones) funcionan solos ! Me entra en el juego, me desloca el jugador hasta que toca en la pared y ya no puede pasar, y los botones no me funcionan! (tengo los botones mapeados para poder jugarlo en la portatil y en el pc con condiciones OR). La unica forma de salir del juego es matando el processo Bennu, ya que la 'X' de la esquina para cerrar la pantalla tampoco funciona en Bennu.
En la Wiz me funcionan los botones aunque no todos los movimientos funcionan bien, y el jugador pasa por las margenes de las paredes X, Y (limites de movimiento).
2- Algunos bloques de código donde pongo 'frame;' parece que no funcionan, al cambiar entre pantallas, o al poner el texto 'loading' que tiene frame; no me sale, etc.
3- Tambien me han fallado algunas musicas, que no tocan (si lo hacian en Fenix).
4- Otra duda, con que editor editais el 'Juego.gpe' ? Yo utilizo el Notepad++ en windows vista, edite el que venia con el pac-man y lo deje de esta forma:
"#!/bin/sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../bgd-runtime
PATH=$PATH:../bgd-runtime"
borrando lo que tenia despues, pero no arrancaba en la wiz, al fin lo puse tal cual el de pac-man, pero no puse el prg del juego en la carpeta y tampoco arrancaba, al final poniendo el .prg ya arrancaba.
Pero para que tiene esto:
"for prg in *.prg; do
name=`basename $prg .prg`
bgdc $prg
bgdi $name
done"
es necesario poner el .rpg :) o que ? Como seria este fichero lo mas simplificado posible ?
Gracias de antemano, por fin voy a sacar mis juegos en Wiz :)
Ese funcionamiento de Fenix es antiquisimo... creo que desde la 0.84 o 0.85 que no existe mas...
la pregunta con respecto al hat deberia responderla la gente de SDL...
Bennu es totalmente compatible con Fenix... lo que se hizo en la version uFenix de los mapeos de los botones no es un wrapper de lo que hace la SDL... bennu/fenix original, hacen un wrapper del joystick de la SDL.
1) seguramente no estas controlando la condicion de error al llamar a las funciones de joys... y el -1 del retorno ante error esta dandote problemas... para que la "X" funcione, tenes que meter el modulo mod_wm (manejador de ventanas) y despues de eso, en tu codigo controlar la variable "exit_status"
2) si no tenes frame dentro de cualquier bucle, no solo no cerrara, sino que se congelara todo. Donde y como pones el texto loading? pon ejemplos compilables en codigo.
3) puede que te falta alguna lib externa... si la SDL lo soporta se reproduce.
4) en el script tenes que poner el "echo ... > /..."
claro, si no esta el prg con el for no va a funcionar... tenes que eliminar el bloque del for y solo poner bgdi "nombre del programa"
de nada...
PD: Alguien con permisos podria dividir este tema, ponerle un nombre adecuado y moverlo a helpdesk? yo aca no tengo permisos para hacerlo... gracias...
Despues de más intentos aqui pongo mas detalhes a los 4 puntos teniendo en cuenta tu respuesta:
1) Me puedes poner un ejemplo del control que dices ? La verdad solo cambie los joy.up y demas por su equivalente en Bennu (joy_getbutton(0, WIZ_UP)).
2) El texto lo pongo antes de cargar los recursos, para que lo enseñe mientras esta la pantalla negra cuando esta cargando los recursos, en fenix iba de maravilla, con Bennu al probarlo en el pc tambien funciona poniendo un Frame(200); pero en la Wiz no sale el texto:
set_mode(320,240);
write(0,160,120,4,"Loading ...");
//FRAME; // Gp 2x fenix port
FRAME(200); // Bennu
som_logo=load_wav(...)
... (todos los load's)
delete_text(all_text); // Gp 32 (borrar texto "Loading").
logo();
END
3) Esto es curioso y es el tema me mas me moskea, ya que en Fenix para Gp2x tenia problemas similares. Todas las musicas funcionan
al ejecutarlo en pc (con lo bennu o fenix), pero en la wiz algunas no tocan. Lo curioso es que con el port de Fenix ocurria lo mismo, pero no eran las mismas musicas que fallaban (por ejemplo, con bennu me falla la musica de la fase 1 y con fenix me falla la de la fase 2).
4) Heheheh , voy a ver si lo pongo bien, por curiosidad estaba tirando del prg viejo y yo actualizando el compilado .dcb ;)
Muchas gracias.
1) ejemplo...
... != -1 && ( ...
:P
2) Creo que el delete_text es el tema
3) bennu y fenix usan SDL para el sonido, ahi debe estar el problema
No será que estás usando OGG? desde las últimas versiones de Fenix había que incluir la ogg.dll, la vorbis.dll y otra más que venían en la 0.90, no se si en bennu seguirá el mismo problema.
Aqui sigo ultimando la adaptación:
1 - Ya me funciona la musica, utilizo ogg's y mod's (aunque el maldito vista insiste con los mod's, me salen fallos de rundll o del Explorador con solo mirar la carpeta o selecionar mod's con el mouse, lo que me dificulta trabajar con la musica).
Sólo necesito importar 'mod_sound'.
Sobre esto la memoria de la Wiz es la misma que Gp2x ? Tampoco puedo cargar todo el audio de golpe (1,81 megas casi todo ogg's y 4,5 mod's), se sale al menu, ahora solo me queda intentarlo musica a musica hasta llegar al limite :).
2 - Sobre el volumen, pues intentare utilizar los botones del volumen por codigo.
3 - El texto de loading sigue sin salir en la Wiz (en el PC sale y con el Fenix port tambien), no es problema del delete_text, ya que si no lo borro, me sale pero despues cuando ya entra en logo (despues de la carga).
Muchas gracias por el ejemplo de joystic, creo que lo he entendido, he puesto por ejemplo:
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 ...
y ya me funciona bien tanto en la consola como en el PC.
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...
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.
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.
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.
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.
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
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.
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.
:)
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.
parte 3 y 4.
parte 5 y 6.
parte 7, ultima ;)
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...
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.
Gracias por vuestra ayuda... Esta resuelto...
como lo resolviste?
Hice pruebas con distintos valores de FRAME, el minimo para que aparezca en la Gp2x Wiz (en el PC sale siempre), fue FRAME(400).
El Loading tarda 7 segundos sin poner el texto, con texto son 8 segundos.
Otro problema que tengo, ya que tengo la conversión al 90% y dentro de una semana saco el juego, son solo 2 cosas:
1 - El fade in y fade on parece que no funcionan.
2 - El rendimiento se me ve afectado teniendo varias animaciones en simultaneo, lo curioso es que teniendo muchos procesos no se ve minimamente afectado (en fenix esto era un problema), pero con varias animaciones (por ejemplo 20 cuadrados animados de 8x8 pixels, con 7 o 8 animaciones cada) al igual que fenix pierde mucho rendimiento.
Lo peor es que se queda lento, y despues al terminar procesos se acelera y queda super rápido, más de lo definido, ya que pongo 24 frames por segundo, y en los casos que esta ralentizado debido a estas animaciones, cuando libero otros procesos y queda mas rapido, para estabilizarse, es como consumiera los frames que quedan, quedando mas rápido que los 24 frames definidos, y lo ideal es que no los ultrapasara nunca. Resumiendo, con esto me veo con el problema de que en ocasiones (despues de ultrapasar tiempos de ralentización), todo el juego se me queda mas rápido de lo que quiero (24 frames/segundo).
no te entendi mucho... ejemplos y codigos serian ideales para ver el tema...
el fade se comporta un poco diferente que las viejas versiones de fenix... no se como lo estas haciendo, pero funcionar, funciona.
Utilizo el sencillo fade_off(); seguido de fade_on(); Cual seria el equivalente ??
Sobre la velocidad, es lo siguiente, tengo una pantalla que tiene muchos bloques y cada uno es un proceso (la pantalla se rellena de estos cuadrados o bloques), y tengo otros bloques que tambien son procesos pero estos son animados y estos estan siempre en pantalla (no desaparecen nunca).
En total son como 180 bloques en la fase, de los cuales 20 son animados y estan hasta el final, y los otros van desapareciendo a medida que con el jugador choco contra ellos.
en esta pantalla inicialmente va juy lento el juego, pero como al colidir con estos bloques (los que no son animados) estos son destruidos, lo que hace que el juego gane rendimiento y se acerque a su velocidad normal (24 frames por segundo), lo que ocurre es que en lugar de estar lento y normalizarse a hasta los 24 frames, no ocurre, se vuelve mas rápido al destruir estos bloques (procesos) pero la velocidad sube por encima de los 24 frames, solo pasando unos segundos se normaliza, pero termina por existir intermedios de tiempo que va mas rapido que los 24 frames.
Es como si en el instante que va mas rapido estuvira 'consumiendo' los frames que al principio no consumio (cuando el juego estaba lento, porque tenia todas las animaciones y todos los procedimientos), cuando no llegaba a los 24 frames.
que version de bennu estas usando? la r99 + el patch r100?
Si.
voy a tener que seguir mejorando el sistema de control de fps parece...
No se como tendras el sistema de control de fps, pero creo que lo unico que te falta es una condición para que no ultrapase el fps definido inicialmente cuando haces la supuesta optimización.
Yo lo voy a intentar optimizar substituyendo el conjunto de procesos de los cubos animados por 1 que tenga todos los cubos en una imagen animada.
Creo que esto me va a solucionar el problema.
Sobre los fade off y fade on,
Utilizo el sencillo fade_off(); seguido de fade_on(); Cual seria el equivalente ??
Esto para terminar mi mesa de ayuda e intentar sacar el juego ya este fin de semana, para ponerme con otro port.
Quote from: SplinterGU on August 17, 2009, 01:31:06 AM
voy a tener que seguir mejorando el sistema de control de fps parece...
Pongo lo mismo que puse en el foro gp32spain, ya que tiene que ver con el mismo tema:
1-Ya he probado la r101 para Wiz:
El tema del fps sigue igual, o sea, tengo definido fps 24 frames, si el juego va lento (solo en fases con muchas animaciones), al destruir procesos, y antes de estabilizarse a su velocidad normal (24 frames, como en las fases sin animaciones donde va bien desde el principio al final), se pasa del fps 24 frames a velocidades mayores, solo pasados unos segundos se estabiliza.
Aunque me ha dado la sensacion que solo queda mas rapido (+24 frames fps) mas tarde ya cuando quedan muy pocos procesos por destruir, y con la r100 se vuelve antes mas rapido cuando hay mas procesos en pantalla.
Esto fue solo una sencación al probarlo, no se si sera verdad, habria que compararlo mas detalladamente.
Ahora se me ocurre, se puede imprimir el valor que tenga de fps en pantalla ? con esto no me refiero al valor que yo defina, ya que es de 24 fps, pero si al que en realidad bennu estaria ejecutando en su instante ?
Otra diferencia es que me ocupa 1kb más el dcb (sera por el nuevo código)
Y otra cosa, probe tal como dices el compilado del r100 en el interprete r101 en windows y como dices no son compatibles, lo guapo seria en el interprete te avisara de esto en un mensaje en lugar de dejar de responder (es solo una observación, para nada te quiero obligar a picar código )
2 - Cita (del foro gp32spain):
Originalmente Escrito por Drumpi
Fade_on y fade_off crean el fundido pero de forma muy rápida. Lo he puesto en el código para "apagar" la pantalla antes de hacer el efecto del fade.
Lo suyo es usar fade(r,g,b,paso) en el que r,g,b son las componentes de color en porcentajes (si pones 100,100,100 se encenderá la pantalla, si pones 0,0,0 se apagará, si pones 100,0,0 sólo se encenderán las componentes rojas de los colores, si pones 200,0,0 hará un fundido a rojo, si pones 200,200,200 hará un fundido a blanco...).
Y paso es la velocidad del fundido, aunque no recuerdo si es directa o inversamente proporcional.
He probado poniendo:
fade_off();
frame;
fade_on();
while (fading) frame; end
pero no noto el efecto del fade como en Fenix.
Si mi duda es saber que poner (si puedes ponme el codigo correcto)
para ser lo más identico a fenix (me refiero tambien a la velocidad de fundido por si tengo que usar fade(r,g,b,paso)).
En los 2 casos te agradeceria que cambiaras el siguiente ejemplo de FENIX para que funcionara igual en BENNU:
PROCESS menuopciones()
PRIVATE
...
BEGIN
let_me_alone();
...
IF (salir_opciones)
fade_off();
unload_song(musica);
delete_text(all_text);
clear_screen();
fade_on();
menu(); // salimos al menu
END
FRAME(200);
END
Gracias.
Lo quiero sacar este fin de, sobre el fps, tengo otra forma de que no queden lentas las fases debido a tanta animacion (voy a poner todas las animaciones en solo una a ver si gana rendimiento), y no tendre que preocuparme que en bennu se arregle el tema para ahora y sacare ya el juego.
Sobre el fade_on, fade_off es una cosa pequeñita, pero es lo que falta para terminar :)
aca te paso el ejemplo:
import "mod_video";
import "mod_map";
import "mod_key";
begin
set_fps(15,0);
map_clear(0,0,rgb(255,0,0));
while(!key(_ESC))
if ( key(_1) ) fade_off(); while(fading) frame; end; end
if ( key(_2) ) fade_on(); while(fading) frame; end; end
frame;
end
end
obviamente que si ya la pantalla esta encendida, con hacer fade_on no va a pasar nada... fenix, aunque la pantalla este encendida la ponia en negro y luego al encendia... lo mismo aplica a fade_off
quizas el fade_on y fade_off van muy rapido (para mi gusto, debo ajustarlos un poco o permitir cambiar el paso), prueba con esto que te va a ir mejor.
import "mod_video";
import "mod_map";
import "mod_key";
begin
map_clear(0,0,rgb(255,0,0));
while(!key(_ESC))
if ( key(_1) ) fade(0,0,0,1); while(fading) frame; end; end
if ( key(_2) ) fade(100,100,100,1); while(fading) frame; end; end
frame;
end
end
Bueno ya habia visto en el otro foro, aca (aca latino hehehe me gusta :)) dejo mi respuesta del otro foro, ya que es en este que deberia estar, pues puede que alguien necesite nuestras discusiones y soluciones:
1 - Mil gracias mañana pruebo lo del fps.
2 - Acababa de encontrar la solucion sobre el fade_off, fade_on.
Para tener el efecto similiar de Fenix donde poniendo:
fade_off();
fade_on();
en qualquier parte, hace un apagado y encendido de la pantalla muy rapido, sin tener que definir nada más, ni frame; ni nada.
Pues en Bennu tambien funciona, lo que ocurre (por las pruebas que hice) es que el segundo fade anula el primero, y como es de encendido pues la pantalla sigue igual.
Hay que hacer esto (seria lo equivalente, a velocidad de fade similar, para mis ojos vamos, no que sea exactamente la misma velocidad ):
fade_off();
while (fading) frame(30);end
fade_on();
y ya esta, esto hace el mismo efecto a identica velocidad, la cual se cambia en el frame, pero tambien podemos hacer esto:
fade(0, 0, 0, 100); // 100 es la velocidad, mas alto más rápido
while (fading) frame;end
fade_on(100, 100, 100, 3);
Aunque lo sabes de sobra hehehhe pero por lo menos ya tenemos la solucion exacta, es poner
while (fading) frame(30);end
despues del primer fade y ya esta.
claro, lo que pasa es que en fenix, la funcion era bloqueante... o sea, que nada se volvia a ejecutar hasta que fade_on/fade_off, de la forma que bennu lo hace, podrias aprovechar el tiempo muerto para hacer otras cosas... o incluso hacer un fade mientras objetos por detras se mueven o lo que sea...
Te vas alegrar aun mas con esto:
Acabo de resolver el otro Bug, el del FPS que tiene Bennu, de modo en que en el juego no ocurra:
- Resumen del bug:
Bug 1 - En un instante del programa que exista ralentización (fps por debajo del asignado), al eliminar procesos durante la ejecución del programa, hay instantes en que el valor del fps sube debido al incremento de rendimiento (por la lógica de eliminacion de procesos), pero este valor en estos instantes sube por encima del fps inicialmente asignado en el programa y solo pasado unos instantes se estabiliza en el valor inicialmente asignado. Lo correcto seria pasar de ralentización (fps por debajo) al fps correcto (fps asignado) al eliminar procesos, y en ningun caso ultrapasar este valor.
Solución:
Buscando la solución me deparo con otro Bug, y tomando partido de este nuevo Bug encuentro la solución (interesante esto) :)
Nuevo Bug:
Bug 2 - Solo se obtiene el real valor del fps durante la ejecución de un programa
con
write_int(0, 30, 0, 0, &fps); // FPS
si definimos el fps con
set_fps (0, 0);
(que pone el fps al maximo posible en todo instante)
teniendo esto, pues solo puedes tirar partido de la variable del sistema 'fps' si utilizas
set_fps (0, 0);
si la defines con otro valor, la variable 'fps' de Bennu no va ser correcta en algunos momentos del programa.
Mi impresion es que el problema en Bennu proviene de que utilizando set_fps(0,0) la variable 'fps' se esta actualizando en tiempo real por eso tenemos siempre el valor correcto, y poniendo por ejemplo set_fps(24, 0) esta variable 'fps' deja de actualizarse y su valor no es correcto (ya que el fps cambia segun el rendimiento del programa pero este valor se mantiene, yo tenia instantes en que el juego iba a 7 frames/seg y el valor de esta variable seguia indicando los 23/24 frames :)).
La solución que encontre fue la siguiente:
1 - Defino el valor de fps con una variable global (lo pongo asi porque en las opciones tb se puede cambiar la velocidad del juego)
GLOBAL
velocidad = 24;
2 - Inicio la fase (solo el fps de las fases, o sea la 'velocidad', es configurable en las opciones)
con
set_fps (0, 0);
Esto me permite obtener el valor de la variable de Bennu 'fps' (real) en tiempo de ejecución y debido al bug anterior (bug 2), es la unica forma, si pongo por ejemplo set_fps(velocidad, 0); esta variable 'fps' no va ser correcta durante la ejecución y no me sirve.
3 - Durante el loop del programa (fase) ponemos la condicion clave, ya que es la que soluciona el Bug 1:
IF(fps >= velocidad) set_fps (velocidad, 0); END
Con esto evito (por fin) que el juego ultrapase el fps inicialmente estabelecido (velocidad=24 o el valor que le asignemos en las opciones) en los momentos que sale de una ralentización (ver Bug 1).
Como nota, en este instante al definir set_fps (velocidade, 0);
volvemos a tener el Bug 2 :) en que el valor del sistema Bennu 'fps' ya puede no ser correcta, pero como ya tenemos el Bug 1 resuelto, en este instante y hasta el fin de la fase ya no necesito utilizar la variavle 'fps' (en este caso, debido a la estrutura de la fase ya que no volvemos a perder rendimiento hasta pasar de fase, en otros casos podria ser un problema de nuevo).
4 - Por fin, al pasar de fase volvemos a definir
set_fps(0, 0);
para poder volver a repetir el todo el proceso en la fase siguiente :)
Son estas cosillas (chorraditas) que nos animan :)
P.S: Por cierto no puedo usar el frameskip, por ejemplo set_fps(velocidad, 3); porque este tipo de juego se vuelve injugable si salto frames (ya que chocamos contra obstaculos sin querer).
eso lamentablemente no es una solucion y tiene sus problemas...