otro problema

Started by juguefre, May 10, 2017, 06:37:55 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

juguefre

Hola,

Siguiendo los videotutoriales de crashon182 he comprendido bastantes cosas pero desde el primer intento con space invaders note que los enemigos se destruyen simultáneamente en diferentes lugares con el impacto de un solo disparo.

He tratado de solucionar ese problema y creo estar cerca de la solución pero comienzo a desesperarme.

Como el proceso "enemigo" es 1 solo yo sospecho que de alguna forma (desconocida para mi) el impacto es compartido por varios enemigos pues estos comparten el proceso "enemigo"

Si hago los enemigos 1 a 1 de forma manual copiando y pegando el código en cada uno de los enemigos y modificando donde se requiere acorde a cada enemigo el problema se elimina......pero esta es una solución un tanto ridícula, es como si solucionara el problema con el uso de fuerza bruta pues termino con una cantidad enorme de lineas de código.

Como puedo hacer 1 enemigo, crear múltiples copias de el (instancias) y cuando impacte alguno solo ese sea eliminado?



Goku jr

Buenas!
Algo parecido pregunté yo por aquí..
Mírate esto : http://forum.bennugd.org/index.php?topic=4121.0

Espero te sirva

Saludos!

juguefre

Gracias Goku pero yo ya puedo colocar tantas copias como quiero, el problema es por ejemplo que si tengo 10 copias y le disparo a la copia numero 3 también se destruyen otras copias no solo la numero 3 sino también la numero 9 y 10.

Lo que necesito es lograr destruir únicamente la copia a la que impacto con el disparo, en este caso de el ejemplo que se destruya únicamente el numero 3.

Drumpi

¿Puedes copiar el código del enemigo y del disparo? Por la descripción sólo podemos hacer conjeturas, pero por lo que cuentas, parece que no estás cogiendo la ID correcta del enemigo. ¿Es posible que estés usando GET_ID(type enemigo) en lugar de:
enemigo_muerto = collision(type enemigo)
if (enemigo_muerto != 0)
    signal(enemigo_muerto, s_kill);
end

?
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

juguefre

Hola,

Revisando el codigo me di cuenta que el error original que se pretendia corregir era que los enemigos una vez destruidos continuaban disparando (el grafico ya no se dibujaba), cuando se agrega la linea que se supone debe detener el proceso de los enemigos destruidos es cuando se destruyen varios enemigos en diferentes lugares.

El codigo es 100% el mismo que usa crashon182 en el tutorial de space invaders.

este es el codigo de enemigos (cuando se mueven a la derecha)

process Enemigos(x,y,string tipo,int totalMov,int deceny)

private
      int cantMov = 1;
      int randDisparos;
End

Begin
      File = fichero;
      if(tipo=="Enemigo1")
         Graph=2;
      End
      if(tipo=="Enemigo2")
         Graph=3;
      End
      loop
         //Enemigos se mueven hacia la derecha.
         if(cantMov<totalMov)
            repeat
               if(collision(Type Disparo))
                  //la siguiente linea identifica al enemigo con la colision y detiene el proceso de ese
                                                //enemigo.
                  signal(get_id(Type Enemigos),s_Kill);//esto pertenece al modulo "proc".
                  signal(get_id(Type Disparo),s_Kill);
                  for(imgExplosion=7;imgExplosion<14;imgExplosion++)
                     Graph = imgExplosion;
                  Frame;
                  End
                  Graph = 0;
               End
               x+=2;
               cantMov++;
               randDisparos = rand(1, 500);//esto genera un numero random del 1 al 500.
               if (randDisparos==50)//Si el numero random generado es 50, entonces dispara.
                  DisparoEnemigos(5);
               end
               Frame;
            until(cantMov>totalMov)
         End
            y=y+deceny;



Y en el main process se usa esto para generar los enemigos en las diferentes coordenadas:

Enemigos(incremX+10,30,"Enemigo1",140,18);
Enemigos(incremX+10,90,"Enemigo2",140,18);

Crashon182 nunca corrigio el error aun cuando era completamente obvio que habia un error notable.

He intentado multiples cosas pero nada que logro hacer funcionar eso correctamente, el objetivo es aprender a programar enemigos para luego tener la capacidad de adaptarlos a el juego que voy a desarrollar.

La linea que causa el error es basicamente esta:

signal(get_id(Type Enemigos),s_Kill);

Antes de incluir esa linea el codigo funciona, solo se destruye el enemigo impactado y el error es que continuan disparando aun despues de ser destruidos.

Luego de incluir esa linea se destruyen varios con un solo disparo y continuan disparando  aun despues de destruidos.


juguefre

Quote from: Drumpi on May 13, 2017, 01:00:54 PM
¿Es posible que estés usando GET_ID(type enemigo) en lugar de:
enemigo_muerto = collision(type enemigo)
if (enemigo_muerto != 0)
    signal(enemigo_muerto, s_kill);
end

?

EXACTAMENTE ESO

Sin embargo no logro descifrar como se usa el código que me has mostrado, siempre me da un error "enemigo_muerto"

Drumpi

¿Tienes problemas de programación? ¿Te va mal con tu proceso "amigo"? No lo dudes, llama ahora a Drumpi a su "servicio técnico de la vida". Resolvemos tus bugs usando una bola de cristal.
^^U

"enemigo_muerto" es una variable privada de tipo int cualquiera. Ponle el nombre que quieras, pero declárala en el private o te perseguirá hacienda :D
"collision" devuelve un entero, que vale el ID exacto del proceso con el que choca, o cero si no ha habido colisión.
"get_id" te devuelve un ID cualquiera del proceso de ese tipo. Tu matabas a un proceso cualquiera, que no era necesariamente el que chocaba, y por eso, al siguiente frame, volvía a existir una colisión y mataba a otro proceso diferente. Esto pasaba hasta que dejaba de haber colisión o, por suerte, se eliminaba el proceso que querías.

Pues eso, guarda el valor de collision en una variable, comprueba que no es cero ¡Y ACABA CON ÉL!
¡¡¡OJO!!! Que haces get_id para matar al proceso enemigo y también está mal: la ID del propio proceso se guarda en una variable local predefinida llamada "id"... pero no hagas el kill hasta que termine su código. En tu caso lo pondría DESPUÉS de la animación de la explosión, cinco líneas más abajo.

Aunque recomendaría en un futuro que sustituyeras el LOOP por un WHILE que valga true mientras esté vivo (por ejemplo, que su energía > 0, o una variable llamada vivo = true), y que al chocar con la bala hagas que se salga haciendo que su condición valga false. Y ya pones la animación de la explosión después y dejes que se muera al terminar el código.

Está un  poco viejo, pero el código de Fénix es 95% compatible. El tutorial de iniciación DIV/Fénix de esta página (http://drumpi1_0.en.eresmas.com/Tutor/Tutor.htm) lo hice hace tiempo para los que no se querían enfrentar al tutorial de Osk ni encontraban el manual de DIV, pero es lo que he usado para los matamarcianos todos estos años... o al menos, son las 200 primeras líneas de código que les escribo ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

juguefre

Hola Drumpi, esto se esta volviendo demasiado complicado, mi trabajo freelance me deja muy poco tiempo libre para estudiar y eso es sin contar que tengo que hacer el arte para el juego, así que lo mejor que puedo hacer es buscar alguien que me ayude a solucionar problemas a cambio de dinero.

Te interesaría solucionarme problemas que tenga con el código a cambio de un pago que estableceríamos de acuerdo a la complejidad de cada tarea?

Es la única alternativa que veo para poder avanzar.

Saludos.

Drumpi

Perdón por tardar en responder, pero mi nuevo trabajo me tiene igual que a tí ^^U

Sinceramente, no puedo pedirte dinero a cambio de hacerte algo que he hecho gratis, en un par de semanas, y 37 veces. No sería honrado :D
(Me refiero al Space52, el juego que hice para la última crap compo de Panreyes, que es una recopilación de matamarcianos. Iban a ser 52, pero lo de siempre, falta tiempo).

No te tortures. Los comienzos no son fáciles, y eso que tu estás haciendo, si a mi me lleva un par de horas, es porque llevo con Bennu desde el 2002, cuando empecé con DIV. Sí, vale, el tutorial básico me  lo ventié en una tarde en 4 horas siguiéndolo paso a paso, pero antes me había pasado tres semanas leyendome el manual de DIV... bueno, más bien, estudiándomelo, y antes que eso estuve dando mis primeros seis meses de programación en la carrera.

Esto no sale de la noche a la mañana. Paciencia, peléate con él lo que haga falta y no desesperes. La experiencia obrará el milagro, te lo digo yo ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)