Ver la versión completa : ¿Qué cosas de estas se pueden hacer?
Estoy empezando con Fenix, de momento intentando "compilar" cosas y que me rulen en el PC, y me surgen varias dudas de si se pueden hacer algunas cosas:
(añado que me he mirado varios faqs y todo eso, pero quizá algunas cosas se me han pasado)
1) Con el recién incorporado soporte para la pantalla táctil, se usan las órdenes de ratón, pero se pueden detectar todas las acciones, como el movimiento pulsando la pantalla y medir la presión que se ejerce sobre la misma? (creo que leí que la gp detectaba eso).
2) ¿Se puede cambiar el framerate de los juegos para que cada segundo se refresque 50 o 60 veces?
3) ¿Está soportado el TV-Out con la GP?
4) ¿Se pueden reproducir archivos IT (impulse tracker) y OGG sin añadir ninguna librería, y se tiene acceso a los mismos por tiempo? (ir al segundo tal cuando suceda algún evento, por ejemplo).
Muchas gracias por adelantado y disculpad si todo esto ya está contestado en otro lugar, he echado un vistazo bastante generalizado estos últimos días y no me ha parecido encontrar estas respuestas.:brindis:
Puck2099
16/12/2007, 00:26
1) Con el recién incorporado soporte para la pantalla táctil, se usan las órdenes de ratón, pero se pueden detectar todas las acciones, como el movimiento pulsando la pantalla y medir la presión que se ejerce sobre la misma? (creo que leí que la gp detectaba eso).
Se detecta si está pulsada la táctil y, en caso de estarlo, las coordenadas del píxel pulsado. La presión se detecta de forma binaria, no es posible medir "cuanto" está presionado pues la propia táctil no proporciona ese dato.
2) ¿Se puede cambiar el framerate de los juegos para que cada segundo se refresque 50 o 60 veces?
Sí, puedes establecer un limitador.
3) ¿Está soportado el TV-Out con la GP?
Sí, pero con las limitaciones del SDL, es decir, con la imagen un poco recortada a izquierda y abajo si no recuerdo mal.
4) ¿Se pueden reproducir archivos IT (impulse tracker) y OGG sin añadir ninguna librería, y se tiene acceso a los mismos por tiempo? (ir al segundo tal cuando suceda algún evento, por ejemplo).
Sí, ambos formatos, aunque te recomiendo el segundo por cuestiones de consumo de CPU. En cuanto a lo de acceder a posiciones de tiempo... ahí ni idea, mejor que te responda un fenixero.
Saludos
Muchas gracias puck, por tus respuestas y por el port de Fenix a GP2X. Antes programaba con las librerías allegro, que veo que también tienen port, pero de eso hace tanto tiempo que ahora ando bastante rovellao, así que el tema de Fenix me ha abierto las ganas de nuevo por su simplicidad :)
Otra duda que tengo sobre el TV-OUT (no tengo el cable aún y no lo he podido probar): se activa desde el menu de la consola o desde la propia aplicación? Y desde la propia aplicación, se puede establecer algún parámetro (ntsc, pal, resolucion, centrar la imágen) o esto viene establecido desde el menu y la res es siempre 320x240, al contrario de lo que pasa con los videos?
Lo de que la imágen se corte, supongo que se puede solucionar fácilmente haciendo la imágen un poco más pequeña de izquierda y abajo en caso de usar TV-OUT, no?
Bueno, se supone que yo soy un Fenixero, así que vamos allá con lo que se:
2) ¿Se puede cambiar el framerate de los juegos para que cada segundo se refresque 50 o 60 veces?
Si, con set_fps (incluye frameskip y todo).
3) ¿Está soportado el TV-Out con la GP?
Doy fe de que si.
4) ¿Se pueden reproducir archivos IT (impulse tracker) y OGG sin añadir ninguna librería, y se tiene acceso a los mismos por tiempo? (ir al segundo tal cuando suceda algún evento, por ejemplo).
Ejem, con cuidado en esto: no todos los IT están soportados, al menos por lo que yo se: las últimas versiones del OpenMPT que he usado guardan las canciones en un formato IT que Fenix no ha podido reproducir, posiblemente debido a las limitaciones de las SDL, pero una pasadita por el SchismTracker y como nuevas (y sin alterar la calidad). OGG tambien se soporta nativamente, y teóricamente XM, S3M y MOD (aunque este último aun no lo he oido en la negrita).
Respecto al acceso directo a los tiempos, desgraciadamente no. DIV2 te decía como mucho la línea por la que iba leyendo la musica modular, y no se si las SDL dan soporte para ello, pero Fenix, nativamente, solo te permite cargar, reproducir (una vez o en bucle), comprobar si suena y descargar (si no se me ha olvidado alguna función).
En fin, espero que esto te ayude, ánimo con tus proyectos.
y se tiene acceso a los mismos por tiempo? (ir al segundo tal cuando suceda algún evento, por ejemplo).
estas programando un juego tipo stepmania? quendan? o similar? :D
Aiken
Jajajajja, que va que va, pero hace algunos años hice unas músicas para un juego de naves de PC y al llegar al enemigo final de la fase, la música cambiaba a una reversión, pero lo que hacía en realidad era dar un salto a una partitura concreta del archivo IT donde se hallaba esa reversión... y quería saber si podía hacer algo así, jeje :)
Bueno, quizás parando la reproduccion y cargando otra canción ¿no sería más fácil? Otra cosa es que quieras hacer algo del estilo de Super Mario World (que los timbales solo suenan cuando vas sobre Yoshi) o de la portada del Iridion 2 de GBA
Lo que tu dices sería lo mismo (cargar otra canción) pero ocuparía más espacio. Ahorraría mucho espacio poder tener un sólo IT con los samples e ir a una partitura u otra según el momento, sin volver a cargar nada .
Otra manera sin tocar el port sería saber donde está en memoria, una vez cargado un IT, la lista de "reproducción de partituras" y hacer una función para poder modificarla fácilmente, con lo que entonces con un STOP_SONG, una modificación de la lista y de nuevo un PLAY_SONG, la canción empezaría por otro lugar sin tener que cargar nada y seguramente sin ningún parón.
Aparte de eso, a ver si podeis ayudarme con unas dudas que me surgen a raiz de mis experimentos:
Dado el siguiente código simple:
program pelota;
global
graficos;
begin
set_mode(320,240,16,MODE_FULLSCREEN);
define_region(0,0,0,320,240);
set_fps(60,0);
graficos=load_fpg("graficos.fpg");
write(0,0,0,0,"FPS:");
write_var(0,30,0,0,fps);
intro(); // logos
juego();
end
Y dando por supuesto que luego defino los procesos process intro() y process juego(), lo que me interesa es que el proceso juego se ejecute SÓLO cuando se haya terminado el proceso intro(), y de momento sólo consigo hacerlo si lo llamo desde el final del propio proceso intro(), sino se ejecutan a la vez y no me interesa que el juego empiece mientras se muestran los logos de la intro xD.
Me gustaría saber ponerlos en órden de esa manera que he escrito y que juego esperara a que intro terminara... hay alguna manera?
Así mismo, en el propio proceso de la intro tengo un problema, y es que no sé si existe alguna funcion que simplemente deje pasar frames sin más. En mi proceso de la intro, hay un fade_on a un logo (que espera que termine el fade) y luego un fade_out del mismo, pero no sé como mantener ese logo ahí durante, pongamos, 2 segundos. No sé si existe una función simple para ello y en caso de necesitar hacer un bucle para que pasen frames, he intentado con esto pero sin éxito:
cuentaframes=0;
loop
cuentaframes++; if (cuentaframes=>120) break; end;
end
En realidad ni siquiera sé por qué tengo que poner ese end después del break, pero es que sino no "compila" :(
Puck2099
18/12/2007, 01:05
Otra manera sin tocar el port sería saber donde está en memoria, una vez cargado un IT, la lista de "reproducción de partituras" y hacer una función para poder modificarla fácilmente, con lo que entonces con un STOP_SONG, una modificación de la lista y de nuevo un PLAY_SONG, la canción empezaría por otro lugar sin tener que cargar nada y seguramente sin ningún parón.
Eso requeriría modificar el traductor (fxc), el intérprete (fxi) y echar por tierra toda la portabilidad...
Tienes razón, en todo caso sería cuestión de incluirlo en el propio fenix, pero tampoco es tan importante.
En cuanto al resto que he comentado, qué me decís? :)
En realidad ni siquiera sé por qué tengo que poner ese end después del break, pero es que sino no "compila" :(
Todos los ifs necesitan un end en Fenix, aunque sean de una sola línea. Por otro lado, me suena que existía una función fading(), así que puedes hacer frame en la pantalla así:
fade_on();
while (fading())
frame;
end
< - >
Ups, pues no parece ser fading() una función. ¿Quizá sea una variable global? ¿La he soñado o realmente estaba en el antiguo DIV?
el problema de fenix es que todos los procesos se ejecutan en paralelo. es decir intro empieza y sin esperar a terminar sigue ejecutando el hilo principal lueog se ejecuta juego.
yo creo que lo mas facil seria que te definieras una variable global que se llamara "intro_ejecutandose" y que la pusieras a true al entrar a intro() y a false al salir.
y que justo antes de la llamada a juego() pusieras un while (intro_ejecutandose) esperar, algo asi.
Aiken
Bueno, vamos por partes, empecemos por lo mas obvio:
Los que hayais estado en C o C++ (que son los que conozco) estais acostumbrados a usar llaves {} para definir el principio y el final de una instrucción, pues en Fenix el inicio lo da el propio nombre de la instrucción, y el final se da con END... y no hay soporte para una sola linea, por lo que tienes que ponerlo. Es como en la escuela: "cuando escribais una ecuación, aunque no haga falta, poned paréntesis, para que no haya errores".
Vamos con el fade: pues si, existe una variable global llamada FADING, que vale true cuando se está haciendo el fade, y false cuando no, así que para esperar se utiliza uno de los bucles más usados en este lenguaje:
While (fading) frame; end
Y por último tu problema con los procesos: es muy comun para gente acostumbrada a otros lenguajes querer llamar a los procesos uno tras otro sin pensar que en realidad es como ir lanzando programas que se siguen ejecutando hasta que se cierran (demonios, que lo llaman en Linux). Es por eso que se insiste en no pensar en que es un lenguaje "normal", no lanzamos procedimientos, lanzamos PROCESOS, y que para usarlos hay que coocer las SEÑALES.
Una solución sencilla sería usar funciones (FUNCTIONS) en lugar de procesos (PROCESS), porque congelan al padre hasta que termina, pero es una mala idea, porque teoricamente las funciones no pueden usar la orden FRAME ni usar variables locales (no mostrarian imagenes por pantalla).
Me estoy alargando, pero conviene saberlo. Vamos al meollo: para lanzar un proceso, esperar a que termine, y luego lanzar otro tienes que seguir estos pasos:
-El proceso padre debe llamar al nuevo proceso.
-Debes congelar/dormir al proceso padre.
-Terminar con el hijo y despertar al padre.
-El padre sigue su ejecución (llamando a otro proceso, por ejemplo).
Para esto se usan las señales, con la función SIGNAL. Bueno, te diré como lo hago yo, luego tu investigas un poco como va eso porque si no se hace muy largo. Tu proceso padre:
program pelota;
global
graficos;
begin
set_mode(320,240,16,MODE_FULLSCREEN);
define_region(0,0,0,320,240);
set_fps(60,0);
graficos=load_fpg("graficos.fpg");
write(0,0,0,0,"FPS:");
write_var(0,30,0,0,fps);
intro(); // logos
signal(id,s_sleep);
frame;
juego();
end
Signal va a enviar una señal ¿a quien? a id. ID es una variable local predefinida (la de cosas que se dicen con tres palabras XD) que guarda un numero que identifica al propio proceso (ningun otro proceso posee esta misma ID, puedes obtenerla tambien como el valor devuelto por un proceso al ser creado). ¿Qué señal? s_sleep, que es una constante que significa "dormir", el proceso se queda parado SIN MOSTRAR GRÄFICOS POR PANTALLA (aun así se pueden acceder a sus variables locales). Si lo que quieres es detenerlo y que se muestre su gráfico, entonces debes congelarlo con S_FREEZE en lugar de s_sleep.
El frame de despues es porque las señales sólo se mandan al terminar el frame actual (hubo versiones que lo hacían en ese momento, pero se decidió volver al sistema DIV original)
Luego, en el hijo (intro, en tu caso), antes del end final (o antes de salir, o al acabar, lo que quieras) debes despertar al proceso que lo ha llamado, o sea, al padre, con esta linea:
signal(father,s_wakeup);
Mandas una señal a father (variable local predefinida, que guarda la id del proceso que lo ha llamado, también hay otras como SON, BIGBRO, etc para referenciar el arbol). Esta señal es la de despertar (s_wakeup). No te olvides de poner el frame despues.
Con todo eso creo que ya está. El trabajar con procesos es un poco lioso al principio, pero luego se vuelve algo natural y con lo que no podrás vivir si te faltan. Los que hemos estudiado estructuras de computadores con sistemas con varios procesadores (al menos lo hice en la teoría XD) hemos visto este mismo sistema de comunicación, y los que hayan trabajado con Linux les sonará familiar, así que creo que no es descabellado recomendar que al menos se le de una oportunidad a esta forma de trabajar.
Fin del discurso :P
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.