Lio en menús.

Started by oriun, December 08, 2010, 10:03:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

oriun

Buenas a todos y todas, otra vez.
Cuando terminé mi juego este que hay por ahí perdido me dije: "Es hora de hacer algo más grande", porque estoy como una cabra o porque tengo mucho tiempo libre, ya se verá.
El caso es que me metí de lleno a hacer un RPG, a lo grande.
Decidí que la forma más simple de realizar esta tarea es dividiendo por módulos el juego:combates, pjs, pnjs, objetos...
La principal dificultad en esto son los menús, sobre todo los del combate, porque tienes que mostrar la selección y las acciones anterior y posterior.
Mi código es:
PROCESS magia()
PRIVATE
int box;
int text[4];
string hechizos[4];
int a;
int b=1;
int c=2;
int d=3;
int e=4;
int resultado;
int avance;
int seleccion;
BEGIN
box=load_map("box.map");
status=1;
hechizos[0]="Bola de Fuego";
hechizos[1]="Bola de Hielo";
hechizos[2]="Relampago";
hechizos[3]="Ceguera";
hechizos[4]="Veneno";
put(0,box,208,100);
x=150;
y=100;
graph=menumap;
loop
if(seleccion==0) text[0]=write(0,210,100,4,hechizos[a]); text[1]=write(0,210,120,4,hechizos[b]); text[2]=write(0,210,140,4,hechizos[c]);  text[3]=write(0,210,60,4,hechizos[d]); text[4]=write(0,210,80,4,hechizos[e]);
frame;
delete_text ( text[0] ); delete_text ( text[1] ); delete_text ( text[2] ); delete_text ( text[3] ); delete_text ( text[4] );end// el if de 3 lineas arriba
if(key(_down) OR jkeys_state[_JKEY_DOWN])
if(seleccion==0)
a=a+1;
b=b+1;
c=c+1;
d=d+1;
e=e+1;
end
end
if(key(_up) OR jkeys_state[_JKEY_UP])
if(seleccion==0)
a=a-1;
b=b-1;
c=c-1;
d=d-1;
e=e-1;
end
end
if(key(_space) or jkeys_state[_jkey_b])
seleccion=1;
end
if(seleccion==1)
if(a==0)
graph=0;
screen_clear();
put(0,linea,160,200);
resultado=write(0,100,100,3,"Has lanzado Bola de fuego");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if(a==1)
graph=0;
screen_clear();
put(0,linea,160,200);
resultado=write(0,100,100,3,"Has lanzado Bola de hielo");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (a==2)
graph=0;
screen_clear();
put(0,linea,160,200);
resultado=write(0,100,100,3,"Has lanzado Relampago");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (a==3)
graph=0;
screen_clear();
put(0,linea,160,200);
resultado=write(0,100,100,3,"Has lanzado Ceguera");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (a==4)
graph=0;
screen_clear();
put(0,linea,160,200);
resultado=write(0,100,100,3,"Has lanzado Veneno");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
end
if(a==-1) a=4; end
if(a==5)a=0; end
if(b==-1) b=4; end
if(b==5) b=0; end
if(c==-1) c=4; end
if(c==5) c=0; end
if(d==-1) d=4; end
if(d==5) d=0; end
if(e==-1) e=4; end
if(e==5) e=0; end
if(key(_g) OR jkeys_state[_JKEY_L])
screen_clear();
put(0,linea,160,200);
status=0;
break;
end
end
END

Así, el programa tiene la funcionalidad que se le intenta dar, pero el asunto está en buscar una forma más simple de crear un menú.
La otra cosa del asunto es que para seleccionar una opción tengo que usar el if(a==x)tal;end, me hubiese gustado más usar if(a==0) tal;end if(b==0)tal;end... (espera, si se puede hacer, lo pondré mas abajo)
El problema va a venir cuando intente hacer la lista de hechizos más grande, que ,claro, tendria que repetir todos los pasos en cada hechizo, y para facilitarme la tarea, intentar encontrar un camino más simple lo considero fundamental.

Futu-block

ok borrando mensajes de agobio...

oriun

Claro, si es que desde que creo los .map y los .fpg programando en BennuGD, no hay quien me entienda, de hecho ni yo mismo me entiendo..

oriun

Ideas sobre el cambio del código.
Quote from: oriun on December 08, 2010, 10:03:02 PM

FUNCTION int posthechizo()
BEGIN
screen_clear();
put(0,linea,160,200);
END
PROCESS magia()
PRIVATE
int box;
int text[4];
string hechizos[4];
int a;
int b=1;
int c=2;
int d=3;
int e=4;
int resultado;
int avance;
int seleccion;
BEGIN
box=load_map("box.map");
status=1;
hechizos[0]="Bola de Fuego";
hechizos[1]="Bola de Hielo";
hechizos[2]="Relampago";
hechizos[3]="Ceguera";
hechizos[4]="Veneno";
put(0,box,208,100);
x=150;
y=100;
graph=menumap;
loop
if(seleccion==0) text[0]=write(0,210,100,4,hechizos[a]); text[1]=write(0,210,120,4,hechizos[b]); text[2]=write(0,210,140,4,hechizos[c]);  text[3]=write(0,210,60,4,hechizos[d]); text[4]=write(0,210,80,4,hechizos[e]);
frame;
delete_text ( text[0] ); delete_text ( text[1] ); delete_text ( text[2] ); delete_text ( text[3] ); delete_text ( text[4] );end// el if de 3 lineas arriba
if(key(_down) OR jkeys_state[_JKEY_DOWN])
if(seleccion==0)
a=a+1;
b=b+1;
c=c+1;
d=d+1;
e=e+1;
end
end
if(key(_up) OR jkeys_state[_JKEY_UP])
if(seleccion==0)
a=a-1;
b=b-1;
c=c-1;
d=d-1;
e=e-1;
end
end
if(key(_space) or jkeys_state[_jkey_b])
seleccion=1;
end
if(seleccion==1)
if(a==0)
graph=0;
posthechizo();
resultado=write(0,100,100,3,"Has lanzado Bola de fuego");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if(b==0)
graph=0;
posthechizo();
resultado=write(0,100,100,3,"Has lanzado Bola de hielo");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (c==0)
graph=0;
posthechizo();
resultado=write(0,100,100,3,"Has lanzado Relampago");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (d==0)
graph=0;
posthechizo();
resultado=write(0,100,100,3,"Has lanzado Ceguera");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
if (e==0)
graph=0;
posthechizo();
resultado=write(0,100,100,3,"Has lanzado Veneno");
frame;
delete_text(resultado);
avance=avance+1;
if (avance==50)
status=0;
seleccion=0;
break;
end
end
end
if(a==-1) a=4; end
if(a==5)a=0; end
if(b==-1) b=4; end
if(b==5) b=0; end
if(c==-1) c=4; end
if(c==5) c=0; end
if(d==-1) d=4; end
if(d==5) d=0; end
if(e==-1) e=4; end
if(e==5) e=0; end
if(key(_g) OR jkeys_state[_JKEY_L])
screen_clear();
put(0,linea,160,200);
status=0;
break;
end
end
END



blostec

#4
Mirando tu código no acabo de ver la utilidad de las variables a,b,c,d,e. Por lo que entiendo las utilizas para saber que hechizo se lanza.

Yo declararía una constante con el numero de hechizos disponibles y una tabla con los hechizos. Así para mostrar la lista de hechizos seria tan simple como usar un for. También usaría un booleano para saber si se ha seleccionado un hechizo a realizar. Mientras no se selecciona se recorre la lista de hechizos y cuando se selecciona ejecuta el switch para mostrar el hechizo lanzado.



   CONST
       max_hechizos=4;  //numero hechizos
   END;

   PRIVATE
string hechizos[4]="Bola de Fuego","Bola de Hielo","Relampago","Ceguera","Veneno";
       int i,pos_y;
       bool seleccion=false;
       ....

       pos_y=80;
       for (i=0; i < max_hechizos+1; i=i+1)
            pos_y=pos_y+20;
            text[i]=write(0,210,pos_y,4,hechizos[i]);
    frame;
       end;


     



blostec

De hecho no hace falta ningun switch para mostrar el hechizo, es mucho mas simple. Asumiendo que por defecto esta seleccionado el primer hechizo de la lista, luego cuando se mueve por la lista se controla que si se llega al ultimo elemento vuelva al inicio y viceversa. Una vez se pulsa la tecla para ejecutar el hechizo, se muestra por pantalla la opción escogida.


CONST
        max_hechizos=4;  //numero hechizos
END;

PRIVATE
        int text[max_hechizos];
        string hechizos[max_hechizos]="Bola de Fuego","Bola de Hielo","Relampago","Ceguera","Veneno";
        int i,pos_y;
        int hechizo_ataque;
        ataque;

BEGIN
        pos_y=80;
        for (i=0; i < max_hechizos+1; i=i+1)
            pos_y=pos_y+20;
            text[i]=write(0,210,pos_y,4,hechizos[i]);
            frame;
        end;

        hechizo_ataque=0;  //por defecto esta seleccionado el primero
        loop

         if(key(_down))
          if(hechizo_ataque==4)
                     hechizo_ataque=0;  //va al inicio
                  else
                     hechizo_ataque++;
                  end;
         end;

         if(key(_up))
                 if(hechizo_ataque==0)
                     hechizo_ataque=4;  //va al final
                 else
                     hechizo_ataque--;
                 end;
         end;

         if(key(_space))
                ataque=write(0,10,10,3,"Has lanzado "+hechizos[hechizo_ataque]);
                //write_var(0,10,40,3,hechizo_ataque);
                timer=0;
                repeat
                    frame;
                until (timer>=80);
        delete_text(ataque);
         end;

         if(key(_g) )
               screen_clear();
       //put(0,linea,160,200);
               break;
          end;
          frame;
        end;

END



oriun

#6
Muchas gracias Blostec, pero es que el For y yo no nos llevamos muy bien

oriun

Ya he probado tu ejemplo...
Eso viene bien cuando solo tienes 5 hechizos, pero de mi manera yo podía poner 50 hechizos simulando un scroll... ahora mismo te pongo un ejemplo y le hechas un vistazo.