Matamarcianos, colision disparo-marciano

Started by Milton884, May 03, 2011, 05:11:41 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Milton884

Hola, me estoy volviendo loco porque no encuentro la solucion , y como ultimo recurso vine aca a pedir vuestra ayuda. Resulta que tengo un matamarcianos, cuando disparo a un marciano y colisiona(utilizo la funcion COllision para verificar y break; para terminar el proceso (en este caso el "disparo") cuando intento disparar de nuevo... no dispara. Aviso que se dispara con la tecla SPACE en mi juego.

Asi que subi mi codigo con sus recursos para ver si alguien puede ayudarme, el link es el siguiente:

http://www.4shared.com/file/kByiUSXc/Matamarcianos.html

Espero vuestra ayuda, muchas gracias enserio.

pd: Agradezco que sean tan gentiles con los usuarios menos experimentados en este foro, realmente tienen mucha pasiencia y valoro mucho eso.

La momia que fuma

Hmmm...cuando el disparo choca con un enemigo pasan dos cosas:

-Le dices al marciano que se tiene que morir
-Le dices al disparo que se tiene que morir

Pero una cosa la haces en el proceso de disparo y otra en el proceso del marciano...las dos cosas deberían hacerse desde el mismo proceso.

Creo que el problema es que al colisionar se hace o una cosa u otra, pero solo una.

Probando tu juego el fallo que dices (no poder volver a disparar) me pasa solo a veces, pero en los casos en los que el marciano muere, el disparo de la nave protagonista no lo hace, demostrando lo que digo, que solo se hace una de las dos cosas, dependiendo del orden de ejecución de los procesos...porque si desde el proceso marciano, detectas la colision con el disparo, el marciano en si desaparece...luego, el programa lee el codigo del proceso disparo y llega a:

if(collision(type marciano))
say("COLISIONADO");
break;
end


Pero como el proceso marciano ya no existe, no se cumple la colision y el disparo no muere (Muere de todas formas poco despues al salir de la pantalla, pero veo que tu intención es que el disparo desaparezca al darle al marciano).

De un modo parecido, en el otro caso se ejecuta el codigo del disparo antes que el del marciano, el disparo piensa: "He chocado con un marciano, asi que desaparezco", pero luego el marciano no detecta la colision con el disparo porque este ya se ha "suicidado"

En todo caso lo de que no puedas volver a disparar se debe a que cuando matas el disparo por colisionar con un marciano, no vuelves a poner la variable "disparando" a 0 (como bien haces cuando el disparo muere por salirse de la pantalla), el código de antes tendría que ser asi:

if(collision(type marciano))
say("COLISIONADO");
prota.disparando=0;
break;
end


Asi podrás seguir disparando, pero veras que el marciano ni se inmuta por mas que le alcanzes con los disparos, o que el marciano se muere pero el disparo no.

La solución como ya dije, es hacer las dos cosas desde el mismo proceso...consejo para hacerlo, crea una variable, por ejemplo "id2" y comprueba las colisiones de la siguiente manera:

if(id2=collision(type loquesea))

Si hay colision se cumple el if, y al mismo tiempo la variable id2 contendra el ID del proceso con el que has colisionado, con lo que podras acceder a sus variables publicas o locales (Quizá podrias hacer una variable pública "estoy_muerto" para terminar el proceso en lugar de usar break).

Espero haberme explicado al menos medio bien y haber sido de ayuda, suerte! :P

PD: Consejo estético-Con el tipo de gráfico que estas usando para el disparo, ponle "flags=16;"...no se veran los bordes negros del gráfico e "iluminara" sobre partes del fondo que no sean negras, quedando mucho mas vistoso

Milton884

#2
Gracias! vean mi post de abajo :)

Milton884

Ya entendi, cree una variable publica "Muerto" en proceso marciano, cuando detecto colision en el proceso disparo con un marciano, tmb a la vez guardo el ID del proceso marciano q colisiono, y le pongo Muerto=1, despues en marciano (proceso), verifico:

If(muerto==1)
    break;
end

Asi me andubo perfecto!

Muchas gracias en serio :)

SplinterGU

si solo tenes que matar el proceso, podes hacerle un signal

signal( id_marciano, s_kill);

con eso lo matas directamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Milton884

Con el break() solamente, no mata el proceso?

SplinterGU

break no mata procesos, solo te saca de un loop, for y otras funciones de bucles, pero solo 1 nivel, ademas tiene que ser ejecutada por el mismo proceso.

en cambio, signal, podes enviar senales, en este caso de kill, a otros procesos, entonces, cuando desde el proceso disparo detectas detectas la colision con el proceso enemigo, directamente lo matas desde disparo, sin tener que luego volver a perder tiempo ejecutando enemigo, pero todo esto, si en enemigo no necesitas ejecutar codigo extra... aunque tambien podes ejecutar codigo extra cuando se muere usando la seccion onexit: dentro del mismo proceso que muere.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2