como mejorar este menu de opciones

Started by chuflun, July 01, 2010, 02:39:31 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

chuflun

hola, a ver si alguien me puede ayudar a simplificar el codigo de este menu que sera el menu principal del juego.
tambien querria saber como hago para matar al proceso menu() y al resto de opciones despues de haber elegido una de ellas
gracias, 1 saludo a todos

Process menu()

Begin

titulo();
campeonato();
carrera();
cargar();
salir();

loop

frame;
End
End

//////////////////////////////////////////////////////
process titulo()

begin
file = fpg_menu;
graph = 1;
x = C_RESOLUCIONX/2;
y = 50;

loop
frame;
end
end

//////////////////////////////////////////////////////
process campeonato()

begin
file = fpg_menu;
graph = 2;
x = C_RESOLUCIONX/2;
y = 100;

loop

If (collision(type raton))
graph = 3;

If (mouse.left)
presentacion(1,0);

end
else
graph = 2;
end

frame;
end
end


//////////////////////////////////////////////////////
process carrera()

begin
file = fpg_menu;
graph = 4;
x = C_RESOLUCIONX/2;
y = 150;

loop

If (collision(type raton))
graph = 3;

If (mouse.left)
presentacion(1,0);

end
else
graph = 2;
end

frame;
end
end


//////////////////////////////////////////////////////
process cargar()

begin
file = fpg_menu;
graph = 5;
x = C_RESOLUCIONX/2;
y = 200;

loop

If (collision(type raton))
graph = 3;

If (mouse.left)
presentacion(1,0);

end
else
graph = 2;
end

frame;
end
end


//////////////////////////////////////////////////////
process salir()

begin
file = fpg_menu;
graph = 6;
x = C_RESOLUCIONX/2;
y = 250;

loop

If (collision(type raton))
graph = 3;

If (mouse.left)
presentacion(1,0);

end
else
graph = 2;
end

frame;
end
end

JMP

Si lo que quieres es matar todos los procesos con signal (all_process,s_kill) si solo quieres matar unos con
signal ( type nombre_proceso , s_kill )

Drumpi

Pues hay varias opciones para matar procesos: tienes let_me_alone, que mata a todos los procesos salvo al que usa esta función.
Pero la mejor es usar signal: cada vez que creas un proceso, este devuelve su ID, que puedes almacenar en una variable, por ejemplo:

int temp;
temp=titulo();

y luego puedes hacer un signal(temp,s_kill);

En este caso, te recomiendo que tengas una variable global (por ejemplo, menu_opcion) que valga 0, y en menu cambies
LOOP FRAME; END

por

While (menu_opcion==0)
frame;
end

Y luego que cada opción detecte si choca con el ratón, le hacen click y en ese caso, cambie menu_opcion por su valor. Acuérdate, en el menú, antes de hacer el while, de poner menu_opcion a cero, por si acaso.
Además, de esta forma, después del while puedes usar SWITCH/CASE para invocar el resto de funciones, no conviene que una parte del juego dependa de un proceso que va a morir, o del hijo o nieto del proceso que controla el juego entero.
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)

chuflun

muchas gracias por las respuestas tan utiles

pero entonces el codigo lo veis mas o menos bien asi?

Windgate

Mejor si subes el ejemplo completo y funcional a MediaFire o similar, además así vas guardando versiones para la posteridad ;)

Los códigos a simple vista pueden parecer correctos, pero es mejor verlos funcionando. Veo que usas por ahí algún FPG así que con el código sólo no vale para probar.

Por cierto, bienvenido, creo que es la primera vez que veo tu nick pero has estado posteando estos días :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Prg

#5
yo lo haría así:

[code language="bennu"]
Process menu()
private
var=0;
Begin
   objeto(fpg_menu,1,C_RESOLUCIONX/2,50);
   boton(fpg_menu,2,C_RESOLUCIONX/2,100,3,&var,1);
       boton(fpg_menu,4,C_RESOLUCIONX/2,150,3,&var,2);
       boton(fpg_menu,5,C_RESOLUCIONX/2,200,3,&var,3);
       boton(fpg_menu,6,C_RESOLUCIONX/2,250,3,&var,4);
       while (var==0)
              frame;
       end
       switch (var);
            case 1:
                ...
            end
          ...
       end
signal(id,s_kill_tree);         //lo mata a él y a los procesos que ha creado
End

//////////////////////////////////////////////////////
process objeto(file,graph,x,y)
begin
   loop
      frame;
   end
end

//////////////////////////////////////////////////////
process boton(file,graph1,x,y,graph2,pointer var,val)
begin
   loop
      
      If (collision(type raton))
         graph = graph2;
         If (mouse.left)
            *var=val;         
         end
      else
         graph = graph1;
      end
      frame;
   end
end

[/code]
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

chuflun

bueno pues aqui os dejo lo que tengo hasta el momento

http://www.mediafire.com/?zkjgjuak94o4sej

gracias windgate, por la bienvenida y por tus clases

Windgate

Arg, lo he probado pero no me compila, ni usando el .bat para compilar y ejecutar ni pulsando F6 desde el Notepad++

¿Cómo lo ejecutas tú?

Por cierto, no recordaba quién eras, ahora caigo, me alegro de verte por aquí de vuelta ;)
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

chuflun

a lo mejor es por la resolucion, a veces me ha pasado
yo lo hago con f6