Quiero saber como es que se sepa en que orden se crearon los objeto, bueno, pondré un ejemplo, algo IGUAL al item de Control de bombas del juego Bomberman, les explicaré por si no lo saben, este item hace q al poner una o varias bombas, y presione un boton cualkiera para reventar las bombas, se reviente la primera que puso y al presionar la tecla de nuevo se reviente la segunda bomba y asi mientras vas presionando ese boton van explotando las bombas de acuerdo al orden q las pusiste.¿CUAL SERIA EL METODO PARA CONSEGUIER ESO? :-X A - Y - U - D - A :-X
NOTA: por si no se acuerdan del item, es este:
Con instance_find( obj_bomba, 0 ) se obtiene el id de la primera bomba creada, si esa instancia se destruye, la función devolverá el id de la segunda y así consecutivamente.
Saludos makero Yoo:
En mi opinión siempre me gusta tener control total de lo que hago en GM. Cada vez que tengo necesito gestionar elementos (dígase objetos, imágenes, ítems) coloco sus ID dentro de una lista. Cada vez que cree un elemento nuevo, o deje de usar alguno, primero lo chequeo en la lista.
Para esto yo uso arreglos bidimensionales para lograr algo parecido a lo que hacen en las empresas cuando usan Microsoft Excel. El arreglo lo configuro de forma tal que en mi mente parezca una tabla donde tenga los ID de los elementos, una numeración para su ordenación (en caso de que lo necesite), una casilla que dirá el estado de dicho elemento (si están en uso, destruido, visible, etc.).
Con esto no necesito crear objetos indiscriminadamente, simplemente los muestro o no en dependencia de las necesidades y no cargo demasiado el microprocesador en el acto de crear nuevos objetos.
Espero este enfoque aporte nuevas ideas al diseño del código. A mi me cambió y facilitó el desarrollo de mis aplicaciones. XD
Gracias por la atención prestada... ;D
Cita de: Clamud en Febrero 05, 2015, 08:44:04 PM
Con instance_find( obj_bomba, 0 ) se obtiene el id de la primera bomba creada, si esa instancia se destruye, la función devolverá el id de la segunda y así consecutivamente.
Oye no me funciona!! Al presionar la tecla "X" las bombas q puse explotan todas al mismo momento!
Estoy poniendo en el evento X-Key:
with(instance_find(obj_bomba,0))
alarm[0]= 1
Y el evento Alarm 0 del obj_bomba:
instance_destroy;
AYUDA y responde :-X
MOD: Ya encontre el problema solo tenia q reemplazar el evento X-Key por el evento Release X-Key, PERO UNA PREGUNTA:
"¿La función instance_find funcionaria tambn cuando hay mas de un jugador(osea hay mas de un player q crean el objeto bomba,¿no pasará q el player q tenga el item pueda reventar las bombas de los demas? )?"
Cita de: Yoo en Febrero 09, 2015, 12:34:19 AM
funcionaria tambn cuando hay mas de un jugador(osea hay mas de un player q crean el objeto bomba,¿no pasará q el player q tenga el item pueda reventar las bombas de los demas? )?
La función instance_find no tiene manera de reconocer que instancia creo tal o cual bomba. Tendrías que crear un modo de identificar las bombas según su "padre". Es sencillo, mediante una variable puedes guardar en las bombas algún valor o cadena o el índice de objeto del jugador que creó la bomba, y cuando quieras destruír las bombas, preguntas por esa variable para ver a que jugador corresponde.
Otra propuesta es usar estructuras de datos, como mencionó ferhand, pero en vez de listas usar "queues", ya que su función es obtener los elementos en el orden que se van añadiendo.
En el evento Create cada jugador crea una queue:
[gml]
///Crear fila o cola
Q = ds_queue_create();
[/gml]
Para colocar una bomba se hace esto:
[gml]
///Crear bomba y guardar su id
ds_queue_enqueue( Q, instance_create(x,y,obBomba) );
[/gml]
Para destruir las bombas se toman algunas precauciones, por si se pueden destruir con otras bombas, u otros motivos:
[gml]
///Destruir bomba
while( not ds_queue_empty(Q) ) //mientras la fila no esté vacía
{
bomba = ds_queue_dequeue(Q); //sacar el primer elemento
if( instance_exists(bomba) ) //si esa bomba existe
{
with( bomba ) instance_destroy(); //destruir la bomba
break; //ya no buscar otra
}
} //si no existe, revisar el siguiente elemento
[/gml]
Y por último hay que destruir la "fila" al terminar el nivel, escribiendo esto en el evento Room End, para que en el siguiente evento Create no se acumulen filas sin usar:
[gml]
ds_queue_destroy(Q);
[/gml]
Gracias Clamud,(y a todos!!) Lo probaré cuando pueda!! :D
FUNCIONA PERFECTAMENTE Gracias!!