Vaciar arrays unidimensionales[Solucionado]

Publicado por TheZombie99, Octubre 11, 2018, 01:25:45 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

TheZombie99

Hola de nuevo compañeros!

Esta vez me he dedicado a replicar un juego llamado Final Fantasy 6 de la super nintendo, donde por medio de un menú se seleccionan las acciones a hacer sobre los enemigos en pantalla (por el momento solo enemigos).

He dejado el .exe de lo hecho hasta ahora para que vean como funciona, Z es aceptar, X es cancelar, y S es seleccionar todos los enemigos. Con el comando Item se reinicia la aplicación.

Llegando al grano, tengo un objeto menú que lista todas las opciones en pantalla y me permite seleccionar al enemigo que yo quiera atacar, ya sea a espadazos o con magia. Cuando selecciono un ataque mágico o el comando Fight, el menú dibuja un cursor que me permite seleccionar al enemigo deseado, cuando pasa eso el objeto menú tiene dos arrays de una sola dimensión, uno para la X del enemigo y otra para la Y; sé hacer arrays de dos dimensiones pero así me pareció más fácil. Donde por orden de creación de instancias del objeto enemigo se llenan los arrays con las repectivas coordenadas.

Lo que pasa es que cuando hago el ataque y destruyo al enemigo, trato de vaciar los arrays pero no pasa nada.

Ya traté con ds_list_clear(), pero me di cuenta que no es una ds_list, y me tira error.
También que por medio de un ciclo for dejar todas las casillas de las listas en 0 o en noone, pero sigue igual.

Para saber de cómo es la estructura del menú, seguí el tutorial de menú básico del youtuber Shaun Spalding.

Espero me puedan ayudar con este problemita. Dejo adjuntas unas imágenes de lo que pasa.

Gracias!!!.

Goganpis

Puedes aprender a usar las grids o mas bien solo estas haciendo mal al borrar un array con el codigo (with id_object ) en el cual aveces eso no se que carajos tiene de malo pero causa error, si lo vas a usar con el ciclo llamalo desde aqui cada cosa que desees eliminar como esta abajo

obj_control.array[0] = 0;
obj_control.array[1] = 0;

y asi vas pero es dificil de explicar yo estuve haciendo un inventario intuitivo y me costo porque donde sea me tomaba con bugs

3dgeminis

Para este caso en que se crean y destruyen objetos creo que una ds_list sera lo mejor.
En lugar de guardar las coordenadas solo tendrias que guardar la id de los objetos enemigos y usar esa id para colocar el cursor y cuando elimines un enemigo solo borras la id de la lista y automaticamente te elije el siguiente objetivo.
Si quieres te paso el codigo.
Fijate en el ejemplo

TheZombie99

Wow! si por favor, pásame el código.

3dgeminis

Aqui esta:

CREATE
[gml]
objetivo=0 ///nos servira para marcar al objeto enemigo
lista=ds_list_create()

with(enemigo) ///los objetos enemigos para añadir a la lista
   {
    ds_list_add(other.lista, id)
   }
[/gml]

STEP
[gml]
;)if keyboard_check_pressed(vk_down) {objetivo+=1} ///siguiente enemigo (abajo)
if objetivo>(ds_list_size(lista)-1) {objetivo=0} ///si llega al ultimo pasa al primero

if keyboard_check_pressed(vk_up) {objetivo-=1} ///enemigo anterior (arriba)
if objetivo<0 {objetivo=(ds_list_size(lista)-1)} ///si llega al primero pasa al ultimo

if ds_list_size(lista)>0 ///si hay enemigos para atacar
   {
    if keyboard_check_pressed(vk_space) ///en lugar del ataque use la tecla ESPACIO
       {
        if ds_list_size(lista)>0 ///si hay enemigos
           {
            with(ds_list_find_value(lista, objetivo)) ///elige al enemigo seleccionado(objetivo) en la lista
               {
                vida-=choose(10,20,30) ///le quita vida
                if vida<=0 ///y si la vida llega a cero
                   {
                    instance_destroy() ///destruye al objeto
                    ds_list_delete(other.lista, other.objetivo) ///lo elimina de la lista
                   }
               }
           }
       }
   }
[/gml]

DRAW
[gml]
if ds_list_size(lista)>0 ///nos aseguramos que aun hayann enemigos para poder dibujar el cursor
   {
    draw_sprite(spr_cursor, 0, ds_list_find_value(lista, objetivo).x+50, ds_list_find_value(lista, objetivo).y-32) ///dibuja el cursor
   }
[/gml]

DESTROY
[gml]
ds_list_destroy(lista) ///destruye la lista cuando termina el combate(el objeto se destruye cuando termina el combate y no se encesita mas)
[/gml]

TheZombie99

Gracias!! lo apliqué y funciona perfecto.

Powered by EzPortal
SMF spam blocked by CleanTalk