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
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
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á).
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
Cambiando "flags=8" por "alpha=0", está perfecto.
gracias por la ayuda. se me avia ocurrido esta noche consultandolo con la almuada una cosa muy parecida :D
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
tambien e probado con signal(cua1, S_KILL);
y me da el mismo error
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]
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
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).
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.
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.
Pues las estoy teniendo, ahora vete a saber porque...
En windows nunca me peta en el punto ese...
se me ocurren muchas posibles causas de que te suceda eso, y no son del motor.
pon un ejemplo compilable y lo vemos.
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).
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.
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.
no es asi, pero ok, como quiera...
suerte con eso...
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.
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.
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.
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.
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).
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.
??? pero que estas contando ???