Problema con public

Started by Milton884, May 03, 2011, 12:59:09 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Milton884

Lei todos los topics, y el tutorial de Zaragoza de Public, pero en este codigo cuando intento ejecutar me dice que en la linea 44 hay un error: Unknown Identifier("DISPARANDO"). Y esta todo bien declarado la variable publica... dejo el codigo para que lo vean:
(es un tipico Matamarcianos el codigo, no terminado igualmente):

[code language="bennu"]PROGRAM matamarcianos;
   INCLUDE "DLL\import.prg";
   
GLOBAL
   int fpgGraficos;
   int posiciones[4]=(30,200,400,600,700);
   
PROCESS Main();
   private
      int i;
BEGIN
   set_mode(800,600,32,MODE_WINDOW);
   set_fps(50,0);
   rand_seed(time());
   fpgGraficos=load_fpg("FPG\Graficos.fpg");
   put_screen(fpgGraficos,4); //fondo
   nave();
   for(i=0;i<3;i++)
      marciano();
   end
END


PROCESS Disparo();
   private
      nave prota;
   BEGIN
      prota=get_id(type nave);
      graph=3;
      x=father.x;
      y=father.y;
      
      LOOP
         if(prota.disparando==1) //<--ACA ME TIRA ERROR
            y=y-10;
         end
         
         if(y<=0)
            prota.disparando=0;
            break; //destruimos el proceso de la memoria y de la pantalla.
         end
         
         frame;
      END
   END

PROCESS Marciano();

private
   int direccion; //1 hacia izq/ 2 hacia derecha
BEGIN
   file=fpgGraficos;
   graph=2;
   x=posiciones[rand(0,4)];
   y=50;
   direccion=2;
   
   LOOP
   
      
      if(direccion==2)
         x=x+4;
         if(x>=800)
            x=800;
            direccion=1;
         end
      else
         //si direccion es 1 (izquierda)
         x=x-4;
         if(x<=0)
            x=0;
            direccion=2;
         end
      end
      frame;
   END
END
   
   
PROCESS Nave();
   public
      int disparando;
      
      BEGIN
      //file=fpgGraficos;
      graph=1;
      
      x=200;
      y=550;
      
      
      LOOP
         if(key(_right))
            x=x+3;
         end
         
         if(key(_left))
            x=x-3;
         end
         
         if(key(_space))
            if(not(disparando))
               disparo();
               disparando=true;
            end
         end
         
         frame;
      END
   END[/code]



SplinterGU

escribe el proceso nave antes de el proceso que quiere acceder a la variable publica.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

O usa DECLARE con el nombre de la función, sus parámetros y la definición de sus variables públicas, antes del proceso que usa dicha variable. Es como la declaración de funciones de C, sólo que algo más completa.
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)

Milton884

Quote from: SplinterGU on May 03, 2011, 02:43:52 AM
escribe el proceso nave antes de el proceso que quiere acceder a la variable publica.

Si era eso. El orden de los procesos =) gracias.

De paso aprovecho para preguntar, como hacer para sin saber que procesos es el padre, tomarlo en la variable padre y usar sus propiedades publicas...

Yo hice esto, pero me tira un error: Undefinded procedure: FATHER.

PROCESS Disparo();

   BEGIN
      padre=type(get_id(father)); //sin saber que procesos es el padre, tomarlo en la variable padre y usar sus propiedades publicas...

                           ....

Drumpi

FATHER es una variable local prefedinida, almacena la ID del padre, para poder acceder a sus variables LOCALES (tales como FATHER.X, FATHER.GRAPH, FATHER.ALPHA y otras que definas tu).
Si quieres acceder a sus variables públicas, creo que tendrías que hacer lo siguiente:
1- crear una variable nueva, cuyo tipo sea el nombre del proceso padre.
2- Asignarle el valor de la variable FATHER.
3- Usar la nueva variable del mismo modo que usarías la variable FATHER para acceder a sus datos.

Ejemplo:

[code language="bennu"]
declare process padre ()
    public
        int mi_variable
end

(...)

process padre ()
begin
    (...)
    hijo();
    (...)
end

process hijo()
private
    padre su_id;
begin
    su_id=father;
    say(su_id.mi_variable);
    (...)
end
[/code]

Si no me he equivocado, más o menos eso debe ser.
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)

Milton884

Gracias! Ahora lo pruebo bien y te digo. Desde ya gracias.

Futu-block

eso de say de que vá?, que lo he visto en algunos sitios...

Rein (K´)ah Al-Ghul

Quote from: Futublock on May 03, 2011, 09:29:42 PM
eso de say de que vá?, que lo he visto en algunos sitios...
son salidas a consola, para visualizar informacion por ejemplo

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Drumpi

Envía una cadena de texto a la consola de comandos que la llamó, o en su defecto, al stdout.txt.
Viene de miedo para depurar, porque puedes ver en tiempo real lo que valen las variables sin tener que recurrir a write_loquesea (que también es recomendable).
Sobre todo es muy útil cuando el programa se cierra de golpe: te permite saber a qué partes del código se llega y te dice lo que valen las variables sin esperar a llegar al frame. Menos vistoso que la consola de depuración pero mucho más útil.
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)

Futu-block

aah migo, poco util lo veo por ahora...
tiempo al tiempo, je je