Skocz do zawartości

Inventory


Hawaxi

Rekomendowane odpowiedzi

Witam,

chce zrobić "inventory" które ma wyświetlać wszystkie obiekty dostępne w grze,

i tu mam problem ponieważ każdy obiekt ma inną nazwę.

 

Mam stworzone całe eq ale musze jeszcze włożyć w nie wszystkie obiekty...

 

Mój kod:

 

obj_inv2 > Create

GML
InvMax=6;

 

 

obj_inv2 > Draw

 

GML
for (i=0; i<InvMax; i+=1)

{

draw_sprite(spr_kora, 1, x+(i*65), 64);

}

Ma ktoś pomysł jak to zrobić?

 

 

Jeśli ktoś nie zrozumiał co chce zrobić to chodzi mi o inventory takie jak jest w minecrafcie na creative (widzisz wszystkie bloki dostępne w grze).

Odnośnik do komentarza
Udostępnij na innych stronach

To nie prawda że wszystkie obiekty mają inną nazwę. Tak na prawdę każdy obiekt jest ponumertowany po kolei numerem ID, a jego nazwa po prostu oznacza jego ID. Mozesz sprawdzić wszystkie ID tak jakbyś normalnie sprawdzał zmienną. np: draw_text(0,0,spr_kora)

Mając wszystkie ID może się okazać że wszystkie twoje obiekty są po kolei dlatego będziesz mógł pętlą (zamiast ręcznie) wypisać wszystkie.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie napiszę Ci dokładnie kodu, ale coś takiego. Tworzysz listę lub stack (odsyłam do dokumentacji http://www.gmclan.org/index.php?wiki=category&zm=20)

Teraz taki trik

GML
stak=ds_stack_create(); //tworzymy nasz stack

with(object) //Każdy obiekt, o nazwie object

{

ds_stack_push(stak, id) //ułoży swoje ID na tym staku

}

A potem przy wyświetlaniu tego korzystasz z ds_stack_pop(id). Myślę, że dasz radę, jak coś to napisz, a postaram się wszystko ładnie opisać.

Odnośnik do komentarza
Udostępnij na innych stronach

Okej,

troche poczytałem bo nie zabardzo wiedziałem jak działa ten stack i jak narazie udało mi się zrobić coś takiego:

 

obj_inv2 > Draw

 

GML
lista =ds_stack_create();

with(object)

{

ds_stack_push(lista, id);

}

 

for (i=0; i<InvMax; i+=1)

{

draw_sprite(spr_kora, 1, x+(i*65), 64);

ds_stack_pop(lista);

draw_sprite(lista, 1, x+(i*65), 64);

 

}

 

Wyświetla jeden ten sam obiekt we wszystkich slotach, później ten obiekt zamienia się na inny i tak co chwilę.Jak już przejdzie przez wszystkie obiekty crashuje...

 

Próbowałem też na inny sposób który też nie zadziałał:

GML
lista =ds_stack_create();

with(object)

{

ds_stack_push(lista, id);

}

 

for (i=0; i<InvMax; i+=1)

{

draw_sprite(spr_kora, 1, x+(i*65), 64);

wybrany = ds_stack_pop(lista);

draw_sprite(wybrany, 1, x+(i*65), 64);

 

}

 

Tutaj pokazywał się jeden obiekt we wszystkich slotach.

 

Tutaj nic się nie działo:

 

GML
lista =ds_stack_create();

with(object)

{

ds_stack_push(lista, id);

}

 

for (i=0; i<InvMax; i+=1)

{

draw_sprite(spr_kora, 1, x+(i*65), 64);

ds_stack_pop(lista);

}

 

Co zrobiłem źle?

Odnośnik do komentarza
Udostępnij na innych stronach

Gówno nie stack. Co ty Sutikku wypisujesz? Stack to kupka na którą można kłaść i brać tylko po jednym elemencie z góry.

Nie powinna być ci potrzeba żadna struktura bo tylko będziesz dublować dane. Ale skoro chcesz robić to w ten sposób to już poprawiam.

 

GML
lista =ds_list_create();

with(object)

{

ds_list_add(other.lista, id);

}

 

for (i=0; i<ds_list_size(lista); i+=1)

{

draw_sprite(spr_kora, 1, x+(i*65), 64);

item=ds_list_find_value(lista,i);

draw_sprite(item, 1, x+(i*65), 64);

 

}

ds_list_destroy(lista)

 

Create and destroy powinieneś wykonać tylko raz np w Create i Game End eventach.

Odnośnik do komentarza
Udostępnij na innych stronach

Aha i chcę później dodać sklep do mojej gry i chciałbym żeby te obiekty które tam kupisz też się pojawiały na tej liście (dopiero jak je kupisz).

Jak patrzyłem w internecie to nie żauważyłem opcji która dawała by możliwość dodania pojedyńczego obiektu do tego stacka.

Jeśli jest to mnie poprawcię.

Odnośnik do komentarza
Udostępnij na innych stronach

Skorzystałem z twojej porady i zrobiłem to z ds_map:

 

GML
inv = ds_map_create();

 

ds_map_add(inv, object, 1);

ds_map_add(inv, object100, 1);

ds_map_add(inv, object101, 1);

ds_map_add(inv, object102, 1);

ds_map_add(inv, object103, 1);

 

for (i=0;i<ds_map_size(inv);i++)

{

if i != ds_map_size(inv)-(ds_map_size(inv)+1) // Sprawdzam czy to jest pierwszy obiekt w pętli

{

item = ds_map_find_next(inv, object);

draw_sprite(item, 1, x+(i*65), 64);

}

 

else

first = ds_map_find_first(inv);

draw_sprite(first, 1, x+(i*65), 64);

}

 

Zrobiłem to całe zmieszanie z tym if w pętli bo nie wiedziałem czy ds_map_find_next zalicza też 1 obiekt.

 

W tym kodzie wyskakuje mi coś przy zmiennej first:

Push :: Execution Error - Variable Get -1.first(100039, 0)

at gml_Object_obj_inv2_Create_0 (line 20) - draw_sprite(first, 1, x+(i*65), 64);

 

I mam jeszcze jedno pytanko, czy jak zrobie:

 

GML
draw_sprite(ds_map_find_first(inv), 1, x+(i*65), 64);

 

Zamiast:

 

GML
first = ds_map_find_first(inv);

draw_sprite(first, 1, x+(i*65), 64);

 

Czy to ma jakieś znaczenie czy też to jest poprostu ze względów stylistycznych (żeby łatwiej się odczytywało kod)?

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz widzę jak bardzo nie rozumiesz dokumentacji. Przy ds_map nie poznasz klucza więc takie przechowywanie danych nie ma sensu. Mówiłem: ds_list. Do listy po kolei dodajesz wszystkie elementy. Potem normalnie lecisz po wszystkim pętlą i wyciągasz id. ds_map mówiłem jeżeli chcesz robić kupowanie bo wtedy możesz (mając już pobrane id z listy) zobaczyć w mapie ile jest danego elementu.

 

Jeżeli do poniedziałku sobie nie poradzisz to wszystko spokojnie wytłumaczę. Teraz jestem zabiegany.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

okej zrobiłem 5 obiektów żeby to przetestować dodałem je do listy,stworzyłem pętle itd. ale i tak wyświetlają się zupełnie inne obiekty których nie dodałem do listy...

w dokumentacji pisze że mam wpisać wartość:

 

ds_list_add(id, wartość)

 

ale jaką wartość? Próbowałem wpisać w tym miejscu zamiast nazwy obiektów ich id lecz to też nie zadziałało.

Odnośnik do komentarza
Udostępnij na innych stronach

To podaj kod na rysowanie ekwipunku, bo jeśli to ma być obiekt to musisz użyć instace_create do stworzenia instancji tego obiektu. Z tego co widzę z poprzednich kodów wynika jasno próbujesz narysować instancje obiektu. :D I pamiętaj że instrukcje zaczynające się od przedrostka "draw_" działają tylko w evencie draw.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

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