NukeBoards

Pomoc - [TGF]Inwentarz - jakieś pomysły?

Tasmpol - 11-11-2005, 22:08
: Temat postu: [TGF]Inwentarz - jakieś pomysły?
Witajcie, znowu ja. Tym razem chodzi mi o inwentarz, a dokładniej o jego wykonanie. O co chodzi: klikam na obiekt i przenosi go do slota 1. Klikam na drugi obiekt i jeżeli slot 1 jest zajęty, przenoszę ten obiekt do slota 2. Klikam na trzeci obiekt, jeżeli slot 1 i 2 jest zajęty to przenoszę go do slotu 3. Czyli, zawsze przenosi obiekt do slotu o najniższej liczbie identyfikacyjnej z aktualnie pustych slotów. Oczywiście, można odwrotnie - najpierw wsadzi do slotu o najwyższej liczbie identyfikacyjnej. I jak to zrobić? Myślę, myślę i wymyśleć nie mogę. Piszcie swoje propozycje (nie przykłady! nie chcę przykładów), a ja dalej pomyślę.
Edit1:
Zrobiłem coś takiego - wszystkie przedmioty przenoszone są do jednego slota, jeżeli obiekt 2 przeniesie się do slota i będzie już tam obiekt 1 to obiekt 1 przenoszony jest o 100px w prawo, czyli do nst. slota. Noo chyba działa, ale nie jest to najlepsze rozwiązanie. Wiec czekam na inne...
Pragnę jeszcze zaznaczyć, że pierwszy raz w życiu tworzę inwentarz, więc mam prawo tego nie umieć ;)
Natie - 11-11-2005, 22:51
:
A inwentarz gdzie jest na ekranie, i czy jest on cały czas widoczny?
Kurczak - 11-11-2005, 22:56
:
Możliwe że chodzi ci o coś takiego:
przykład
Zrobiłem przykład bo nie lubię się rozpisywać.
A, sorry za brak komentów, ale to powinno być w miarę jasne.
Tasmpol - 11-11-2005, 23:19
:
CC, najpewniej jest ukrywany w czasie prowadzenia dialogów - wiesz, będzie złozony z kilku obiektów aktywnych, w jednej grupie, więc jednym zdarzeniem schowam i pojawię znowu cały panel.
Kurczaku, nie mogę ściągnąć pliku, jest napisane, że z tego IP już coś teraz ściągam (chociaż nic nie ściągam)... Jak możesz - wrzuć to gdzie indziej ;)
BROO - 11-11-2005, 23:54
:
Gorąco polecam reprezentowanie informacji na temat posiadanego inwentarza w obiekcie tablicy (Dynamic Array 2).

Otóż... tablica posiada 4 jakże istotne polecenia:
:arrow: dopisz wartość (na końcu)
:arrow: ustaw wartość na pozycji X
:arrow: wstaw wartość w pozycji X
:arrow: usuń wartość na pozycji X

Odpowiedź rozdzieliłem na 2 etapy:
:arrow: Jak pokazać zawartość tablicy i jakie informacje weń umieszczać
:arrow: Jak ma działać silnik dodawania/zabierania rzeczy

Jeżeli miałeś do czynienia z przedstawianiem zawartości tablicy za pomocą obiektów aktywnych to punkt 1. możesz pominąć.

1. pokaz zawartości tablicy za pomocą obiektów aktywnych
Załóżmy, że masz 16 różnych rodzajów przedmiotów, które mogą znaleźć się w inwentarzu. Ponadto, masz 5 kieszeni. W efekcie Twoja tablica będzie składać się z zaledwie 5 elementów przyjmujących wartości:
:arrow: 0 dla pustej kieszeni
:arrow: 1,2,3,4,5...16 dla kolejnych rodzajów przedmiotów

Oznaczasz: zakładasz, że pod 1 kryje się Cukierek, pod 2 jest butelka, pod 3 papier toaletowy itd. W okienku inwentarza tworzysz 5 obiektów aktywnych zawierających obrazki umieszczone w odpowiednich kierunkach:
:arrow: dla kierunku "0" masz pusty obrazek
:arrow: dla kierunku "1" masz narysowany śliczny cukierek
:arrow: dla kier.="2" jest butelka itd.

Na początku gry dodajesz zdarzenie przydzielające tym pięciu obiektom aktywnym wartości A: 0, 1, 2, 3, 4 (zgodne z numerami ID kieszeni zapisanymi w tablicy).

Na zdarzenie "zawsze", albo lepiej: dotyczące zmiany inwentarza (zjedzenie cukierka, przekazanie butelki, wzięcie papieru...) ustawiasz każdemu z Twoich obiektów inwentarza wartość kierunku równą Val("Dynamic Array", Value A(inwentarz) ). W ten sposób masz przedstawiony inwentarz.

2. działanie dodawania/zabierania inwentarza
Właściwie to będzie tylko szybkie pokazanie zasady działania procedur Dynamic Array 2 na danych. Pozostajesz przy 5-elementowej tablicy wypełnionej różnymi rodzajami przedmiotów.

Uzupełnianie tablicy będzie takie, że puste kieszenie, jeśli wystąpią, zawsze znajdą się po prawej stronie.

Masz przykładowo tablicę wypełnioną w następujący sposób:
kieszeń pierwsza (A=0) -> przedmiot nr 11
kieszeń druga (A=1) -> przedmiot nr 8
kieszeń trzecia (A=2) -> przedmiot nr 1
kieszeń czwarta (A=3) -> przedmiot nr 0 - jest pusta.
kieszeń piąta (A=4) -> przedmiot nr 0 - jest pusta.

Krótka pisząc, stan inwentarza to: 11, 8, 1, 0, 0.

Gdy chcesz podjąć butelkę (przedmiot nr 2) -> dodajesz element za pomocą APPEND VALUE.
Po dodaniu stan inwentarza to: 11, 8, 1, 2, 0.

Chcesz pozbyć się przedmiotu w drugiej kieszeni przez kliknięcie na nią (przedmiot nr 8, a kieszeń 2, czyli A=1), wówczas używasz polecenia DELETE AT - i wpisujesz Value A(inwentarz)
Po skasowaniu przedmiotu inwentarz po prawej idzie w lewo: 11, 1, 2, 0, 0.

Jeśli jednak podnosisz papier toaletowy (nr 3) i chcesz myszą wybrać, w które miejsce go "wcisnąć" - używasz polecenia INSERT AT... sprawa tutaj jednak lekko się komplikuje.
Załóżmy, że Twój stan inwentarza to: 11, 8, 0, 0, 0.

Jeśli chcesz wstawić w drugą kieszeń papier...
...to otrzymujesz: 11, 3, 8, 0, 0.
Przedmiot nr 8 został przesunięty i o to chodzi.

Natomiast... jeśli jednak chcesz wstawić w czwartą kieszeń papier.
Wówczas będziesz miał: 11, 8, 0, 3, 0
Problem się pojawi, gdyż powstaje luka między 8 a 3, której nie zapełnisz nawet APPENDEM. W takich wypadkach należy podeprzeć się jeszcze jednym warunkami do zdarzenia wkładania przedmiotu w kieszeń:
:arrow: JEŻELI to NIE JEST pierwsza kieszeń
:arrow: JEŻELI kieszeń po lewej stronie NIE JEST pusta

Ufff... wszystko zrozumiałe?
Slawo - 12-11-2005, 00:26
:
uff, cały BROO, i co są warte wszystkie forumy bez BROO i jemu podobnych ? nic ...
Tasmpol - 12-11-2005, 00:46
:
Noo, nieźle :) Oczywiście, wszystko działa, na razie zrobiłem tylko dodawanie obiektów - potem zrobię ich wykorzystywanie. Jak dotąd nie używałem zbyt często tablic - nie widziałem dla nich zastosowania innego niż przechowywanie dużych ilości danych.
Wracając do problemu, nasuwa się kolejny: jak zachować zawartość tablicy w grze, by po przejściu do nst. lokacji była ona dalej zapełniona? Chyba nie da się zapisać tablicy do wartości globalnej... Są może na to jakieś harcerskie sposoby?
BROO - 12-11-2005, 00:54
:
Yyy... następny poziom... trochę mnie zmieszałeś Tasmpolu. ;)

Zawsze możesz przetransferować dane do zmiennych globalnych po to, by w następnym etapie z powrotem wstawić je do tablicy na starcie początku.

Jeżeli masz zajęte dużo zmiennych globalnych, to zawsze informacje o 5 kieszeniach możesz przechować w jednej zmiennej korzystając z systemu n-rodzajoilościowego.

Zakładając, że masz 5 kieszeni i 16 rodzajów przedmiotów, możesz je zapisać w 1 liczbie równej tyle:
1*kieszeń1 + 16*kieszeń2 + (16^2)*kieszeń3 + (16^3)*kieszeń4 + (16^4)*kieszeń5.

A później odczytać do tablicy:
Kieszeń1 = (global value 1) /1) mod 16
Kieszeń2 = ((global value 1) /16) mod 16
Kieszeń3 = ((global value 1) /(16^2) ) mod 16
Kieszeń4 = ((global value 1) /(16^3) ) mod 16
Kieszeń5 = ((global value 1) /(16^4) ) mod 16
Omenski - 12-11-2005, 13:08
:
Rzeczywiście dla małej liczby danych można je ręcznie przepisywać do wartości globalnych. Jednak zawsze można zastosować metodę zapisania tablicy do pliku na końcu etapu i jej wczytanie na samym początku. Tylko, że w tym rozwiązaniu trzeba uważać na jedną rzecz: rozszerzenie Dynamic Array 2 (1 zapewne też) ma problem z zapisaniem wartości =0. Ogólnie po prostu jeśli chcesz zapisać tablicę, sprawdź najpierw (np. przy użyciu Fast Loopa) czy nie ma w niej w jakimś polu wartości zerowej, bo jeśli się znalazła i ją zapisałeś, to już jej nie wczytasz. By to ominąć po prostu zastąp wartości zerowe np. przez -99.999.999, a następnie gdy wczytasz zastąp liczby -99.999.999 wartością 0.
Fadex - 12-11-2005, 13:34
:
Taka drobna rada:
Przy wielu kieszeniach użyj plug-inu 1000 global values ;)
Kurczak - 12-11-2005, 17:49
:
W porównaniu z tym co napisał BROO mój przykładzik może się schować, ale wiadomo kto tu jest lepszym klikowcem, nie? ;)
Mojego przykładu radzę nie ściągać nawet, bo nie ma po co :|
Tasmpol - 02-12-2005, 22:08
:
Mam takie pytanie. Przy robieniu przygodówki trzeba dziesiątek przełączników globalnych. I tutaj mam pytanie, czy jest jakiś plugin, który zrobi bardzo wiele globalnych flag? Bo można oczywiście to zrobić za pomocą 1000 Global Values, każda wartość globalna może mieć 1 - odpowiada podniesionej fladze i 0 - odpowiada opuszczonej. Ale, dużo wygodniej i estetyczniej jest zrobić to flagami. Więc, czy istnieje dla TGF jakiś plugin dający globalne flagi?