Ver la versión completa : hola
hola,
nadie programa en Fenix o es que aqui no es donde hay que postear cosas de fenix?
Aiken
enkonsierto
22/08/2007, 01:16
imagino que todos postean en programacion directamente...
BUHOnero
22/08/2007, 01:16
Hola, yo programo en Fenix, que buscas?
Hola, yo programo en Fenix, que buscas?
hola compañero.
estoy siguiendo un tutorial de fenix y me acabo de quedar a cuadros con un tema de las variables locales.
ejemplo tipico: la vida de un personaje
proccess personaje()
private
int vida;
end
begin
end
como puedo modificar la vida desde otro proceso?
obviamente como es private no me deja, y pienso .. pues nada la declaro como local? public? no se.
el caso que leyendo el tutorial pone algo como que "las variables locales solo se pueden declarar en el proceso principal" [Ahhh]
me estais diciendo que en el caso de la "vida", si quiero modificarla desde otro proceso, obligatoriamente tiene que existir en todos los procesos (local en el processo principal, supongo que la heredan) incluso en los que no tienen vida??
si es la unica forma, me parece que destroza un poco el tema de la definicion de cada objeto con sus propiedades no? :(
PD. Por Dios decidme que se puede definir funciones "metodos" locales a cada proceso.
PD2. Quizas lo estoy interpretando mal, esta pensando en orientacion a objetos, y que cada processo era una instancia de un objeto, pero si no se puede definir propiedades locales y metodos locales, algo estoy interpretando mal :(
Aiken
platipus
22/08/2007, 02:29
que me corrijan si no estoy en lo cierto porque hace mucho que no toco el tema, pero creo que cuando creas un proceso, se devuelve un id
paco = personaje()
y luego creo que se puede acceder como paco.vida
a lo mejor estoy mezclando cosas pero me suena que alguna vez hice algo asi.
Por desgracia, las locales funcionan asi: se tienen que declarar para todos los procesos, aunque no las usen.
Existen dos alternativas. La primera es muy clara: usar variables globales. Es lo más recomendable sobre todo para el protagonista, ya que todo lo demas gira a su alrededor (el numero de vidas, el final de la partida, la posible ia de los enemigos...)
La segunda... bueno, es un poco más compleja: primero, debes usar una version de Fenix de las ultimas (creo que a partir de la 0.90), y segundo, debes saber usar variables publicas: las publicas son variables privadas que se pueden acceder desde fuera, pero para ello primero debes hacer una declaracion del proceso antes de todos los procesos y funciones que lo vayan a usar:
declare nombre-del-proceso (parametros)
public
<variables-publicas>
end //creo que es opcional
private //es obligatorio declarar las variables privadas (si las usas)
<variables-privadas>
end
end
Y por ultimo, cuando llames al proceso, no debes guardar el valor en un int, como es habitual, sino que debe ser una variable del tipo <nombre-del-proceso>. Por ejemplo, para tu proceso personaje() deberias declarar la variable así:
personaje mi_variable;
mi_variable=personaje(); //una forma de llamar al proceso
Parecen muchas cosas, pero desde luego te ahorras mucha memoria (aunque en los ordenadores de hoy dia, 100 procesos con una variable tipo int son solo 400 bytes frente a 1GB o los 32MB de la GP2X (solo usando media memoria). Si quieres pasar la id de este tipo de procesos a otros, existe un truquito, pero no quiero cargarte con demasiada informacion para empezar ;)
Los métodos locales no se lo que son, pero piensa que estos son procesos, hilos "independientes" de ejecucion, como lo son los distintos programas que funcionan en Linux (pero sin interrumpirse entre ellos en mitad de la ejecucion). Es una filosofia distinta de programacion: en lugar de ser secuencial es concurrente (aunque no lo sea en la practica).
< - >
Respondiendo a Platipus, si: así es cómo se acceden a las variables locales de la froma habitual, siendo paco una variable de tipo int.
Parecen muchas cosas, pero desde luego te ahorras mucha memoria (aunque en los ordenadores de hoy dia, 100 procesos con una variable tipo int son solo 400 bytes frente a 1GB o los 32MB de la GP2X (solo usando media memoria).
mi problema es que estoy usando esto para el Proyecto Final de Carrera. Y no creo que a los profesores les guste mucho que las variables locales se definan en el proceso principal, pues rompe un poco demasiado el modelo de Orientacion a Objetos.
El metodo del declare me gusta mas, es mas ortodoxo con la Orientacion a Objetos al menos. Lo probare. En que version de fenix funciona esto?
En cuando a las funciones metodos locales me refiero a:
objeto coche() {
method cambiar_ruedas();
method llenar_gasolina();
}
Es decir funciones (metodos) que van dentro del objeto coche y saben manipular el coche. es decir el "interface" de la clase coche.
Sabes si esto se puede hacer en fenix?
Aiken
SilentSei
22/08/2007, 12:43
Es decir funciones (metodos) que van dentro del objeto coche y saben manipular el coche. es decir el "interface" de la clase coche.
Sabes si esto se puede hacer en fenix?
Aiken
Yo por lo poco que sé no se puede, pero es que Fénix no es un lenguje O.O al uso. Su función es la de mover gráficos de forma sencilla y rápida y que hay más rápido que no tener que estar declarando variables para cada cosa?
BUHOnero
22/08/2007, 12:55
mi problema es que estoy usando esto para el Proyecto Final de Carrera. Y no creo que a los profesores les guste mucho que las variables locales se definan en el proceso principal, pues rompe un poco demasiado el modelo de Orientacion a Objetos.
El metodo del declare me gusta mas, es mas ortodoxo con la Orientacion a Objetos al menos. Lo probare. En que version de fenix funciona esto?
En cuando a las funciones metodos locales me refiero a:
objeto coche() {
method cambiar_ruedas();
method llenar_gasolina();
}
Es decir funciones (metodos) que van dentro del objeto coche y saben manipular el coche. es decir el "interface" de la clase coche.
Sabes si esto se puede hacer en fenix?
Aiken
Como muy bien ha dicho SilenSei, la cosa es muy simple en Fenix, supongo que se puede liar mucho, pero yo no lo uso para lo que programo, te comento lo que si se puede hacer, y que se usa.
Se trata de llamar a un proceso dentro de otro, esta manera de llamar a los procesos te crea una pirámide de dependencias, o sea, si desde dentro de coche() llamas a poner_gasolina(), desde el proceso poner_gasolina() puedes acceder a las variables de coche escribiendo: father.variable_a_modificar
Supongo que se entiende, yo no lo he usado así, pero supongo que funcinará, se usa por ejemplo para hacer algo parecido a una serpiente con difenretes partes del cuerpo, llamas a cada parte dentro de un proceso padre(la cabeza de la serpiente), y a los hijos (partes del cuerpo) les vas asignando las variables x e y del father (cabeza).
Saludos
DMusta1ne
22/08/2007, 13:09
Corregidme si me equivoco, pero no se puede utilizar para eso también las funciones?, es decir, en vez de llamar a otro proceso desde un proceso, llamar a una función desde un proceso. Se que hay funciones en fenix similares a las funciones de C, lo que no se es si al llamarlas desde otro proceso se puede acceder a las variables de dicho proceso desde la funión :P
BUHOnero
22/08/2007, 13:13
Corregidme si me equivoco, pero no se puede utilizar para eso también las funciones?, es decir, en vez de llamar a otro proceso desde un proceso, llamar a una función desde un proceso. Se que hay funciones en fenix similares a las funciones de C, lo que no se es si al llamarlas desde otro proceso se puede acceder a las variables de dicho proceso desde la funión :P
En Fenix yo no diferencio funciones de procesos, todo es igual, solo cambia que si tiene un graph asignado y un frame enseñará algo, sino nada, en verdad Fenix es simplisimo, siempre son Process lo_que_sea()
coche escribiendo: father.variable_a_modificar
creo que para eso hay que definir las variables dentro del proceso y como public no?
Asi deberia funcionar no? es que estoy en el curro y no tengo para probarlo :)
proccess miprocesohijo()
public
int variable1;
end
begin
end
proccess procesopadre()
private
int idhijo1;
end
begin
idhijo1 = miprocesohijo();
idhijo1.variable1 = 10;
end
Aiken
< - >
En Fenix yo no diferencio funciones de procesos, todo es igual, solo cambia que si tiene un graph asignado y un frame enseñará algo, sino nada, en verdad Fenix es simplisimo, siempre son Process lo_que_sea()
para mi gusto eso es simplificar demasiado. la idea es que un proceso se algo con entidad propia que tiene un tiempo de vida y tal.
una funcion estrictamente entendido es un calculo que devuelve un resultado.
aunque lo mismo internamente las funciones de fenix, sean un proccess que no pinta y que no tiene loop es un poco sacrilego decir que una funcion y un proceso es lo mismo. :)
En otros lenguajes decir que una funcion y un procedure es lo mismo pues bueno es menos sacrilego, pero en fenix que los procesos son casi procesos en el sentido unix de la palabra es mas sacrilego de lo normal jeje :D
Aiken
BUHOnero
22/08/2007, 16:53
creo que para eso hay que definir las variables dentro del proceso y como public no?
Asi deberia funcionar no? es que estoy en el curro y no tengo para probarlo :)
proccess miprocesohijo()
public
int variable1;
end
begin
end
proccess procesopadre()
private
int idhijo1;
end
begin
idhijo1 = miprocesohijo();
idhijo1.variable1 = 10;
end
Aiken
Debería funcionar, pero no hace falta declararlas como public, si no me equivoco cualquier variable está disponible diciendo solo idhijo1.variable1, aunque tendrás que probarlo, ya te digo que es lo que me parece, yo no lo he usado así nunca.
Y lo de diferneciar funciones de procesos... he estudiado y usado unos cuantos lenguajes de programación, y sé que son cosas diferentes, que es un sacrilegio, etc etc... pero en Fenix todo esto esta diluido, y todo se resume en hacer procesos, que pueden devolver algo o pintar en pantalla, y puedes llamarles como quieras, pero todos se llaman como process :)
Bueno, así uso yo Fenix, que tampoco puedo asegurartelo, ya que nunca uso funciones propiamente :D
Saludos
No, rotundamente no: una funcion y un proceso son distintos.
Un proceso es una instancia que se ejecuta de forma concurrente y que puede tener un gráfico asociado.
Una funcion es una instancia que solo se ejecuta dentro de un frame y que no tiene variables locales (aunque en versiones posteriores a la 085 se les haya dado la posibilidad de tener frame en su codigo y variables locales), es más, una funcion CONGELA al proceso que lo ha llamado hasta que finaliza su ejecucion y opcionalmente devuelve un valor.
Y si, entre procesos se pueden acceder a sus variables, pero solo a las locales y, a partir de la 087 (no lo tengo muy claro, de la 085 a la 090 salieron todas en un mes XD), a las publicas. Es mas, todos los procesos tienen una serie de variables locales predefinidas para acceder a los miembros más cercanos del arbol de dependencias como son:
father: contiene la id del proceso que ha llamado a este, es decir, el padre.
son: devuelve la id de un proceso que ha creado este (un hijo). Creo que para acceder a los demás debes ir llamandola varias veces sin hacer frame en medio, porque volvería al primer hijo.
brother, bigbro, smallbro: creo que tambien existen, pero como no las uso pues no se si realmente son esas, ya os imaginais para que sirven ^^
Tambien existe la variable local ID que contiene la id de ese proceso (el valor que se devuelve cuando se invoca a dicho proceso)
Y respecto a procesos Fenix y procesos Unix, bueno, tienen muchas similitudes, pues al diseñar el lenguaje (vease DIV games studio) se basaron en la forma de manejar Unix: tienen diversos estados, se pueden mandar señales, se manejan de forma concurrente... pero obviamente no son iguales. Pero es mas cómodo para segun que juegos:
Un AoE podria tener un proceso cuartel congelado, al hacer clic en el se le descongela, el empieza a hacer una cuenta atrás, mientras otros mueven soldados, balas, etc. Al acabar la cuenta, crea otro proceso soldado (que se moverá por su cuenta) y se vuelve a congelar. Imaginaos esto en C++: tendríais que hacer una estructura soldado, meterlo en una lista enlazada y llamar al procedimiento soldado tantas veces como nodos haya en dicha lista...
Debería funcionar, pero no hace falta declararlas como public, si no me equivoco cualquier variable está disponible diciendo solo idhijo1.variable1
las tenia declarada en el proceso, como private y no me dejo.
tu que las declaras sin poner private ni nada? o que pones?
Aiken
BUHOnero
22/08/2007, 18:08
las tenia declarada en el proceso, como private y no me dejo.
tu que las declaras sin poner private ni nada? o que pones?
Aiken
Bueno, primero decir que Drumpi tiene razón en todo :brindis: y que yo simplemente comento lo que uso, la verdad es que muchas cosas de Fenix se me escapan porque no las uso, o lo hago de cualquier otra manera :)
Ahora a tu pregunta, es una mezcla de Drumpi y lo que te comenté, en mi caso siempre que he usado este sistema ha sido para acceder a una variables locales predefinidas de cada proceso (normalmenta la 'x' y la 'y' del proceso padre), por eso con otras variables no puedo asesorarte, tendría que probarlo :S
Yo uso variables globales (por ejemplo para las vidas) y así tengo esas variables disponibles en cualquier parte del codigo.
Yo lo que hago siempre es declarar una o dos variables locales genéricas; al fin y al cabo, cualquier proceso que haga un cálculo por sencillo que sea, necesita una o dos variables, y teniendo locales genéricas, pueden usarse en lugar de declarar privadas a propósito.
La unicas variables a las que tienes acceso mediante id_proceso.variable; son las locales (ya sabes que van declaradas al principio del programa para todos los procesos) y las publicas.
Las variables privadas no son accesibles desde fuera del proceso... Bueno, hay un trapicheo raro que quizas si te deje, porque aparte de pasar el valor como parámetro para otro proceso/funcion, podrías pasar la direccion de memoria de la variable (usando "offset variable" o "&variable") y que dicho prceso/funcion reciba un puntero del tipo de esa variable (por ejemplo, para una variable int deberías recibir "int pointer otra_variable")
Pero esto tiene dos pegas: una, para eso ya existen las variables publicas, y dos, que como muera el proceso y accedas a dicha variable, estaras accediendo a una parte de la memoria que ya no esta asignada y que valdrá cualquier cosa.
Recuerda esto siempre: accesibles desde cualquier proceso: globales, locales y publicas, y solo por el propio proceso: privadas.
Los punteros, causa y a la vez solución de todos los problemas... ...lo malo es que todavía no he visto que hayan solucionado nada XDDDDDD.
es más, una funcion CONGELA al proceso que lo ha llamado hasta que finaliza su ejecucion y opcionalmente devuelve un valor.
como era de esperar, jeje. ya solo faltaba tener funciones concurrentes jeje :D
Aiken
< - >
Un AoE podria tener un proceso cuartel congelado, al hacer clic en el se le descongela, el empieza a hacer una cuenta atrás, mientras otros mueven soldados, balas, etc. Al acabar la cuenta, crea otro proceso soldado (que se moverá por su cuenta) y se vuelve a congelar. Imaginaos esto en C++: tendríais que hacer una estructura soldado, meterlo en una lista enlazada y llamar al procedimiento soldado tantas veces como nodos haya en dicha lista...
yo lo que quiero hacer notar, que la imagen que tiene Fenix (al menos para profanos) es que es un lenguaje de programacion facil para gente que no sabe programar.
pues para los que no saben programar no se. pero a mi que llevo años programando me ha costado cogerle el aire multiproceso concurrente, no se si en realidad es mas facil para aprender como primer lenguaje. Lo cierto es que posiblemente veras mas rapidamente algun jueguillo hecho por ti por loque te puede motivar ... pero en realidad es mas complejo.
de hecho me parece un lenguaje superpotente, con el que con un poco de imaginacio se pueden hacer cosas que con otros lenguajes serian muchas horas y lineas de codigo.
Pero para el que quiera aprender a programar con Fenix: aprendera algo que no es programacion muy tradicional, si algun dia tiene que programar tradicionalmente le costara un poquito cambiar el chip ;)
pero para juegos no esta mal. :)
Aiken
< - >
Yo lo que hago siempre es declarar una o dos variables locales genéricas; al fin y al cabo, cualquier proceso que haga un cálculo por sencillo que sea, necesita una o dos variables, y teniendo locales genéricas, pueden usarse en lugar de declarar privadas a propósito.
jeje eso ya son trucos del cocinero jeje :)
Aiken
< - >
Los punteros, causa y a la vez solución de todos los problemas... ...lo malo es que todavía no he visto que hayan solucionado nada XDDDDDD.
me has recordado a Merovingio el de Matris :D
Aiken
< - >
Por cierto ya me funcionan las variables publicas de los procesos!!!! :D :brindis:
eso si he tenido que pasarme a 0.93 :)
creo que las GP solo soportan 0.84, bueno hasta que Puck porte el ultimate fenix jeje :)
Aiken
Claro, Fenix lo definen erroneamente como un lenguaje orientado a hacer videojuegos, pero en realidad es un lenguaje orientado a gráficos (o a multimedia si añadimos lo facil que es que suene música), y a mi, personalmente me da rabia.
Yo conocí a uno que programaba en DIV1 y decia que cuando acababa un juego no parecía que lo hubiese hecho él... y yo llevo meses peleandome con motores de tiles, ficheros, punteros... y solo he terminado un crap-game, un par de herramientas y una demo.
Y es que ahi esta: en Fenix yo he hecho un editor de mapas de tiles, y un editor de "novelas gráficas" llamado Venturer, y hay una persona haciendo un entorno de desarrollo similar al de DIV para Fenix. Por eso digo que vale para algo mas que para juegos.
Lo bueno es que obtienes resultados inmediatos o a corto plazo, la pega es su "cambio de filosofia"... pero gracias a ello he aprendido mucho del funcionamiento de Sistemas Operativos, ordenadores multiprocesadores, hardware...
"causa y a la vez solución de todos los problemas" ¿No lo decía Homer refiriendose al alcohol en aquel capítulo sobre la ley seca? (el del "Barón de la birra") XD
:brindis::brindis::brindis::brindis::brindis:
-minipunto y punto para el equipo de los Drumpis, la cita era de Homer
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.