funciones y procesos privados

Started by hokuto40, December 14, 2022, 04:32:01 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

hokuto40

Se pueden crear funciones y procesos privados de un archivo.
Es para separar el codigo de un proceso en diferentes funciones,pero quiero que esas funciones sean privadas de ese archivo y no se puede acceder a ellas desde fuera,solo desde el proceso de ese mismo archivo.

Es para tener el codigo dividido en diferentes partes,algo como los metodos de una clase.

panreyes

Estás pidiendo "namespaces" entonces, ¿cierto?

Hasta donde sé, todo el código incluido es global. Para proyectos complejos no ayuda mucho.

En el caso de eXplosive Dinosaurs lo resolví añadiendo un prefijo a todas las funciones, procesos y variables globales de cada minijuego.
Por ejemplo: masteroids_, mrobotcombat_, etc...

Otra posibilidad sería preparar una tool precompiladora: añades una linea como ésta
#namespace prefijo_

Y luego con la tool precompiladora:
- Copias todo el código a una carpeta temporal.
- De cada archivo de código, si hay prefijo:
+- Lees el nombre del namespace.
+- Eliminas la línea del namespace del código.
+- Averiguas los nombres de todos los PROCESS y FUNCTION
+- Añades el prefijo a todas las declaraciones de PROCESS y FUNCTION, y llamadas, del código de dicho archivo.

- Después compilas del código de dicha carpeta temporal.

Es algo de faena, pero no sería muy complicado supongo :)

hokuto40

Namespace no.
En lua si quieres que una funcion o variable sea privada de ese archivo con poner "local" delante esta hecho,creo que en c se usa la palabra "static" para que la funcion sea privada de ese archivo.

Pero tampoco veo problema solo tendria que poner un nombre dejando claro que es para ese proceso,por ejemplo:

Si el proceso se llama nave pues la funcion o metodo seria naver_mover(),aunque no hubiera estado mal que tuviera algo de esto bennugd,tal vez se podria añadir a bennugd 2.

SplinterGU

si, aunque no exactamente de esa forma, pero podes hacerlo con etiquetas, goto, gosub, call y return
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

hokuto40

Quote from: SplinterGU on December 25, 2022, 07:49:46 PM
si, aunque no exactamente de esa forma, pero podes hacerlo con etiquetas, goto, gosub, call y return

Me puedes poner un ejemplo de eso que comentas,nunca he usado etiquetas.

hokuto40

He buscado en el foro lo que comentaba SplinterGU de usar goto, gosub, call y return.Pero no encuetro nada que lo explique detalladamente para usarlo como sustituto a la falta de metodos,tampoco hay nada en el manual.

Si alguien me dice donde encontrar informacion detallada de esto con algun ejemplo.

SplinterGU

#6
Quote from: hokuto40 on January 04, 2023, 04:44:16 PM
He buscado en el foro lo que comentaba SplinterGU de usar goto, gosub, call y return.Pero no encuetro nada que lo explique detalladamente para usarlo como sustituto a la falta de metodos,tampoco hay nada en el manual.

Si alguien me dice donde encontrar informacion detallada de esto con algun ejemplo.

perdon la demora... ya te busco...

aca:

http://forum.bennugd.org/index.php/topic,4211.0.html
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

hokuto40

Ya estuve probando cosas aunque no se si estan bien,te lo muestro para que me digas si esta bien o hay algo a cambiar o hay mas cosas a usar.


import "mod_text"; //write
import "mod_video"; //setmode,setfps
import "mod_key"; //key
import "mod_proc"; //exit
import "mod_map"; //load fpg,load fnt

global
int graficos = 0,fuente = 0;
end

process main()
begin
set_mode(640,480,32);
set_fps(60,1);
graficos = load_fpg("graficos.fpg");
fuente = load_fnt("fuente.fnt");
Jugador();
loop
if(key(_esc))
exit("terminado");
end
frame;
end
end

//proceso jugador----------------------------
process Jugador()
private
int velocidad = 5;
end
begin
file = graficos;
graph = 1;
x = 320;
y = 400;
write_var(fuente,320,32,ALIGN_CENTER,velocidad);
loop
call mover_horizontal; //llamar etiqueta
call mover_vertical; //sustituye a funciones
frame;
end
//etiqueta
mover_horizontal:
if(key(_left))
x -= velocidad;
elseif(key(_right))
x += velocidad;
end
return; //salir de etiqueta,obligatorio

mover_vertical:
if(key(_up))
y -= velocidad;
elseif(key(_down))
y += velocidad;
end
return; //esto es para que funcione bien

end //fin proceso jugador-----------------------

SplinterGU

#8
lo veo perfecto! perdon por la demora, pero no recibi notificacion de esto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2