Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Melow on May 01, 2010, 05:01:02 PM

Title: Ayuda porfavor
Post by: Melow on May 01, 2010, 05:01:02 PM
Como puedo saver si en un punto determinado de mi pantalla ay algun objeto imbocado?? existe algo como collision pero ke le puedas dar el punto que tu quieras??

un saludo y gracias por vuestra ayuda
Title: Re: Ayuda porfavor
Post by: scuws on May 01, 2010, 06:49:32 PM
crea un function que tenga unas coordenadas y si esas coordenadas coinciden...
FUNCTION comprobar()
BEGIN
    x = 200; //Aquí poner las coordenadas x del punto que quieres comprobar
    y = 200; //Aquí poner las coordenadas y del punto que quieres comprobar
    IF (collision (type algo)) //En algo con lo que quieres comprobar si coincide
    ...
    END
END
Title: Re: Ayuda porfavor
Post by: Drumpi on May 01, 2010, 07:02:28 PM
Ojo, collision sólo funciona si ambos procesos tienen un gráfico asignado, por lo que necesitarías un gráfico de un pixel (si le pones el alpha a 0 no se verá).
Title: Re: Ayuda porfavor
Post by: scuws on May 01, 2010, 07:08:14 PM
es verdad, se me habia pasado, quedaria asi,

FUNCTION comprobar()
BEGIN
     x = 200; //Aquí poner las coordenadas x del punto que quieres comprobar
     y = 200; //Aquí poner las coordenadas y del punto que quieres comprobar
     graph = 4; // Aquí poner uno de un pixel
     flags = 8;
     IF (collision (type algo)) //En algo con lo que quieres comprobar si coincide
     ...
     END
END
Title: Re: Ayuda porfavor
Post by: Drumpi on May 02, 2010, 02:22:11 AM
Cambiando "flags=8" por "alpha=0", está perfecto.
Title: Re: Ayuda porfavor
Post by: Melow on May 02, 2010, 07:56:28 AM
gracias por la ayuda. se me avia ocurrido esta noche consultandolo con la almuada una cosa muy parecida :D
Title: Re: Ayuda porfavor
Post by: Melow on May 02, 2010, 03:46:19 PM
al intentar matar un proceso me dice "ERROR: Runtime error in NIVEL1(65540) - Process 65543 not active"
PROCESS nivel1 ( )

private
int cua1;
int cua2;
int cua3;

BEGIN

cua1 = cuadrado(1,0,3);
cua2 = cuadrado(3,0,3);
cua3 = cuadrado(5,0,3);

barrera(4,8);

LOOP

IF ((( cua1.x == cua2.x + 20) && ( cua1.x == cua3.x - 20)) || (( cua1.x == cua2.x - 20) && ( cua1.x == cua3.x + 20)))
signal(get_id(type cuadrado), S_KILL);
END

IF ((( cua2.x == cua1.x + 20) && ( cua2.x == cua3.x - 20)) || (( cua2.x == cua1.x - 20) && ( cua2.x == cua3.x + 20)))
signal(get_id(type cuadrado), S_KILL);
END

IF ((( cua3.x == cua2.x + 20) && ( cua3.x == cua1.x - 20)) || (( cua3.x == cua2.x - 20) && ( cua3.x == cua1.x + 20)))
signal(get_id(type cuadrado), S_KILL);
END

FRAME;
END
END


me podeis explicar que me pasa y porque no mata el proceso que me gustaria matar.

gracias
Title: Re: Ayuda porfavor
Post by: Melow on May 02, 2010, 03:59:20 PM
tambien e probado con   signal(cua1, S_KILL);
y me da el mismo error
Title: Re: Ayuda porfavor
Post by: Mr Matsusaka on May 02, 2010, 08:54:14 PM
En vez de
[code language="bennu"]      IF ((( cua1.x == cua2.x + 20) && ( cua1.x == cua3.x - 20)) || (( cua1.x == cua2.x - 20) && ( cua1.x == cua3.x + 20)))
         signal(get_id(type cuadrado), S_KILL);
      END
      
      IF ((( cua2.x == cua1.x + 20) && ( cua2.x == cua3.x - 20)) || (( cua2.x == cua1.x - 20) && ( cua2.x == cua3.x + 20)))
         signal(get_id(type cuadrado), S_KILL);
      END
      
      IF ((( cua3.x == cua2.x + 20) && ( cua3.x == cua1.x - 20)) || (( cua3.x == cua2.x - 20) && ( cua3.x == cua1.x + 20)))
         signal(get_id(type cuadrado), S_KILL);
      END[/code]
prueba
[code language="bennu"]      IF ((( cua1.x == cua2.x + 20) && ( cua1.x == cua3.x - 20)) || (( cua1.x == cua2.x - 20) && ( cua1.x == cua3.x + 20)))
         signal(cua1, S_KILL);
      END
      
      IF ((( cua2.x == cua1.x + 20) && ( cua2.x == cua3.x - 20)) || (( cua2.x == cua1.x - 20) && ( cua2.x == cua3.x + 20)))
         signal(cua2, S_KILL);
      END
      
      IF ((( cua3.x == cua2.x + 20) && ( cua3.x == cua1.x - 20)) || (( cua3.x == cua2.x - 20) && ( cua3.x == cua1.x + 20)))
         signal(cua3), S_KILL);
      END[/code]
Title: Re: Ayuda porfavor
Post by: SplinterGU on May 03, 2010, 12:16:31 AM
eso pasa porque matas al proceso y luego queres seguir accediendo a sus variables... antes de acceder a un proceso tenes que usar exists o si matas un proceso, resetea su variable y chequea antes de usarla que no sea 0
Title: Re: Ayuda porfavor
Post by: Drumpi on May 03, 2010, 12:38:44 AM
Lo que viene a decir es que el problema no está en los signals, sino en que cuando matas a un proceso, cua1.x, cua2.x o cua3.x dejan de existir y no se pueden leer, y si lo intentas es como si leyeras "fuera de la zona de memoria" (es como un "segmentation fault" o "tuprograma.exe ha ejecutado una operación no válida y debe cerrarse. Ver detalles", pero controlado por el propio Bennu para que no haya problemas con el SO ;D).
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 10, 2011, 10:28:47 PM
Quote from: SplinterGU on May 03, 2010, 12:16:31 AM
eso pasa porque matas al proceso y luego queres seguir accediendo a sus variables... antes de acceder a un proceso tenes que usar exists o si matas un proceso, resetea su variable y chequea antes de usarla que no sea 0

Estoy teniendo este problema (Process not active), lo que me preocupa es que sólo ocurre en Wiz/Caanoo y en el port de Pandora, que tiene id de Linux.

En bennu para Windows no me ocurre!!! Hay alguna diferencia en esto, o esto se ha cambiado internamente en alguna version ?

Lo curioso es que la version de bennu que uso es mas vieja (r112) y la de Wiz/Caanoo la r228.
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 10, 2011, 10:36:25 PM
sin mas datos no te puedo responder.

lo que si te puedo decir que no hay diferencias entre windows y los demas en ese aspecto.
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 10, 2011, 11:01:39 PM
Pues las estoy teniendo, ahora vete a saber porque...
En windows nunca me peta en el punto ese...
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 10, 2011, 11:09:22 PM
se me ocurren muchas posibles causas de que te suceda eso, y no son del motor.

pon un ejemplo compilable y lo vemos.
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 10, 2011, 11:21:44 PM
Me pides lo imposible, ni siquiera he descubierto porque me sale ese error todavia. Cuando lo encuentre y resuleva ya tendré mejor información para descubrir porque no falla en windows. Ya hablamos cuando descubra el bug (o mejor, del proceso al que estoy accediendo a sus variables estando este ya muerto).
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 10, 2011, 11:27:33 PM
simplemente te estoy pidiendo un ejemplo en codigo compilable que reproduzca el error... y yo asi lo veo y te digo que y donde esta mal.

por otro lado:

1) no debes intentar acceder a variables de un proceso muerto, eso esta mal, y nada asegura que funcione
2) antes de intentar acceder a cualquier variable de cualquier proceso debes usar exists para asegurarte que ese proceso esta vivo en ese frame.
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 11, 2011, 12:24:48 AM
Splinter, que eso lo tengo claro, el tema del hilo no es buscar el motivo por el cual ocurre pero si porque en Windows no salta el error...
Habrá una explicación, cuando resuelva el error espero tenerlo mas claro.
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 11, 2011, 02:04:19 AM
no es asi, pero ok, como quiera...

suerte con eso...
Title: Re: Ayuda porfavor
Post by: Drumpi on April 11, 2011, 05:59:27 PM
Pues supongo que será porque usas distintas versiones. Es posible que una use las signals instantaneas y la otra espere al frame, o que una versión ordene los procesos de una forma y otra de otra forma (en una el proceso muere antes que la comprobación de ese frame, y en la otra es al revés, se hace la lectura y después muere).

Comprueba los últimos signals que has puesto.
Title: Re: Ayuda porfavor
Post by: DCelso on April 11, 2011, 06:10:37 PM
usa if exists antes de hacer nada con el id de un proceso y fijo que solventas el problema, y si no existe no hagas nada.

En cuanto a la funcion para ver si hay un objeto en determinada posición, no irá,  ya que necesitas al menos un frame para que se dibuje la imagen.

// Al llamarlo poner las coordenadas x e y del punto que quieres comprobar
FUNCTION comprobar(x,y)
BEGIN
     graph = new_map(2,2,16);
     map_clear(0,graph, rgba(255,255,255,0));
     frame;
     IF (collision (type algo)) //En algo con lo que quieres comprobar si coincide
     ...
     END
END

El problema es que siempre irás un frame retrasado :D.
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 11, 2011, 06:16:00 PM
Quote from: Drumpi on April 11, 2011, 05:59:27 PM
Pues supongo que será porque usas distintas versiones. Es posible que una use las signals instantaneas y la otra espere al frame, o que una versión ordene los procesos de una forma y otra de otra forma (en una el proceso muere antes que la comprobación de ese frame, y en la otra es al revés, se hace la lectura y después muere).

Comprueba los últimos signals que has puesto.

en bennugd eso no es factible.
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 11, 2011, 06:18:35 PM
Quote from: DCelso on April 11, 2011, 06:10:37 PM
usa if exists antes de hacer nada con el id de un proceso y fijo que solventas el problema, y si no existe no hagas nada.

En cuanto a la funcion para ver si hay un objeto en determinada posición, no irá,  ya que necesitas al menos un frame para que se dibuje la imagen.

// Al llamarlo poner las coordenadas x e y del punto que quieres comprobar
FUNCTION comprobar(x,y)
BEGIN
     graph = new_map(2,2,16);
     map_clear(0,graph, rgba(255,255,255,0));
     frame;
     IF (collision (type algo)) //En algo con lo que quieres comprobar si coincide
     ...
     END
END

El problema es que siempre irás un frame retrasado :D.

no tienes por que ir un frame retrasado... la cosa es que por cada proceso al que se le quiere acceder las variables, hay que chequear previamente al menos 1 vez si existe en cada frame.

y no tiene por que quedar retrasado.
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 11, 2011, 08:53:11 PM
Chicos, que me repito de nuevo, no os estoy pidiendo solución para el problema, eso ya lo tengo, solo era un pregunta por si eso podria ser distinto entre ports o haberse cambiado internamente entre versiones nada mas.

Hoy por fin el error ha saltado tambien en windows :)
El problema lo tengo resuelto (vamos se donde peta, aunque todavia no se al 100% porque ocurre y en que circunstancias se origina).
Title: Re: Ayuda porfavor
Post by: SplinterGU on April 11, 2011, 08:59:27 PM
lo tuyo era mas que una pregunta, era una pregunta con acusacion/afirmacion... de que habia algun cambio interno en linux que no afectaba a windows... y para responder esas cosas, hay que tener un caso de prueba, si vos no pones un caso de prueba que apoye lo que decis, entonces uno no puede hacer mucho por ayudarte o despejar tu duda.
Title: Re: Ayuda porfavor
Post by: FreeYourMind on April 11, 2011, 09:15:19 PM
 ??? pero que estas contando ???