PDA

Ver la versión completa : [Programación] Fenix, ventanas con botoncitos y eso



Aiken
08/09/2009, 10:31
hola chicos,

antes de ponerme a hacer las tipicas ventanas con botoncitos ok - cancel para mi juego, me pregunto si hay alguna forma propia de fenix para hacer esto (no estoy usando bennu aun).

Me suena que habia una libreria GUI, pero no se si es para fenix o bennu, y tampoco necesito ventanas muy complicadas, solo ventana con alguna imagen y/o texto y un par de botones ok-cancel.

Respecto a esto se me ocurren dos cosas:
- que la ventana sea un proceso, y cada boton otro proceso que cuando recibe una colision del raton y un click sabe lo que hacer.

- en caso de ser un proceso, si el proceso ocupa toda la pantalla, tendre que pausar el resto de procesos para que la ventana sea el unico proceso que recibe colisiones del raton y del usuario mientras este abierta.

- botones, si son un proceso, hago un proceso diferente para cada boton, o hago un boton generico al que se le puede asignar un puntero a una funcion, de forma que todos los botones son el mismo tipo de proceso solo que apuntando a una funcion diferente?

Estoy pensando muy rudimentario o es asi com ose hace en fenix?
Aiken

animanegra
08/09/2009, 10:50
Splinter se curro una libreria para ello en bennu(unos cuantos prg y algunas imagenes que utilizaba). Pero amos entiendo que el cambio es casi directo, porque esta programada en el propio lenguaje. Andaba por el foro de bennu. Igual splinter te puede decir si puede haber algun problema a la hora de portar a fenix, pero supongo que no.

Hokutoy
08/09/2009, 12:05
Hombre la manera mas generica que me viene a la cabeza para hacer botones es crear un proceso con las siguientes condiciones:


Process boton(x,y,file,graph,z,respuesta);
loop
If(mouse.left)
If(collision(type mouse)) pregunta=respuesta; End
end
frame;
end

Con este cutre programa (rellena tu los flecos) creras un boton generico que al pulsar da la respuesta (si/no/o lo que le pongas) a una hipotetica pregunta global.
Es solo una idea.

La deteccion de colision la he dejado fuera del bucle principal (solo se comprueba cuando hacemos click al boton del mouse izquierdo) para que no tengas 15 botones en pantalla comprobando en cada frame si alguien colisiona con él o no. Para mejorar rendimiento.

Saludos

Aiken
08/09/2009, 12:39
Con este cutre programa (rellena tu los flecos) creras un boton generico que al pulsar da la respuesta (si/no/o lo que le pongas) a una hipotetica pregunta global.


mas o menos lo que habia pensado, solo que yo pensaba al boton pasarle un puntero a la funcion/handler del boton, es decir lo que tiene que hacer en caso de que le hagan click, pero esto ultimo tengo que estudiarlo mas, pues parece que se puede complicar.

Aiken

< - >

Splinter se curro una libreria para ello en bennu(unos cuantos prg y algunas imagenes que utilizaba).

me sonaba algo asi.
voy a buscar a ver si lo puedo utilizar/reutilizar o simplemente coger alguna idea de los prg.

Aiken

Drumpi
08/09/2009, 14:31
Me parece que con Fenix no puedes hace un puntero a una función, que lo más próximo es un switch que invoque a una función según un parámetro de la ventana (de hecho esto se añadió a una de las últimas versiones de Bennu). Pero si se puede, me gustaría que alguien me dijera cómo.
Si sólo vas a usar una ventana, ese método está bien, pero si vas a tener más de una y se superponen no estaría de más tener una variable global que especificase qué ventana tiene el foco, y que los botones la comprueben antes de ejecutar su código. Más que nada porque si vas a usar señales, tendrás que congelar a las ventanas y los botones que generan SIN afectar a las nuevas ventanas que genere, lo cual puede ser un lio.

El tema de ventanas y demás puede llegar a ser complicado por la propia naturaleza de Fenix (al menos, según mi experiencia) así que recomiendo una buena planificación antes de lanzarse.
Aun así, si que hubo una gui.dll, no estaba terminada pero era funcional. La pega es que hasta hoy nadie ha podido compilar una dll/so compatible con UFenix, y de hacerse me gustaría que me lo comentase.

Aiken
08/09/2009, 14:45
pero si vas a tener más de una y se superponen no estaría de más tener una variable global que especificase qué ventana tiene el foco, y que los botones la comprueben antes de ejecutar su código. Más que nada porque si vas a usar señales, tendrás que congelar a las ventanas y los botones que generan SIN afectar a las nuevas ventanas que genere, lo cual puede ser un lio.

con lo que llegamos a lo del foco ...

entonces pues, por ejemplo al "abrir" una ventana, lo primero que tengo que hacer es mandar un signal de freeze a todos los procesos del juego para que se paren, y ademas dejen de afectarles las colisiones (del raton por ejemplo, que es el unico que existira tambien en la ventana y no estara congelado) no?

y luego la ventana es un process que tendra botones (tambien process), que cuando les presionan rellenan una variable de la ventana que indica que boton se presiono, y segun eso hace unas cosas u otras no?


PD. Lo mismo me la curro y hago la ventana con drag&drop siguiendo el manual de Oscar :D
PD. O la hago semitrasparente, eso se hacia con el alpha y el blend o algo asi no?

Aiken

Drumpi
08/09/2009, 17:06
con lo que llegamos a lo del foco ...

entonces pues, por ejemplo al "abrir" una ventana, lo primero que tengo que hacer es mandar un signal de freeze a todos los procesos del juego para que se paren, y ademas dejen de afectarles las colisiones (del raton por ejemplo, que es el unico que existira tambien en la ventana y no estara congelado) no?

Básicamente si... o bien tener una variable local que indique su ID de foco, que es distinta para cada ventana, pero igual entre todos los botones asociados a ella. Así, al detectar el clic, primero comprobamos si la variable global "foco" coincide con la local y luego miramos la colisión (recordemos que collision es una función "lenta").
Pero si tienes un proceso gestor de señales y de procesos, no debería haber problema. Es cuestión de echarle imaginación.


y luego la ventana es un process que tendra botones (tambien process), que cuando les presionan rellenan una variable de la ventana que indica que boton se presiono, y segun eso hace unas cosas u otras no?

Si, o ejecutan la nueva función y mata a padres y hermanos, busca la sencillez.


PD. Lo mismo me la curro y hago la ventana con drag&drop siguiendo el manual de Oscar :D
PD. O la hago semitrasparente, eso se hacia con el alpha y el blend o algo asi no?

Aiken

Tiene narices que aun no me haya leido el manual de Osk entero :D:D:D
Pero si, la transparencia se puede hacer con flags=4 (transparencia al 50%), con la varible local predefinida alpha (transparencia entre 0 y 255), o con blendops, ordenados de menor a mayor consumo de recursos. Si quieres usar varios niveles de transparencia tienes dos opciones: usar varios mapas (porque no se si con blendops podrás hacerlo) o pasarte a bennu y usar el modo 32bits de color (que aparte de las componentes RGB se añade la componente ALPHA, como en los png).

No pretendo desanimar a nadie, sólo advertir que es un lenguaje concurrente, que las reglas normales de programación no funcionan. Son algunos de los problemas a los que se enfrentan los programadores con varias CPU o con la sincronización de procesos... sólo que aqui son más sencillos :D

XWolf
10/09/2009, 10:04
aqui tengo los fuentes del fenxedit 2, donde lo hacia

http://semitex.iespana.es/

Aiken
10/09/2009, 16:34
No pretendo desanimar a nadie, sólo advertir que es un lenguaje concurrente, que las reglas normales de programación no funcionan. Son algunos de los problemas a los que se enfrentan los programadores con varias CPU o con la sincronización de procesos... sólo que aqui son más sencillos :D

no has dicho nada demasiado grave para desanimar a nadie no? lo que has dicho es bastante entendible, otra cosa que luego hay que dedicarle un rato para implementarlo.

Aiken

Drumpi
10/09/2009, 17:57
Hombre, es lo que tiene Fenix:
Desarrollar un programa en que unas partes se duermen hasta que otras les manda los datos no es fácil de implementar, porque la ventana solapa a todos los procesos en pantalla, y no todo lo que hay en pantalla depende del mismo proceso ni está relacionado... por no hablar del estado en que esté (que a lo mejor hay alguno dormico y no podemos hacer un s_wakeup_tree).
Desarrollar un RTS (un age of empires, por ejemplo) es sencillo, porque haces clic en el edificio y se crea una nueva unidad que va a su bola, y no tienes que crear estructuras propias enlazadas por punteros y un sistema que se encargue de ejecutar las acciones que necesita cada bicho del juego.

La diferencia es abismal: es como comparar los juegos de lucha de ayer y hoy (ayer se necesitaban 40 grafistas para diseñar los 1000 sprites de los 15 golpes de cada luchador, hoy con un modelo 3D y un par de animadores se hace en nanosegundos).

SplinterGU
11/09/2009, 03:58
yo sugiero usar bennu, que tiene muchas cosas utiles como "signal ignores" y otras cosas

GameMaster
11/09/2009, 07:30
yo sugiero usar bennu, que tiene muchas cosas utiles como "signal ignores" y otras cosas

Eso es chicos, yo tambien sugiero que os tomeis las cañas en mi bar :)

juanjiviris
11/09/2009, 08:14
Eso es chicos, yo tambien sugiero que os tomeis las cañas en mi bar :)

Que mala leche.

GameMaster
11/09/2009, 09:37
Que mala leche.

Pero si lo dije de buena leche. No se, algo falla en mi spanglish. :brindis:

Drumpi
11/09/2009, 16:52
Es que la cosa está muy sensible con el tema de "autopublicitarse" en ciertos foros.
"Signal ignores": apuntado para revisión :P

SplinterGU
11/09/2009, 17:11
cuidado que esto no es autopublicitarse, sino comentar que cosas les pueden ser utiles ante un problema...

el caso en concreto es que podes poner procesos con signal ignore sobre la señal freeze y luego mandar la señal freeze a todos los procesos, de esta forma solo se congelaran aquellos que quieres que lo hagan (aquellos que no tienen signal ignore activado)

juanjiviris
11/09/2009, 18:33
Pero si lo dije de buena leche. No se, algo falla en mi spanglish. :brindis:

Pues perdón, es que lo entendí como "ya que hace publicidad, voy a meterme un poco con él"... sorry. :brindis:

GameMaster
11/09/2009, 23:16
Pues perdón, es que lo entendí como "ya que hace publicidad, voy a meterme un poco con él"... sorry. :brindis:

Como iba hablar mal de lo que ha echo realidad mis sueños, por fin tenemos un buen rendimiento en una plataforma que nos permite hacer de todo en la Wiz de forma sencilla y rápida [wei2]