Skocz do zawartości

Zablokowane Problem z tablica


Nobody

Rekomendowane odpowiedzi

Siemka. Mam problem z tablica ;/ To kod, dzieki ktoremu w mojej grze jakis potwor sie porusza itp.

 

 
    ajdi=readint(); // ID potwora;]
    name=readshort(); // Nazwa potwora;]
    rom=readint(); // Jaki room? :D
    if rom==room { // Jezeli gracz jest w tym samym pokoju jak potwor
     iks=readint(); // X potwora
     igrek=readint(); // Y potwora
     if !(variable_local_exists(monster[ajdi])) { // Jezeli nie istnieje element tablicy o podanym ID
      monster[ajdi]=instance_create(iks,igrek,obj_monster); // Stworz takowy :D
      monster[ajdi].name=name; // Nadaj mu nazwe name.
     }
    monster[ajdi].x=iks; // Przenies potwora na podany X
    monster[ajdi].y=igrek; // I Y :D
    }

 

Niestety ten kod nie dziala. Wyskakuje blad:

 

Unknown variable monster or array index out of bounds

 

Czy moze mi ktos pomoc? Prosze :(

Odnośnik do komentarza
Udostępnij na innych stronach

variable_local_exists() => array_local exists() - podstawy... <_<

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Do takich rzeczy game makerowe tablice się w ogóle nie nadają, ze względu na nieelastyczność. Dlatego też stosuje się datastruktury, a w twoim przypadku najlepsza będzie mapa ( "map" - para klucza i wartości). Tablicę zamień na mapę:

monsters = ds_map_create();

Czy potwór o danym id istnieje:

if ( !ds_map_exists( monsters, ajdi ) ) // czy klucz zapisany w zmiennej ajdi istnieje w mapie monsters
{
   ds_map_add( monsters, ajdi, instance_cerate( iks, igrek, obj_monster ) ); //jesli nie istnieje, to dodajmy ten klucz i przypiszmy mu wartosc id nowo utworzonego obiektu
}

var monster;
monster = ds_map_find_value( monsters, ajdi );  // pobierz wartosc przypisana do klucza ajdi
monster.x = iks;
monster.y = igrek;

Ewentualne usuwanie wpisu z mapy:

ds_map_delete( monsters, ajdi ); //usun klucz ajdi i jego wartosc z mapy monsters

 

ps. Nie ma czegoś takiego jak sugeruje Pchisix - array_local_exists (i to z prostej przyczyny). Ideą stosowania tablic jest trzymanie w niej z góry określonej liczby elementów. Jedyna dynamika tablic w GM'ie odnosi się do ich szerokości, którą można zmieniać w czasie gry (czytaj dodawać kolejne elementy do końca tablicy). W związku z tym mależy pamiętać, że jeśli mamy zainicjalizowany element o indeksie 100, to zakłada się, że elementy o indeksach 0 i 99 również istnieją, w innym przypadku jest to poważny błąd, gdyż nie można usuwać elementów ze środka tablicy. Krótko mówiąc nie trzeba sprawdzać czy elementy dajmy na to 23, 47 czy 87 istnieją jeśli wiemy, że tablica ma szerokość 100 i dlatego też funkcja array_local_exists nie istnieje.

 

W celu takim, jaki został przedstawiony w temacie, zostały stworzone inne struktury typu kolejki, stosy, listy, siatki czy właśnie mapy. Ideą tych struktur jest przechowywanie dowolnej liczby elementów w jakiejś tam kolejności. Przykładowo mapa, to taka super elastyczna tablica, gdzie możemy usuwać dowolne elementy, wstawiać nowe w określone pozycje, pobrać liczbę elementów w mapie, sprawdzić czy dany klucz istnieje itd. Mało tego - przy zręcznym łączeniu określonych struktur możemy otrzymać nowe jak np. dynamiczne tablice trójwymiarowe (siatka list) czy czterowymiarowe (siatka siatek). Kombinacji jest dużo. :)

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...