PDA

Ver la versión completa : No tira mi primer "juego" Fénix en GP2X



masteries
22/03/2008, 21:47
Muy buenas señores!

Como os dije, después de comprarme la GP2X F200 iba a experimentar con el lenguaje Fénix(me encanta la cantidad de funciones que ya vienen hechas..jeje) y he realizado mi primer jueguecillo en Fénix, a petición de mi hermana un juego de cálculo mental, bastante sencillito...tuve que invertir un par de tardes en hacerlo aunque es muy simple y puede que no muy optimizado, pero yo estoy muy acostumbrado a los microcontroladores tanto antiguos como ARM y cambiar el chip a esto de hacer frames...pues como que había que aprenderlo.

El caso es que en el PC tira todo lo bien que puede,(no he podido hacer un antirebote del teclado respetable, por eso de lo de ejecutarlo a 12 cuadros por segundo, que truño...jajaja)
pero en la GP2X con el Fénix beta 4 instalado se queda negro y a continuación vuelve al menú de la consola. En el PC tengo instalado el Fénix Pack(el más reciente) y el fénix 092a instalado dentro de la carpeta bin que es donde se encuentra el fxi.exe y demás; los que traia el fénix pack los quité y puse en su lugar el 092a por lo que decís de la compatibilidad a nivel de .dcb

Os pongo el código para que le hecheis un vistazo(las teclas creo que van bien, o al menos eso he visto en algún sitio) el modo "time attack" aún no está hecho:




PROGRAM DRMATES; //By Masteries 20/3/2008
GLOBAL //un juego de cálculo mental para
operandoA = 0; //GP2X
operandoB = 0;
resultado = 0;
introducido = 0;
byte select = 1;
byte decision = 0;
byte n = 25;
byte e = 0;
byte indice = 0;
byte operacion = 0;
byte pico = 15;
byte posicion = 10;
byte posicion_previa = 10;
byte dato[5];
byte fallos = 0;
byte aciertos = 0;
Begin
for(e=0;e<6;e++)
dato[e]=0;//inicializacion del array
end;
e = 0;
set_fps(12,0);//12 frames por segundo
SET_MODE(m320x240);//resolucion de la GP2X
LOAD_FPG("drmates.FPG");//fichero 0
clear_screen();
fade_off();
fade_on();
put_screen(0,1);//dibujado del fondo del menu
//codigo del menu
repeat
delete_text(all_text);
set_text_color(0);
write(0,155,155,1,"NORMAL");//texto 1
write(0,155,170,1,"TIME ATTACK");//texto 2
write(0,155,185,1,"SALIR");//texto 3
if(select==1)
set_text_color(n);
write(0,155,155,1,"NORMAL");
end;
if(select==2)
set_text_color(n);
write(0,155,170,1,"TIME ATTACK");
end;
if(select==3)
set_text_color(n);
write(0,155,185,1,"SALIR");
end;
e += 1;
if(e>2)
n += 1;
e = 0;
end;
if(n>95)
n = 25;
end;
if(key(_up))
switch (select)
case 1:
select=3;
end;
case 2:
select=1;
end;
case 3:
select=2;
end;
default:
select=select;
end;
end;
end;
if(key(_down))
switch (select)
case 1:
select=2;
end;
case 2:
select=3;
end;
case 3:
select=1;
end;
default:
select=select;
end;
end;
end;
if(key(_enter))//tecla start GP2X
switch (select)
case 1:
decision=1;
end;
case 2:
decision=2;
end;
case 3:
decision=3;
end;
default:
decision=0;
end;
end;
end;
FRAME;
until(decision!=0);//fin del menu




//comienzo del juego en sí
if(decision==1)
//ha decidido juego normal
delete_text(all_text);
clear_screen();
load_pal("drmates2.FPG");//cambiamos la paleta de color
LOAD_FPG("drmates2.FPG");//fichero 1
fade_off();
fade_on();
put_screen(1,1);
drawing_map(0,background);//seleccionamos el gráfico 1 para dibujar sobre el
//dibujado del fondo de juego
//dibujado de los numeros
set_text_color(45);//buen color
drawing_color(180);
draw_circle(45,206,10);//fix lo de que al principio no halla circulo rojo
juego_normal();
repeat
if(key(_alt))//tecla B en GP2X
timer[0]=0;//inicializacion del timer
comprobacion();
loop
FRAME;//para que se vea el mensaje de correcto o incorrecto
if(timer[0]>120)
break;
end
end
juego_normal();
end;
escritura();
teclado();
FRAME;
until(key(_space));//tecla SELECT en GP2X

end;

if(decision==2)
//ha decidido juego time attack
delete_text(all_text);
clear_screen();
load_pal("DRMATES2.FPG");//cambiamos la paleta de color
LOAD_FPG("DRMATES2.FPG");//fichero 1
fade_off();
fade_on();
put_screen(1,1);//dibujado del fondo de juego

end;

unload_fpg(0);//descargar la libreria 0 y la 1
if(decision>0)//verificamos si realmente se cargó en memoria
unload_fpg(1);
end;
exit("Nos vemos!!!",0);

end;



PROCESS juego_normal();
PRIVATE
byte valido = 0;
BEGIN
valido = 0;
operacion=rand(1,4);//elige la operacion a realizar 1-suma 2-resta
if(operacion==1)//es una suma
operandoA=rand(1,256);
operandoB=rand(1,256);
end;
if(operacion==2)
repeat
operandoA=rand(1,256);
operandoB=rand(1,256);
if(operandoA>operandoB)
valido=1;
end;
until(valido==1);//espera a que el resultado de la resta sea positivo
end;

if(operacion==3)
operandoA=rand(1,128);
operandoB=rand(2,13);
end;

if(operacion==4)
repeat
operandoA=rand(1,128);
operandoB=rand(2,10);
resultado=operandoA/operandoB;
if(resultado>0)
valido=1;
end;
until(valido==1);
end;

switch(operacion)
case 1:
resultado=operandoA+operandoB;
end;
case 2:
resultado=operandoA-operandoB;
end;
case 3:
resultado=operandoA*operandoB;
end;
case 4:
resultado=operandoA/operandoB;
end;
end;
indice = 0; //reset de valores
introducido = 0;


end;



PROCESS teclado();

BEGIN
if(key(_right))
posicion += 1;
if(posicion==20)
posicion=10;
end;
end;
if(key(_left))
posicion -= 1;
if(posicion==9)
posicion=19;
end;
end;


if(posicion_previa!=posicion)//vemos a ver si ha cambiado
drawing_color(180);//color para el circulo
switch (posicion)
case 10:
draw_circle(45,206,10);
end;
case 11:
draw_circle(69,206,10);
end;
case 12:
draw_circle(93,206,10);
end;
case 13:
draw_circle(116,206,10);
end;
case 14:
draw_circle(143,206,10);
end;
case 15:
draw_circle(167,206,10);
end;
case 16:
draw_circle(194,206,10);
end;
case 17:
draw_circle(221,206,10);
end;
case 18:
draw_circle(243,206,10);
end;
case 19:
draw_circle(269,206,10);
end;
default:
end;
end;

drawing_color(215);//blanco
switch (posicion_previa)//para borrar el circulo anterior
case 10:
draw_circle(45,206,10);
end;
case 11:
draw_circle(69,206,10);
end;
case 12:
draw_circle(93,206,10);
end;
case 13:
draw_circle(116,206,10);
end;
case 14:
draw_circle(143,206,10);
end;
case 15:
draw_circle(167,206,10);
end;
case 16:
draw_circle(194,206,10);
end;
case 17:
draw_circle(221,206,10);
end;
case 18:
draw_circle(243,206,10);
end;
case 19:
draw_circle(269,206,10);
end;
default:
end;
end;
posicion_previa=posicion;
end;
//tecla A en GP2X
if(key(_control)) //introduccion del valor elegido
dato[indice]=posicion-10;//to do, mejorar el truño este
if(indice==0 && posicion!=10)
introducido=dato[indice];
end;
if(indice==1)
introducido=dato[indice-1]*10;
introducido=introducido+dato[indice];
end;
if(indice==2)
introducido=dato[indice-2]*100;
introducido=introducido+(dato[indice-1]*10);
introducido=introducido+dato[indice];
end;
if(indice==3)
introducido=dato[indice-3]*1000;
introducido=introducido+(dato[indice-2]*100);
introducido=introducido+(dato[indice-1]*10);
introducido=introducido+dato[indice];
end;
if((indice==0 && posicion!=10) || (indice>0))//evitar un fallo con el numero cero
indice += 1; //cuando el indice es cero
end;
end;

write(0,40,125,1,introducido);//muestra por pantalla el valor introducido
//hasta el momento
end;


PROCESS comprobacion();
BEGIN
if(resultado==introducido)
set_text_color(45);//vuelta al color normal
write(0,150,103,1,"CORRECTO!");
aciertos += 1;
else
set_text_color(180);//color rojo, te has equivocado
write(0,150,103,1,"INCORRECTO!");
write(0,150,113,1,resultado);//muestra el valor que era
fallos += 1;
end;
end;


PROCESS escritura();
BEGIN
delete_text(all_text);
set_text_color(45);//vuelta al color normal
write(0,275,26,1,"MODO");//texto 1
write(0,275,41,1,"NORMAL");//texto 2
write(0,275,61,1,"ACIERTOS");
write(0,275,71,1,aciertos);//también funciona sin ser write_int pero sin pasarle la dir
write(0,275,81,1,"FALLOS");
write(0,275,91,1,fallos);
write_int(0,38,30,1,&operandoA);//texto 4
if(operacion==1)
write(0,38,45,1,"+");//texto 5
end;
if(operacion==2)
write(0,38,45,1,"-");//texto 5
end;
if(operacion==3)
write(0,38,45,1,"x");//texto 5
end;
if(operacion==4)
write(0,38,45,1,"/");//texto 5
end;
write_int(0,38,60,1,&operandoB);//texto 6
end;



A ver si me podeis ayudar, gracias tíos!!

He observado otra cosa, con la instalcion del fénix en pc como os he dicho, no me tiran los juegos fénix para gp2x que hay en la web...¿qué sucede? que alguien me lo explique y cuanto antes mejor...

hardyx
22/03/2008, 23:42
Yo soy m&#225;s de C++ y no he tocado el Fenix, pero revisa si has colocado los ficheros gr&#225;ficos que est&#225;s cargando, en la misma carpeta del programa. Tambi&#233;n los juegos f&#233;nix necesitan un script del tipo "tujuego.gpe" para llamar al int&#233;rprete FXI. Aseg&#250;rate que tienes el int&#233;rprete en la carpeta tambi&#233;n.

./fxi ./tujuego.dcb

Revisa esto, y si sigues teniendo problemas me puedes mandar el .dcb y te lo pruebo con el Cradle a ver si saca alg&#250;n mensaje de error en la consola.

P.D. Para poner c&#243;digo en el foro se usa la etiqueta CODE en avanzado, as&#237; sale tabulado y se lee mejor.

masteries
23/03/2008, 17:31
Gracias a Hardyx ya está solucionado, el problema era que el programa en Fénix buscaba los documentos .fpg en mayúsculas y yo los había metido en la SD en minúsculas, en windows funcionaba, pero en linux no porque distingue entre mayúsculas y minúsculas.

A partir de ahora a emplear minúsculas en todas partes.


En cuanto implemente una función de borrado del número introducido y algún sonidillo lo publico en la web; para el modo time attack tendreis que esperar un poco más.