Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Futu-block on March 04, 2011, 10:39:06 AM

Title: Public, primer intento...
Post by: Futu-block on March 04, 2011, 10:39:06 AM
Vale, tengo una variable que la quiero hacer publica para en otro proceso hacerle un switch

codigos:
[code language="bennu"]
declare process coco(x,y)
    public
        int pulsa ;
        int grafico = 1;
    end
end
process coco(x,y)
begin
    loop
        graph = grafico;
etc...[/code]

y en el nuevo proceso llamado animacion()
[code language="bennu"]
process animacion()
begin
    loop
        switch (pulsa)
            case 1:
                tal y cual;
            end
        end
        switch (pulsa)
            case 2:
                tal y cual;
            end
        end



etc...
[/code]

total, que me dá error y creo que el switch ese no está muy bien echo...
Title: Re: Public, primer intento...
Post by: Drumpi on March 04, 2011, 02:17:11 PM
Claro, como que no has definido pulsa en animación :D :D :D
En animación, para acceder a "pulsa" del proceso "coco" necesitas declarar primero una variable que almacene la ID del proceso "coco". Por ejemplo ID_COCO. Acceder a las variables públicas se hace de la misma forma que en una variable local, como X, Y, GRAPH...
Lo normal es que esa variable sea de tipo int, pero lo que hace diferente a las públicas es que dichas variables serán de un tipo especial, en concreto, el nombre del proceso (sin paréntesis).

O sea, que lo que te hace falta es declarar en "animación" la variable privada:

private
coco id_coco;

Luego almacenar la ID del proceso en cuestión (por ejemplo: id_coco=get_id(type coco); )

Y ya podrás acceder a pulsa usando "id_coco.pulsa".
Title: Re: Public, primer intento...
Post by: Fede on March 04, 2011, 02:19:46 PM
Exactamente no veo donde falla. Si te corre prisa pásame el código.

De todas formas ¿Por qué no metes los cases en el mismo switch?

Sería así (De la wiki):

switch ( <value> )
  case <value1>:
         // code1
  end
  case <value2>:
        // code2
  end
  default:
  // code3
  end
end

EDITO: Drumpi samadelantao.
Title: Re: Public, primer intento...
Post by: Futu-block on March 04, 2011, 03:01:05 PM
Quote from: Drumpi on March 04, 2011, 02:17:11 PM
Claro, como que no has definido pulsa en animación :D :D :D
En animación, para acceder a "pulsa" del proceso "coco" necesitas declarar primero una variable que almacene la ID del proceso "coco". Por ejemplo ID_COCO. Acceder a las variables públicas se hace de la misma forma que en una variable local, como X, Y, GRAPH...
Lo normal es que esa variable sea de tipo int, pero lo que hace diferente a las públicas es que dichas variables serán de un tipo especial, en concreto, el nombre del proceso (sin paréntesis).

O sea, que lo que te hace falta es declarar en "animación" la variable privada:

private
coco id_coco;

Luego almacenar la ID del proceso en cuestión (por ejemplo: id_coco=get_id(type coco); )

Y ya podrás acceder a pulsa usando "id_coco.pulsa".

lo de:
[code language="bennu"]private
coco id_coco;[/code]
no se ha de poner:
[code language="bennu" options="singleline"]coco = id_coco[/code]
en??




edito:
bueno, y en que se diferencia de global??, casi que prefiero global...
Title: Re: Public, primer intento...
Post by: osk on March 04, 2011, 05:10:46 PM
Hombre, una variable global sólo puede valer un valor único para todo el programa, una variable pública puede valer un valor diferente por cada proceso donde se haya definido.
Title: Re: Public, primer intento...
Post by: DCelso on March 04, 2011, 10:20:15 PM
Exacto, local sirve para no machacar el valor de la variable en distintos procesos, osea como las variables x, y, z, graph, file, etc.
cada proceso tiene su propio valor de la variable.

Global sirve para compartir información entre procesos desconociendo de quien procede o quien cambió su valor, simplemente sabiendo para qué sirve el valor, por ejemplo fullscreen o OS_ID.
Title: Re: Public, primer intento...
Post by: Drumpi on March 05, 2011, 01:23:51 AM
Quote from: Futublock on March 04, 2011, 03:01:05 PM
Quote from: Drumpi on March 04, 2011, 02:17:11 PM
Claro, como que no has definido pulsa en animación :D :D :D
En animación, para acceder a "pulsa" del proceso "coco" necesitas declarar primero una variable que almacene la ID del proceso "coco". Por ejemplo ID_COCO. Acceder a las variables públicas se hace de la misma forma que en una variable local, como X, Y, GRAPH...
Lo normal es que esa variable sea de tipo int, pero lo que hace diferente a las públicas es que dichas variables serán de un tipo especial, en concreto, el nombre del proceso (sin paréntesis).

O sea, que lo que te hace falta es declarar en "animación" la variable privada:

private
coco id_coco;

Luego almacenar la ID del proceso en cuestión (por ejemplo: id_coco=get_id(type coco); )

Y ya podrás acceder a pulsa usando "id_coco.pulsa".

lo de:
[code language="bennu"]private
coco id_coco;[/code]
no se ha de poner:
[code language="bennu" options="singleline"]coco = id_coco[/code]
en??

No, porque estás definiendo una nueva variable privada, de ahí el private.
La asignación de la ID del proceso te la he puesto después, con el get_id (puedes usar get_id o una variable donde la tengas almacenada, pero debes asignarla a la variable que yo he llamado id_coco, coco es el tipo de la variable id_coco, como te he dicho).

Quote from: Futublock on March 04, 2011, 03:01:05 PMedito:
bueno, y en que se diferencia de global??, casi que prefiero global...

Como dicen por arriba, una global es una única variable para todos los procesos, con una pública cada proceso tiene la suya, como pasa con las locales.
La diferencia con las locales es que TODOS los procesos tienen su propia variable, con las locals sólo los procesos de ese tipo (o con ese nombre, para que nos entendamos) tienen esa variable.
Title: Re: Public, primer intento...
Post by: DCelso on March 05, 2011, 10:52:11 AM
Quote from: Drumpi on March 05, 2011, 01:23:51 AM
Quote from: Futublock on March 04, 2011, 03:01:05 PM
Quote from: Drumpi on March 04, 2011, 02:17:11 PM
Claro, como que no has definido pulsa en animación :D :D :D
En animación, para acceder a "pulsa" del proceso "coco" necesitas declarar primero una variable que almacene la ID del proceso "coco". Por ejemplo ID_COCO. Acceder a las variables públicas se hace de la misma forma que en una variable local, como X, Y, GRAPH...
Lo normal es que esa variable sea de tipo int, pero lo que hace diferente a las públicas es que dichas variables serán de un tipo especial, en concreto, el nombre del proceso (sin paréntesis).

O sea, que lo que te hace falta es declarar en "animación" la variable privada:

private
coco id_coco;

Luego almacenar la ID del proceso en cuestión (por ejemplo: id_coco=get_id(type coco); )

Y ya podrás acceder a pulsa usando "id_coco.pulsa".

lo de:
[code language="bennu"]private
coco id_coco;[/code]
no se ha de poner:
[code language="bennu" options="singleline"]coco = id_coco[/code]
en??

No, porque estás definiendo una nueva variable privada, de ahí el private.
La asignación de la ID del proceso te la he puesto después, con el get_id (puedes usar get_id o una variable donde la tengas almacenada, pero debes asignarla a la variable que yo he llamado id_coco, coco es el tipo de la variable id_coco, como te he dicho).

Quote from: Futublock on March 04, 2011, 03:01:05 PMedito:
bueno, y en que se diferencia de global??, casi que prefiero global...

Como dicen por arriba, una global es una única variable para todos los procesos, con una pública cada proceso tiene la suya, como pasa con las locales.
La diferencia con las locales es que TODOS los procesos tienen su propia variable, con las locals private sólo los procesos de ese tipo (o con ese nombre, para que nos entendamos) tienen esa variable.
Title: Re: Public, primer intento...
Post by: Futu-block on March 05, 2011, 11:45:57 AM
vale, ya lo voy cogiendo, en vez de int uso el coco...

como me he puesto a otra cosa ya daré mas caña cuando me ponga a ello
Title: Re: Public, primer intento...
Post by: Drumpi on March 05, 2011, 08:12:07 PM
Quote from: DCelso on March 05, 2011, 10:52:11 AM
Quote from: Drumpi on March 05, 2011, 01:23:51 AM
Quote from: Futublock on March 04, 2011, 03:01:05 PM
Quote from: Drumpi on March 04, 2011, 02:17:11 PM
Claro, como que no has definido pulsa en animación :D :D :D
En animación, para acceder a "pulsa" del proceso "coco" necesitas declarar primero una variable que almacene la ID del proceso "coco". Por ejemplo ID_COCO. Acceder a las variables públicas se hace de la misma forma que en una variable local, como X, Y, GRAPH...
Lo normal es que esa variable sea de tipo int, pero lo que hace diferente a las públicas es que dichas variables serán de un tipo especial, en concreto, el nombre del proceso (sin paréntesis).

O sea, que lo que te hace falta es declarar en "animación" la variable privada:

private
coco id_coco;

Luego almacenar la ID del proceso en cuestión (por ejemplo: id_coco=get_id(type coco); )

Y ya podrás acceder a pulsa usando "id_coco.pulsa".

lo de:
[code language="bennu"]private
coco id_coco;[/code]
no se ha de poner:
[code language="bennu" options="singleline"]coco = id_coco[/code]
en??

No, porque estás definiendo una nueva variable privada, de ahí el private.
La asignación de la ID del proceso te la he puesto después, con el get_id (puedes usar get_id o una variable donde la tengas almacenada, pero debes asignarla a la variable que yo he llamado id_coco, coco es el tipo de la variable id_coco, como te he dicho).

Quote from: Futublock on March 04, 2011, 03:01:05 PMedito:
bueno, y en que se diferencia de global??, casi que prefiero global...

Como dicen por arriba, una global es una única variable para todos los procesos, con una pública cada proceso tiene la suya, como pasa con las locales.
La diferencia con las locales es que TODOS los procesos tienen su propia variable, con las locals private public sólo los procesos de ese tipo (o con ese nombre, para que nos entendamos) tienen esa variable.

;D
Title: Re: Public, primer intento...
Post by: DCelso on March 05, 2011, 09:36:40 PM
esas también. :D
Title: Re: Public, primer intento...
Post by: Futu-block on March 06, 2011, 08:44:44 AM
buf como te estas rallando, diyei
je je je
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 10:20:41 AM
bueno, dejemos la polladas que pa eso está mi blog, :D

al lio

Necesito que cada proceso nuevo se cree con sus nuevas variables en cuestion de direccion destino y final, si hago las variables globales cada vez que cree un nuevo proceso me hará cosas mu raritas  :o
he descubierto por fin la utilidad de  :o public

el proceso en cuestion es por ejemplo carro()
carro tiene los siguientes cosas dentro del parentesis: x, y, direccion, salida y llegada

entonces el proceso quedaria asi:
[code language="bennu"]
declare process carro(x, y, direccion, salida, llegada)
   public
       int direccion, salida, llegada;
   end
end

process carro(x, y, direccion, salida, llegada)
private

int direccion, salida, llegada;
carro id_carro; // esto ya lo endiendo perfect

begin
   id_fant1 = get_id (type fant1); //esto ahora mismo para el ejemplo igual no me sirve
   graph = tal y tal;
   loop
       tal y pascual...
[/code]

pues eso lo que no tengo claro,
declararlo lo tengo que declarar en el mismo proceso ¿no? eso lo tengo claro, creo
me falla porque estoy haciendo algo mal que no entiendo y es relacionado a las variables: direccion, salida, llegada de la tercera linea

que coñazo de public...
Title: Re: Public, primer intento...
Post by: Windgate on March 10, 2011, 10:56:43 AM
Aiva el copón...

No puedes tener variables public, private y parámetro de función con el mismo nombre todas :S

Pon un nombre a las public, aunque sea public_destino, a las private llámalas destino si quieres y a los parámetros ponles parametros_destino.

Ahora mismo no recuerdo porque hace meses que pelee duro con los public hasta controlarlos bien controlados, pero había problemas de ese tipo, recuerdo sobre todo que los parametros tuve que renombrarlos y luego hacer cosas como:

public_destino = parametro_destino;

Para ir recibiendo los valores.

¿Te has mirado mi tutorial de PUBLIC, no?  ---> http://trinit.es/temario/Tema%2039%20PUBLIC.pdf
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 03:30:01 PM
cienes y cienes de veces, volveré a intentarlo...
Title: Re: Public, primer intento...
Post by: Abram on March 10, 2011, 03:41:04 PM

[code language="bennu"]
global
int id_carro; //La ID del proceso la guardamos en un int normal y corriente
end

declare process carro(x, y, direccion, salida, llegada)
   public
       int direccion, salida, llegada;
   end
end

process main()
begin

    carro id_carro; // ESTO QUE YO RECUERDE NO ES CON LAS PUBLICAS, SINO CON LAS VARIABLES PROPIAS HECHAS CON TYPE
    id_carro= carro(blablabla); //creamos una instancia del proceso carro si queremos acceder a sus variables publicas se haria asi:
/*
id_carro.direccion=loquesea;
write(0,10,10,0,"La salida es: "+id_carro.salida);
*/
end

process carro(x, y, direccion, salida, llegada)
begin


begin

   graph = tal y tal;
   loop
       tal y pascual...
[/code]

No te lies, publica es otro tipo de variable, como privada, local, o global xD no puedes llamar a una privada igual que una publica, una publica no es mas que una privada que se puede modificar desde fuera de su mismo proceso :)
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 04:14:06 PM
gracias, aunque lo he solucionado mientras respondias (creo) te voy a dar un karma, ademas de porque mas o menos es así la solucion

yo he puesto esto:
[code language="bennu"]
declare process carro(x, y, direccion, salida, llegada)
   public
       int direccion_2, salida_2, llegada_2;
   end
end

process carro(x,y, direccion_2, salida_2, llegada_2)
private
int cualquier_otra_var;

begin
   direccion_2 = direccion;
        salida_2 = salida;
        llegada_2 = llegada;
   loop
      switch (direccion)
         case 1: if ( x < llegada) x+=2; else direccion = 2; end
         end
         case 2: if ( x > salida) x-=2; else direccion = 1; end
         end
         case 3: if ( y > salida) y-=2; else direccion = 4; end
         end
         case 4: if ( y < llegada) y+=2; else direccion = 3; end
         end
      end
      frame;
   end
end[/code]

y ha funcionado sin que me haya enterado de nada, cada carro creado ahora (he de decir que he creado una variable global 'id_carro') me crea con sus propias equis, ies griegas, direcciones, salidas y llegadas...

de lo poco que puedo deducir si mientras estoy escribiendo no me habeis puesto algo mas aclaratorio, es que para declarar hay que poner los parametros en el public mismamente declarado, y para asignar las variables publicas a otras variables habria que ponerlo (evidentemente) pero sin declarar...

o por lo menos eso he echo yo...
espero entenderlo con el tiempo y,o que no me digan porque si y se acabo :O
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 04:16:46 PM
esto deberia ser al reves

direccion_2 = direccion;
salida_2 = salida;
llegada_2 = llegada;
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 04:23:31 PM
si te refieres a:

direccion = direccion_2;
salida = salida_2;
llegada = llegada_2;

no me funciona asi...
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 04:27:15 PM
a ver, para que asignas al parametro de entrada una variable que no se seteo aun? y que ademas luego no usas.

por ejemplo, lo que estas haciendo es lo mismo que poner.

direccion_2 = 0;
salida_2 = 0;
llegada_2 = 0;

ya que

direccion, salida, llegada son publicas y como no tienen valor defecto, se inician a 0, cuando se crea la funcion.

y luego no usas ninguna de las direccion_2, salida_2, llegada_2 en el codigo, sino que le pisas el valor que viene de parametro apenas entra en la funcion.

como no te va a funcionar lo que digo? no deberia funcionarte tu ejemplo, por lo menos no de la forma aparentemente correcta, si lo que quieres es iniciar las variables en 0, y que sean publicas, pasa de los parametros de entrada.
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 04:30:51 PM
por otro lado, esto esta mal...

declare process carro(x, y, direccion, salida, llegada)
   public
       int direccion, salida, llegada;
   end
end

y si compila peor aun... por lo menos no recuerdo que declarandolo asi, las variables de parametro las tome como publicas.
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 04:33:52 PM
ya me estaba asustando, asi como esta el codigo que pegaste aca, no compila, la declaracion no puede tener variables de parametro y publicas con el mismo nombre.

lo probe y da error.
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 04:40:33 PM
A ver que revise, si no lo puedes resolver estamos en un gran problema...
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 04:42:02 PM
cuando digo, "da error", es algo bueno, porque lo que has escrito esta mal.

esta bien que de error.
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 04:49:38 PM
efectivamente jefe, copié malamente el codigo, debí haber usado el control+C y control+V
[code language="bennu"]
declare process carro(x, y, direccion, salida, llegada)
   public
       int direccion_2, salida_2, llegada_2;
   end
end

process carro(x,y, direccion_2, salida_2, llegada_2)
private
int cualquier_otra_var;

begin
        direccion_2 = direccion;
        salida_2 = salida;
        llegada_2 = llegada;
   loop
      switch (direccion)
         case 1: if ( x < llegada) x+=2; else direccion = 2; end
         end
         case 2: if ( x > salida) x-=2; else direccion = 1; end
         end
         case 3: if ( y > salida) y-=2; else direccion = 4; end
         end
         case 4: if ( y < llegada) y+=2; else direccion = 3; end
         end
      end
      frame;
   end
end[/code]
así queda, y ahora a modificar mi anterior mensaje y a comprender


aprendo aprendo aprendo...
Title: Re: Public, primer intento...
Post by: Rein (K´)ah Al-Ghul on March 10, 2011, 06:43:26 PM
Quote from: Futublock on March 10, 2011, 04:49:38 PM
efectivamente jefe, copié malamente el codigo, debí haber usado el control+C y control+V
[code language="bennu"]
declare process carro(x, y, direccion, salida, llegada)
    public
        int direccion_2, salida_2, llegada_2;
    end
end

process carro(x,y, direccion_2, salida_2, llegada_2)
private
int cualquier_otra_var;

begin
        direccion_2 = direccion;
        salida_2 = salida;
        llegada_2 = llegada;
   loop
      switch (direccion)
         case 1: if ( x < llegada) x+=2; else direccion = 2; end
         end
         case 2: if ( x > salida) x-=2; else direccion = 1; end
         end
         case 3: if ( y > salida) y-=2; else direccion = 4; end
         end
         case 4: if ( y < llegada) y+=2; else direccion = 3; end
         end
      end
      frame;
   end
end[/code]
así queda, y ahora a modificar mi anterior mensaje y a comprender


aprendo aprendo aprendo...
hay algo que no me queda en claro, porque en la declaracion del proceso y en la implementacion los ultimos tres parametros tienen nombres distintos?
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 07:05:00 PM
si, esto esta mal...


process carro(x,y, direccion_2, salida_2, llegada_2)
private
int cualquier_otra_var;

begin


que loco esto que hizo futu, lo malo es que funcione... pero evidentemente esta mas que mal.

la cosa es que la linea de declaracion de la funcion se ignora, solo se chequean los tipos, la funcion ya se creo previamente cuando se hizo el declare, en el momento de llegar a la funcion, solo se chequean cantidad de parametros y tipos, y no se vuelve a crear la funcion...

pero esta mal.
Title: Re: Public, primer intento...
Post by: SplinterGU on March 10, 2011, 07:33:30 PM
creo que funciona de casualidad, no deberia ser asi... futu cambia el prototipo de la funcion a como esta en la declaracion.
Title: Re: Public, primer intento...
Post by: Futu-block on March 10, 2011, 10:00:19 PM
prototipo? funcion? declaracion?
wow wow wow, no tan rapido que me está sonando a chino
ponmelo como si fuera tontino o algo asi, que ya sabes que soy mas bien torpe XD



Pd: sabes que tienes un byte de karmas?
Title: Re: Public, primer intento...
Post by: Drumpi on March 11, 2011, 04:01:25 AM
Futu, no te compliques:

[code language="bennu"]declare process carro(x, y, direccion, salida, llegada)
  public
      int direccion_2, salida_2, llegada_2;
  end
end

process carro(x,y, direccion, salida, llegada)
private
int cualquier_otra_var;

begin
      direccion_2 = direccion;
      salida_2 = salida;
      llegada_2 = llegada;
       loop
       switch (direccion_2)
          case 1: if ( x < llegada_2) x+=2; else direccion_2 = 2; end
          end
          case 2: if ( x > salida_2) x-=2; else direccion_2 = 1; end
          end
          case 3: if ( y > salida_2) y-=2; else direccion_2 = 4; end
          end
          case 4: if ( y < llegada_2) y+=2; else direccion_2 = 3; end
          end
       end
       frame;
       end
end[/code]

Y ya está, no puedes poner las públicas en la entrada de parámetros, porque en el declare, al escribir:

declare process carro(x, y, direccion, salida, llegada)

Ya estás creando "dirección", "salida" y "llegada", como variables PRIVADAS de tipo INT.

Aunque, Splinter, (esto, Futu, no lo leas o te vas a liar): tal como lo ha puesto Futu debería funcionar siempre que quitase las líneas:
direccion_2 = direccion;
salida_2 = salida;
llegada_2 = llegada;
Porque a mi manera de entender, en el declare crea las variables de tipo int, pero en la definición del proceso, lo que hace al poner las públicas en los parámetros, es asignar directamente los valores de entrada a las públicas (aunque entiendo que también puede crear un conflicto entre la declaración y la definición al usar privadas en un lado y públicas en otro, pero entiendo que el compilador es "inteligente" para darse cuenta de ello).
Title: Re: Public, primer intento...
Post by: SplinterGU on March 11, 2011, 04:59:43 AM
por el momento no se pueden asignar directamente por parametro variables publicas del mismo proceso, estoy pensando una forma de resolver eso.

por otro lado, en la proxima version, ya no se podra hacer esto de declarar diferente los nombres de los parametros y los nombres de la declaracion.
Title: Re: Public, primer intento...
Post by: Futu-block on March 11, 2011, 11:56:02 PM
Quote from: Drumpi on March 11, 2011, 04:01:25 AM
Futu, no te compliques...

[code language="bennu"]
aprendo aprendo aprendo...[/code]

Y ya está

Aunque, Splinter, (esto, Futu, no lo leas o te vas a liar): tal como lo ha puesto Futu debería funcionar siempre que quitase las líneas:
direccion_2 = direccion;
salida_2 = salida;
llegada_2 = llegada;

correcto, las he eliminado y sigue furulando (marcha bien) el juego...


Ahora bien, pasemos a un momento B de la cuestion public...


El caso (como comenté al inicio) es que que quiero una variable del primer proceso en el segundo proceso pasemos a eso de ''coco id_coco'' y ''var_alguna.coco'' y esas cosas...

vale, creo que lo he pillao tambien a base de probeteo, toca razonar...

aprendo aprendo aprendo...
Title: Re: Public, primer intento...
Post by: Drumpi on March 12, 2011, 01:19:30 AM
Como he dicho, a las public se accede igual que a las locals de un proceso: necesitas su ID en una variable, ya sea privada, global o usando FATHER, SON, etc... (imagina cómo accedes a las variables X, Y, o GRAPH de otro proceso).
La diferencia es que esa variable que contiene la ID del proceso con variables PUBLIC, no es de tipo INT, sino del tipo NOMBRE_DEL_PROCESO.
Title: Re: Public, primer intento...
Post by: Futu-block on April 02, 2011, 01:05:53 AM
chachos, ahora me sale un ''runtime error en enemigo(65546) - process 0 not active''

¿tiene que ver con lo public de lo que abuso ahora??
Title: Re: Public, primer intento...
Post by: SplinterGU on April 02, 2011, 04:15:44 PM
te falta un exists antes de querer acceder a un proceso, pero ahi estas queriendo acceder a un proceso el cual no creaste o no obtuviste su id.
Title: Re: Public, primer intento...
Post by: Futu-block on April 02, 2011, 05:21:00 PM
Ahí estamos amigo, resulta que creo un monton de disparos, cada disparo tiene un valor de una variable publica indicando la direccion del mismo, cuando le aplico la colision del enemigo usando el public.variable (pa que me entiendas, espero) me salta el error en cuestion.

Pienso que aqui falla la identificacion personal de cada proceso disparo() digo yo; para que cuando le ejecute el cambio de variable actue de una forma o de otra...
espero haberme explicado bien, sino te pongo un pseudo-codigo para que nos entendamos :D
[code language="bennu"]
proceso enemigo()...
begin y tal y tal

   loop
   switch (direcion_enemigo)
      case 4: // moviendose a la izquierda
         if ( x > desd)  // si no ha llegado al punto indicado
            x--;
            flags = 1;
         else
            dire = 8;
         end
         if (collision (type disparo)) and id_disparo.direccion_disparo == 4) /* Esta es la linea que me falla*/
            graph  = 602; animacion y tal y tal
         end
      case 8: // moviendose a la derecha
         if ( x < hasta) // si no ha llegado al punto indicado
            x++; // avanza
            flags = 0;
         else
            dire = 4; // mover a la izquierda
         end
      end
      end
   end

frame; y tal y tal
[/code]


pos eso, creo que me falta consultar algun dato en la linea que falla, algo de saber que disparo es el que colisiona con el enemigo para que sea ese disparo el que se destruya con la animacion pertinente.


conclusion, quiero saber en que direccion vá el disparo, por si colisiona con el enemigo en la misma direccion no le afecte el disparo

Title: Re: Public, primer intento...
Post by: SplinterGU on April 02, 2011, 05:36:23 PM
iddisparo vale 0 cuando haces esa comprobacion.
Title: Re: Public, primer intento...
Post by: Futu-block on April 02, 2011, 05:55:12 PM
espera un moment, quiero comprobar la variable publica ''id_disparo.direccion_disparo''
Title: Re: Public, primer intento...
Post by: SplinterGU on April 02, 2011, 11:27:15 PM
pero donde estas asignando id_disparo? si no le pones valor nunca vas a acceder a las variables...

lo que te esta diciendo el error es que id_disparo vale 0, y logicamente no existen procesos con id 0... lo que significa es que no le asignaste ningun valor.

ademas de eso, antes de hacer una comprobacion debes saber si el proceso aun esta vivo, y eso lo haces con exists.

esto que te esta pasando no solo es de las publicas, sino tambien de las locales.
Title: Re: Public, primer intento...
Post by: Futu-block on April 02, 2011, 11:53:03 PM
esperate, entonces hay que hacerle un exists y si existe preguntar el valor de la variable??
Title: Re: Public, primer intento...
Post by: Drumpi on April 03, 2011, 01:18:30 AM
Supongo que id_disparo guarda el id del proceso disparo con el que choca ¿no?
Pues no has hecho la asignación en ese código, COLLISION no te guarda el valor mágicamente en la variable que tu quieras :D
Una posible solución sería:

id_disparo=collision (type disparo);
if (id_disparo and id_disparo.direccion_disparo == 4) /* Esta es la linea que me falla*/
graph  = 602; animacion y tal y tal
end


Por cierto, esta línea no tiene sentido:
if (if collision (type disaro)) and id_disparo.direccion_disparo == 4)
El if del collision no hace nada y encima le falta un end ;D
Title: Re: Public, primer intento...
Post by: FreeYourMind on April 04, 2011, 12:12:33 AM
Pueden 2 procesos distintos tener una variable publica con el mismo nombre ?
Title: Re: Public, primer intento...
Post by: SplinterGU on April 04, 2011, 12:39:33 AM
si, pueden...
Title: Re: Public, primer intento...
Post by: Futu-block on April 04, 2011, 07:32:40 AM
Quote from: Drumpi on April 03, 2011, 01:18:30 AM
Por cierto, esta línea no tiene sentido:
if (if collision (type disaro)) and id_disparo.direccion_disparo == 4)
El if del collision no hace nada y encima le falta un end ;D
Quote from: rafiqui
-Correccion conozco a tu padre...(http://th44.photobucket.com/albums/f31/somethingfishy6/Icons/th_Rafiki.jpg)
vale, corregido :D



Quote from: Drumpi on April 03, 2011, 01:18:30 AM
Supongo que id_disparo guarda el id del proceso disparo con el que choca ¿no?
Pues no has hecho la asignación en ese código, COLLISION no te guarda el valor mágicamente en la variable que tu quieras :D
Una posible solución sería:

id_disparo=collision (type disparo);
if (id_disparo and id_disparo.direccion_disparo == 4) /* Esta es la linea que me falla*/
graph  = 602; animacion y tal y tal
end

ook, entons si guardo el 'indentificador de colision' en ·id_disparo· cuando le haga un if a este identificador me retornará un numero, al que le preguntaré la variable publica (id_disparo.direccion_disparo)

vale, a ponerlo en practica para terminar de aprender...
:D
Title: Re: Public, primer intento...
Post by: SplinterGU on April 04, 2011, 02:13:06 PM
el identificador siempre es un numero.
Title: Public, segundo intento
Post by: Futu-block on June 06, 2011, 04:42:32 PM
Vale, y como swicheo una x de cualquier otro proceso????

Title: Re: Public, primer intento...
Post by: SplinterGU on June 06, 2011, 10:34:29 PM
Quote from: Futublock on June 06, 2011, 04:42:32 PM
Vale, y como swicheo una x de cualquier otro proceso????



no entiendo la pregunta, el id de proceso no se puede cambiar, si lo cambias la cagas.
Title: Re: Public, primer intento...
Post by: Futu-block on June 07, 2011, 07:21:58 AM
no, he solucionado lo que queria porque era el hermano mayor del otro

lo que quiero de todas formas (que no me salia ultimamente, tengo que revisar un monton de codigo porque la estoy cagando por algun lado) es que un proceso le pregunta a otro donde está.

solo era eso, pero como lo he solucionado por lo pronto, olvidadlo
Title: Re: Public, primer intento...
Post by: Drumpi on June 12, 2011, 12:04:59 AM
Pues cuando llamas a un proceso nuevo, este te devuelve su ID:

variable_id=mi_proceso();

A partir de ahí puedes leer sus variables locales con:

variable_id.x=4;
variable_id.graph=7;
posición=variable_id.y;

Ojo, si "variable_id" es privada, sólo podrás acceder desde ese proceso, pero si es global, cualquier proceso podría cambiar o leer dichos valores ;)
Title: Re: Public, primer intento...
Post by: Futu-block on June 12, 2011, 09:06:01 AM
si, era global, pero para algunas cosas es mejor usar la gerarquia de los procesos
y hablando de gerarquia, para averiguar una variable distinta a la de las predefinidas (x, y, graph, etc) hay que hacerla publica...
¿se puede preguntar?
[code language="bennu" options="singleline"]father.variableB[/code]
Title: Re: Public, primer intento...
Post by: KeoH on June 12, 2011, 11:55:09 AM
Quote from: Futublock on June 12, 2011, 09:06:01 AM
si, era global, pero para algunas cosas es mejor usar la gerarquia de los procesos
y hablando de gerarquia, para averiguar una variable distinta a la de las predefinidas (x, y, graph, etc) hay que hacerla publica...
¿se puede preguntar?
[code language="bennu" options="singleline"]father.variableB[/code]

También la puedes hacer local
Title: Re: Public, primer intento...
Post by: SplinterGU on June 12, 2011, 04:00:51 PM
imagino que drumpi quiso decir local, porque blobal ya todos sabemos que se accede desde cualquier lado.
Title: Re: Public, primer intento...
Post by: Drumpi on June 13, 2011, 08:02:16 PM
No, global, hablo de un único proceso. En el momento que haya más procesos de ese tipo ya es necesario usar locales o públicas.

Futu: sólo se pueden leer desde fuera del proceso las variables GLOBALES, LOCALES y PÚBLICAS, ya se ha dicho varias veces, y es algo básico que suele salir en el primer o segundo tema de cualquier tutorial de DIV, Fenix o Bennu :D :D :D
Title: Re: Public, primer intento...
Post by: Futu-block on June 13, 2011, 08:42:25 PM
Ay omá...

digo que si se puede leer como
[code language="bennu" options="singleline"]father.variableB[/code]

o hay que poner el identificador:
[code language="bennu" options="singleline"]id_proceso.variableB[/code]
Title: Re: Public, primer intento...
Post by: KeoH on June 13, 2011, 09:58:38 PM
Quote from: Futublock on June 13, 2011, 08:42:25 PM
Ay omá...

digo que si se puede leer como
[code language="bennu" options="singleline"]father.variableB[/code]

o hay que poner el identificador:
[code language="bennu" options="singleline"]id_proceso.variableB[/code]

Claro q se puede usar father si lo llama el hijo de este ... y también el identificador si lo llama cualquier otro.
Title: Re: Public, primer intento...
Post by: Drumpi on June 14, 2011, 07:37:47 PM
Te repito: sí, se puede leer de ambas formas si id_proceso es un ID válido (el proceso existe) y "variableB" es LOCAL o PÚBLICA, porque si es PRIVADA NO.
Title: segundo intento
Post by: Futu-block on August 14, 2011, 10:11:58 PM
Estoy intentando modificar el alpha de un proceso a traves de otro, ¿se puede sin mas? o hay que hacer publica una variable y asignarsela a alpha????
Title: Re: Public, primer intento...
Post by: Drumpi on August 14, 2011, 11:59:38 PM
ALPHA ya es una variable local, viene predefinida en el lenguaje, por lo que sólo necesitas la ID del proceso para modificarla (y asegurarte previamente que el proceso con dicha ID aun existe ;)).
Title: Re: Public, primer intento...
Post by: Futu-block on August 15, 2011, 10:16:10 AM
perfect, tambien vale asignandola a una una variable publica...
Title: Re: Public, primer intento...
Post by: Drumpi on August 15, 2011, 06:21:15 PM
Si ya está declarada como local, no deberías poder crear otra variable con el mismo nombre (debería darte un error o como mínimo un warning).
Y aun así, sería redundante, o sea, ineficiente.
Title: Re: Public, primer intento...
Post by: Rein (K´)ah Al-Ghul on August 15, 2011, 06:39:17 PM
Futu (puedo llamarte futu? )
seria:

<IDDelProceso>.alpha = <valor>;

ahora la IDdel proceso puede estar guardada en una variable global u obtenida con alguna funcion como Get_ID
como por ejemplo, cuando haces
IDproceso = ProcesoRandom();

siendo IDproceso declarado como variable global
entonces haces desde
IDproceso.alpha = 100;
Title: Re: Public, primer intento...
Post by: Futu-block on August 15, 2011, 07:24:57 PM
Quote from: Drumpi on August 15, 2011, 06:21:15 PM
Si ya está declarada como local, no deberías poder crear otra variable con el mismo nombre (debería darte un error o como mínimo un warning).
Y aun así, sería redundante, o sea, ineficiente.

No, no tiene el mismo nombre, tiene otro distinto


Quote from: Rein (K´)ah Al-Ghul on August 15, 2011, 06:39:17 PM
Futu (puedo llamarte futu? )
por supuesto :D

Quote from: Rein (K´)ah Al-Ghul on August 15, 2011, 06:39:17 PM
seria:

<IDDelProceso>.alpha = <valor>;

ahora la IDdel proceso puede estar guardada en una variable global u obtenida con alguna funcion como Get_ID
como por ejemplo, cuando haces
IDproceso = ProcesoRandom();

siendo IDproceso declarado como variable global
entonces haces desde
IDproceso.alpha = 100;

vale, pero yo soy mu torpe, los simbolos <> ¿van o no van?

resumiendo: Lo que hay que hacer es guardar el identificador en una variable global donde se le acceda a traves del punto, ej: Var_global.var_a_modificar
Title: Re: Public, primer intento...
Post by: Rein (K´)ah Al-Ghul on August 15, 2011, 07:34:15 PM
los <> no van, es para indicar generico, debajo te puse un ejemplo

Quote from: Rein (K´)ah Al-Ghul on August 15, 2011, 06:39:17 PM
ahora la IDdel proceso puede estar guardada en una variable global u obtenida con alguna funcion como Get_ID
como por ejemplo, cuando haces
IDproceso = ProcesoRandom();

siendo IDproceso declarado como variable global
entonces haces desde
IDproceso.alpha = 100;

Quote from: Futublock on August 15, 2011, 07:24:57 PM
resumiendo: Lo que hay que hacer es guardar el identificador en una variable global donde se le acceda a traves del punto, ej: Var_global.var_a_modificar

exacto, pero solo puedes acceder a una variable local, es decir para hacer eso var_a_modificar tiene que estar declarada como LOCAL....
Title: Re: Public, primer intento...
Post by: Windgate on August 19, 2011, 01:46:56 AM
Ay Futu, Futu... ¿Seguiste mi tutorial o el manual de osk? Los <> sólo entran en condiciones aritméticas...
Title: Re: Public, primer intento...
Post by: Futu-block on August 19, 2011, 03:04:55 PM
es que soy mu torpe, como ya supongo que sabes, y que ahora en veranito estoy medio muerto (por no decir tonto del tó) :D
Title: Re:Public, primer intento...
Post by: Futu-block on August 15, 2012, 01:42:04 AM
Refloto este hilo porque no me aclaro...

Tengo varios procesos iguales al que llamaré nave(x,y,color,forma,direccion)  cada vez que creo uno nuevo le nombro como variable global nave0, nave1, etc en vez de usar un array, que me da igual pero como son pocos  ;)


a la hora de consultarle la variable publica color y forma me hago un lio, porque se supone que el proceso ya está identificado como nave0, nave1, etc... y no hace falta que le haga un get_id ¿no? digo yo


despues, la consulta if (nave0.colore == 4) me dá un error que no me reconoce la variable publica colore (en este caso) que es la publica no incluida en el proceso cuando es creado.


el proceso nave está importado arriba del proceso que lo crea, por si hay prioridad en lo de public, y la variable publica las llamo de diferente nombre porque si consulto con su nombre, seguro que da error...


¿como consulto entonces las variables publicas del mismo proceso pero con distinto nombre de variable?
Title: Re:Public, primer intento...
Post by: Rein (K´)ah Al-Ghul on August 15, 2012, 05:56:06 PM
seguro que "colore" es el mismo nombre que en el proceso nave?

arriba pusiste "color", y luego colore...
Title: Re:Public, primer intento...
Post by: Futu-block on August 15, 2012, 10:28:51 PM
claro porque es la variable publica, si consulto con color tampoco funciona...

aunque a partir de ahora a la variable publica colore le voy a llamar color_p
Title: Re:Public, primer intento...
Post by: SplinterGU on August 15, 2012, 11:26:03 PM
nave0 esta declarada como nave?

o sea,

global
nave nave0;
end

?
Title: Re:Public, primer intento...
Post by: Futu-block on August 15, 2012, 11:39:11 PM
si, pero como int dentro de global
bueno, no...
probando...
Title: Re:Public, primer intento...
Post by: SplinterGU on August 17, 2012, 02:50:58 PM
como int no va a funcionar.
Title: Re:Public, primer intento...
Post by: Futu-block on August 17, 2012, 11:31:01 PM
vale, ahora pasa otra cosa:

nombro en global como has dicho:

nave nave0;
nave nave1:
nave nave2;
nave nave3;

ya no tengo mas naves, a la hora de consultar la variable publica de la primera nave hago:

if (nave0.color_p == 1)...

y ahora me dá error en global (nave nave0; )

ahora bien, cada vez que creo un proceso nave hago:

nave0 = nave(x,y,color,forma,direccion);

no se porque pero me suena que le tengo que hacer un get_id por algun lado...
Title: Re:Public, primer intento...
Post by: SplinterGU on August 18, 2012, 01:42:25 AM
pon codigo...
Title: Re:Public, primer intento...
Post by: Futu-block on August 18, 2012, 10:18:40 AM
codigo de la colision, que ahí es donde la estoy cagando seguro:





      if (collision (type nave0))

         switch (nave0.color_p)
            case 3: x-= nave0.color_p; end
            case 4: x+=nave0.color_p; end
         end
      end





por lo demas todo correcto, fué añadirle la colision y cagarla pero ahora que he cambiado el nave0 por el nave no me reconoce que nave es











      if (collision (type nave))

         switch (nave0.color_p)
            case 3: x-= nave0.color_p; end
            case 4: x+=nave0.color_p; end
         end
      end

      if (collision (type nave))

         switch (nave1.color_p)
            case 3: x-= nave1.color_p; end
            case 4: x+=nave1.color_p; end
         end
      end
etc...









algo tengo que estar haciendo mal con esta colision, no se si asignarle una variable a cada colision (tampoco se hacer esto) y una vez que se confirme que sucede dicha colision ''eswichearle'' la variable publica para definir la direccion en este caso (la x)






ahora lo que me pasa es que al colisionar el personaje con la nave (plataforma que se desplaza) se desplaza en sentido de la primera plataforma, una cosa que parece imposible ya que cada variable publica tiene su proceso independiente: nave0 y nave1
Title: Re:Public, primer intento...
Post by: SplinterGU on August 18, 2012, 07:16:42 PM
nave0 no es type

si quieres colisionar con nave0, solo pon collision(nave0)
Title: Re:Public, primer intento...
Post by: Futu-block on August 18, 2012, 10:16:29 PM
odere, lo que hice al principio, pero como no me cuadraba por otro lao...


--0--


Nada, me dice que proceso 0 not active...



Title: Re:Public, primer intento...
Post by: SplinterGU on August 19, 2012, 12:12:06 AM
porque aun no esta asignado el id.

pon codigo completo si quieres una ayuda mas adecuada.
Title: Re:Public, primer intento...
Post by: Futu-block on August 19, 2012, 12:20:02 AM
¿te refieres al:
nave0 = get_id(type nave);

??
Title: Re:Public, primer intento...
Post by: gecko on August 19, 2012, 12:31:33 AM
http://wiki.bennugd.org/index.php?title=Public_variable

Leelo una segunda vez, mas tranquilo.
En el pequeño programita de ejemplo se entienden los conceptos de variables publicas.
Title: Re:Public, primer intento...
Post by: SplinterGU on August 19, 2012, 12:55:39 AM
Quote from: Futublock on August 19, 2012, 12:20:02 AM
¿te refieres al:
nave0 = get_id(type nave);

??

realmente no... pon el codigo y vemos que esta mal... has un codigo simple, a ver si detectas donde esta el problema.
Title: Re:Public, primer intento...
Post by: Futu-block on August 19, 2012, 10:35:41 PM
muy bien, empezemos con el proceso nave:






declare process nave(x,y,color,forma,direccion) // almaceno la direccion en una variable provisional
public
int color_p;
int direccion_p; // creo una variable publica para poder modificarla
end
end



process nave(x,y,color,forma,direccion) // almaceno la direccion en una variable provisional


begin
graph = forma;
x = 40;
y = 20;
direccion_p = direccion; // a la variable publica le asigno el valor de la variable provisional
loop
switch (direccion_p) // comprobamos la variable publica para actuar de forma determinada
case 1:
y--;
end
etc...









Todo esto dentro de un mismo proceso, al hacer publica la variable direccion lo que quiero es poder comprobarla desde el proceso protagonista, el cual al colisionar con nave se desplazará segun esta ultima.


El proceso nave es uno solo con multiples opciones para asi evitar hacer varios procesos iguales que varien en poca cosa


yo creo que eso es lo mas importante, aunque pongo el proceso colisionador, por lo menos la parte mas importante despues del loop






if (collision (nave0))
switch (nave0.direccion_p)
case 3: x-= color_p; end
case 4: x+= color_p; end
end
end



en este caso el color indica la velocidad de la plataforma


;)
Title: Re:Public, primer intento...
Post by: SplinterGU on August 19, 2012, 11:50:12 PM
si el declare lo tenes antes de la funcion que declara, no es necesario.

despues... si lo que queres es tomar color_p del proceso que colisiona, entonces el codigo esta mal

      if (collision (nave0))
         switch (nave0.direccion_p)
            case 3: x-= nave0.color_p; end
            case 4: x+= nave0.color_p; end
         end
      end

ahora si no es del proceso que colisiona, sino del que se esta ejecutando, esta bien como lo pusiste.

la verdad que poner esos trozos de codigo no sirven de nada para ayudarte, porque depende el orden de donde se escriben/declarar las funciones y donde se las llaman.
Title: Re:Public, primer intento...
Post by: Futu-block on August 20, 2012, 01:16:53 PM
vale, mas codigo:


El proceso main empieza con:




PROGRAM videojuego;


INCLUDE "DLL\import.prg";            //Incluye las DLL necesarias para que todo funcione
include "folder/globales.prg";
include " folder /nave.prg";
include " folder /protag.prg";
include " folder /enemigo.prg";




BEGIN
set_mode(320,240,32,MODE_window);
graficos = load_fpg(" folder /graficos.fpg");
controlador();
fondo();
durezas(); //estos estan provisionalmente en este .prg


// proceso controlador:



process fondo(); // sirve para mostrar la pantalla, y regular los enemigos NECESARIO




begin

x = 160;
y = 120;
z = 11;

loop
graph = pantalla + 100;
switch (protocolo_ejecucion)
case 30:
if (pone_enemigo == true)
switch (pantalla)
case 401:
enemigo(0,1,3,300,0,2);
enemigo(2,1,3,300,0,2);
enemigo(5,1,3,300,0,2);
enemigo(2,2,4,300,0,5);
enemigo(6,2,4,300,0,5);
enemigo(5,3,3,301,0,4);
enemigo(4,4,4,300,0,3);
end
case 402:
nave0 = nave(6,1,3,40,1);
nave1 = nave(6,2,4,40,2);
end
end
protocolo_ejecucion = 40;
end
end
end
frame;
end
end








end





pasemos al proceso globales, siguiente en la lista:



global


nave nave0;
nave nave1;
nave nave2;
nave nave3;
nave nave4;




int graficos;
int vidas;
int protocolo_ejecucion;
int pantalla;



siguiente  proceso es nave, asi que ya sabes como vá


siguiente es prota:


que lo primero que hace en el loop es comprobar si hay colision, si le anulo la colision no hay problem, si se la vuelvo a poner (segun esta ultima vez como lo has puesto) si hay, me dice que hay error con el proceso prota not active...


te mando los archivos por privado a ver que sale
Title: Re:Public, primer intento...
Post by: SplinterGU on August 20, 2012, 07:05:16 PM
bueno, he visto el codigo que me pasaste por privado, por suerte lo has hecho, porque el codigo que has posteado aca no mostraba el problema...

el problema es que creas al personaje (donde chequeas por los enemigos) antes que crear los enemigos (naves) y no tienes dentro del personaje ningun control por si los enemigos existen o fueron creados.

para serte sincero, creo que te estas complicando con la forma de la que lo estas haciendo...

simplemente crea procesos naves, y no guardes los ids, buscalos luego con getid o haz un collision type... ya si el collision te dio un id, ese id es que existe, no necesitas hacer un exists... ahora si haces un collision de una variable que tiene valor 0 (lo que te esta pasando ahora mismo) es como hacer un collision(process_all).
Title: Re:Public, primer intento...
Post by: Futu-block on August 20, 2012, 08:35:03 PM
bien, ya estoy mucho mas tranquilo y ahora lo comprendo muy bien
Antes es que lo estaba tocando con los ojos cerrados y no me enteraba de nada...

gracias jefe
Title: Re:Public, primer intento...
Post by: SplinterGU on August 20, 2012, 08:41:34 PM
me explique bien? jo, pense que lo habia enredado mas... :)

cualquier duda pregunta nuevamente.

y'r wellcome!
Title: Re:Public, primer intento...
Post by: Futu-block on August 21, 2012, 09:32:42 PM
si, te has explicao bien porque eso era lo que me temia, el orden de los procesos en relacion con las lecturas de las colisiones...