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...
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".
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.
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...
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.
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.
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.
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.
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
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
esas también. :D
buf como te estas rallando, diyei
je je je
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
publicel 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...
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
cienes y cienes de veces, volveré a intentarlo...
[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 :)
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
esto deberia ser al reves
direccion_2 = direccion;
salida_2 = salida;
llegada_2 = llegada;
si te refieres a:
direccion = direccion_2;
salida = salida_2;
llegada = llegada_2;
no me funciona asi...
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.
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.
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.
A ver que revise, si no lo puedes resolver estamos en un gran problema...
cuando digo, "da error", es algo bueno, porque lo que has escrito esta mal.
esta bien que de error.
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...
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?
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.
creo que funciona de casualidad, no deberia ser asi... futu cambia el prototipo de la funcion a como esta en la declaracion.
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?
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).
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.
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...
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.
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??
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.
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
iddisparo vale 0 cuando haces esa comprobacion.
espera un moment, quiero comprobar la variable publica ''id_disparo.direccion_disparo''
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.
esperate, entonces hay que hacerle un exists y si existe preguntar el valor de la variable??
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
Pueden 2 procesos distintos tener una variable publica con el mismo nombre ?
si, pueden...
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
el identificador siempre es un numero.
Vale, y como swicheo una x de cualquier otro proceso????
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.
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
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 ;)
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]
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
imagino que drumpi quiso decir local, porque blobal ya todos sabemos que se accede desde cualquier lado.
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
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]
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.
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.
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????
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 ;)).
perfect, tambien vale asignandola a una una variable publica...
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.
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;
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
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....
Ay Futu, Futu... ¿Seguiste mi tutorial o el manual de osk? Los <> sólo entran en condiciones aritméticas...
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
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?
seguro que "colore" es el mismo nombre que en el proceso nave?
arriba pusiste "color", y luego colore...
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
nave0 esta declarada como nave?
o sea,
global
nave nave0;
end
?
si, pero como int dentro de global
bueno, no...
probando...
como int no va a funcionar.
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...
pon codigo...
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
nave0 no es type
si quieres colisionar con nave0, solo pon collision(nave0)
odere, lo que hice al principio, pero como no me cuadraba por otro lao...
--0--
Nada, me dice que proceso 0 not active...
porque aun no esta asignado el id.
pon codigo completo si quieres una ayuda mas adecuada.
¿te refieres al:
nave0 = get_id(type nave);
??
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.
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.
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
;)
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.
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
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).
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
me explique bien? jo, pense que lo habia enredado mas... :)
cualquier duda pregunta nuevamente.
y'r wellcome!
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...