Programowanie tablicy w UnrealScript

Uczymy się edytowania P2 i rozwiązujemy nasze problemy. Nowi adepci mile widziani!

Moderatorzy: Moderatorzy, Admini

Awatar użytkownika
seebeek17
Modder
Modder
Posty: 8399
Rejestracja: 10 cze 2013, 13:25
Lokalizacja: Z Zewnątrz
Kontakt:

05 wrz 2018, 18:29

Witam. Jest tu ktoś, kto mógłby mi pomóc zrozumieć tablice dynamiczne?
Dajmy na to mam taki kod:

Kod: Zaznacz cały

var() int Index;
var&#40;&#41; array<string> StringList;

var int ElementyWTablicy;
var int AktualnyIndex;

ElementyWTablicy = StringList.Length;
AktualnyIndex = 1;

Defaultproperties
&#123;
     StringList&#40;0&#41;="PierwszyElement"
&#125;
ElementyWTablicy będzie równe 1, ale gdy chcę dać StringList[AktualnyIndex] to i tak zmieni się wynik na 0. Pomimo, że "długość" tablicy wyjdzie 1, to i tak musimy wpisać 0 w index tej tablicy. Tzw nawet jak będzie StringList[AktualnyIndex] to AktualnyIndex i tak zmieni się na 0, pomimo wcześniejszego ustawienia go na liczbę 1. Wyjaśni mi ktoś dlaczego tak jest?
StringList.Length liczy wielkość tablicy od liczby 1 (noo, trochę logiczne, bo "jeden" element tablicy, ale dlaczego sam index trzeba ustawiać jako 0 (gra sama tak zmieni nawet z automatu)? Widziałem w innych skryptach, że ludzie to rozwiązują odejmując 1 od wielkości tablicy, wtedy wychodzi wynik, który można przypisać indexowi, ale jest jakiś bardziej sensowny i mniej uprzykrzający życie sposób na to? Bo teraz wystarczyłoby gdzieś zapomnieć odjąć jedynkę od tablicy i wszystko się pierdzieli i działa nie tak jak powinno a ciężko potem znaleźć gdzie jest błąd.


Awatar użytkownika
Pan Szatan
Modder
Modder
Posty: 6207
Rejestracja: 05 gru 2013, 13:16
Lokalizacja: Paradise
Postawił piwo: 5 razy
Otrzymał  piwo: 8 razy
Kontakt:

05 wrz 2018, 19:45

Skrypt ma 6 linii a ja nic z tego nie rozumiem poza Defaultproperties i jaka znowu tablica? xD
Ostatnio zmieniony 05 wrz 2018, 19:46 przez Pan Szatan, łącznie zmieniany 1 raz.


I'm fucking insane in the brain. :axe:
Awatar użytkownika
seebeek17
Modder
Modder
Posty: 8399
Rejestracja: 10 cze 2013, 13:25
Lokalizacja: Z Zewnątrz
Kontakt:

05 wrz 2018, 20:38

Pan Szatan pisze:tablica
Na pewno nie ta w szkole. xD

Kod: Zaznacz cały

var&#40;&#41; array<string> StringList; 
To jest deklaracja tablicy dynamicznej.

Tym zmieniasz np. teksturę w skrypcie

Kod: Zaznacz cały

Skins&#40;0&#41;=Texture'paczka.tekstura'
Skins&#40;1&#41;=Texture'paczka.tekstura2
Skins&#40;2&#41;=Texture'paczka.tekstura3''
Ja chcę się dowiedzieć dlaczego po zliczeniu elementów całej tablicy (czyli np. ile jest tych Skins(x) wywala liczbę o 1 większą, niż jest to w nawiasie Skins. :P

Przy tych default ze Skins(x), Skins.Length będzie równe 3 (bo 3 zadeklarowane "textury"), ale żeby zmienić np. ostatnią to musisz wpisać w kodzie Skins[2] - a nie 3, czyli tyle ile podało length. Ez? :D


Awatar użytkownika
Tiquill
V.I.P.
V.I.P.
Posty: 14479
Rejestracja: 25 sty 2007, 02:00
Lokalizacja: z naprzeciwka
Postawił piwo: 1 raz
Otrzymał  piwo: 1 raz
Kontakt:

05 wrz 2018, 21:32

Twoja opowieść nie jest specjalnie czytelna. Ale patrząc na kod i rozumiejąc, że dziwisz się, że daje 0. To:

A gdzie zliczanie i++ gdzie pętla for? Length puste to i 0 w odpowiedzi. Rób to prawilno. ;)
Ostatnio zmieniony 01 sty 1970, 01:00 przez Tiquill, łącznie zmieniany 1 raz.


Zawsze jest ryzyko, że wyczerpałeś już limit dobrych dni i czeka cię już tylko samo zło...
Obrazek
Awatar użytkownika
Tiquill
V.I.P.
V.I.P.
Posty: 14479
Rejestracja: 25 sty 2007, 02:00
Lokalizacja: z naprzeciwka
Postawił piwo: 1 raz
Otrzymał  piwo: 1 raz
Kontakt:

06 wrz 2018, 23:07

seebeek17, coś się zacięło? Demotywujesz mnie.


Zawsze jest ryzyko, że wyczerpałeś już limit dobrych dni i czeka cię już tylko samo zło...
Obrazek
Awatar użytkownika
seebeek17
Modder
Modder
Posty: 8399
Rejestracja: 10 cze 2013, 13:25
Lokalizacja: Z Zewnątrz
Kontakt:

07 wrz 2018, 01:06

Tiquill pisze:seebeek17, coś się zacięło? Demotywujesz mnie.
Czekam na jakieś inne odpowiedzi jeszcze.

Tak, najlepiej zliczyć tablice pętlą for, tylko np. w instrukcjach warunkowych if/else tego nie zrobisz.

Spróbuję jeszcze raz wyjaśnić w czym problem. Masz przykładowo 2 skrypty. W jednym chcesz zmienić np. pierwszą teksturę ze Skins, w drugim masz ustawioną jedną teksturę (jest tylko Skins(0) ) w defaultproperties, tzw. pobierasz teksturę z drugiego skryptu, by ją ustawić w tym pierwszym.

W tym przypadku Skins.Length jest równy 1 (bo jedna przypisana tekstura w 2 skrypcie).
Ale już żeby zmienić wartość Skins musisz napisać Skins(0). Zawsze użycie ".Length" daje wynik o jeden większy. Jakbyś np. użył wyniku z .Length do zmienienia wartości tablicy (tutaj byś napisał Skins(1) - czyli tyle ile wywali ci Skins.Length), to zmienisz wartość której nie ma. :P

Albo jak chcesz np. zmienić ostatnią wartość tablicy:

Kod: Zaznacz cały

function ZmienOstatnia&#40;&#41;
&#123;
	local array<Material> Skins;
	local int Index;
	
	Index = Skins.Length;	// wynik to 3
	
	Skins&#91;Index&#93; = NewTexture;	// zle
	
	Skins&#91;Index-1&#93; = NewTexture;	// dobrze
&#125;

defaultproperties
&#123;
	Skins&#40;0&#41;
	Skins&#40;1&#41;
	Skins&#40;2&#41;
&#125;


Awatar użytkownika
Tiquill
V.I.P.
V.I.P.
Posty: 14479
Rejestracja: 25 sty 2007, 02:00
Lokalizacja: z naprzeciwka
Postawił piwo: 1 raz
Otrzymał  piwo: 1 raz
Kontakt:

07 wrz 2018, 01:42

seebeek17 pisze:Tak, najlepiej zliczyć tablice pętlą for, tylko np. w instrukcjach warunkowych if/else tego nie zrobisz.
Oczywiście, że zrobisz. Co ma warunek if do tej tablicy? Musisz koniecznie dawać w tym warunku wynik Lenght?

Co ty w ogóle chcesz zrobić, co? Zliczyć tylko jakieś obiekty? Wylistować? Podaj mi kod na priva, jeśli oczywiście chcesz. Bo wiesz... Podawanie jakiegoś ad hoc przykładu jest, może być śmiechowe. ;) Piszę z fona, juz do snu, więc kod niepełny, ale chyba załapiesz:

Kod: Zaznacz cały

var Material PierwszaTx, DrugaTx;
var bool bBierzSkina;

function ZmienSkina&#40;&#41;
&#123;
   local MySuperHero hero;   //chodzi oczywiscie o klase
   local AleLaska laska;         // jw

   if&#40;bBierzSina&#41;
   &#123;
      PierwszaTx = hero.Skins&#40;0&#41;;   //pobrales jedyna defaultowa skore. nie pamietam teraz czy tak sie to zapisuje, chodzi o sama idee
      DrugaTx = laska.Skins&#40;2&#41;;   // pobrales trzecia skore z twojej klasy laska pierwsza klasa xD

   log&#40;"Skiny pobrane. Bez zadnej tablicy. Po wuja tu Lenght?"&#41;;
   &#125;
&#125;
EDIT:
Owszem, wiem że celem nadrzędnym jest to, by pozbyć się niewygody -1. Ale w podawanych przykładach wcale nie musisz używać tablicy. Więc: co jest wazniejsze? Pokonać tablicę? Czy osiągnąć cel niekoniecznie poprzez Lenght. Ja widzę drogę drugą, prostrzą.
Ostatnio zmieniony 07 wrz 2018, 01:52 przez Tiquill, łącznie zmieniany 1 raz.


Zawsze jest ryzyko, że wyczerpałeś już limit dobrych dni i czeka cię już tylko samo zło...
Obrazek
Awatar użytkownika
seebeek17
Modder
Modder
Posty: 8399
Rejestracja: 10 cze 2013, 13:25
Lokalizacja: Z Zewnątrz
Kontakt:

07 wrz 2018, 02:32

Tiquill pisze: Piszę z fona, juz do snu, więc kod niepełny, ale chyba załapiesz:
Jest git
Tiquill pisze:Owszem, wiem że celem nadrzędnym jest to, by pozbyć się niewygody -1. Ale w podawanych przykładach wcale nie musisz używać tablicy. Więc: co jest wazniejsze? Pokonać tablicę? Czy osiągnąć cel niekoniecznie poprzez Lenght. Ja widzę drogę drugą, prostrzą.
Jasne, dzięki za wstawkę. Można to zrobić tak, i to nawet będzie lepsze ogólnie, tylko nadal potrzebuję używać tego .Length.
Tiquill pisze:Co ty w ogóle chcesz zrobić, co? Zliczyć tylko jakieś obiekty? Wylistować? Podaj mi kod na priva, jeśli oczywiście chcesz.
Znaleźć jakiś sposób, żeby .Length nie podawało indexu większego o 1. Na razie planuję technicznie kolejny projekt, nic gotowego jeszcze.

No ale nic, wychodzi że zliczanie pętlą for będzie najrozsądniejsze. :)


Awatar użytkownika
Rycho3D
Modder
Modder
Posty: 11978
Rejestracja: 24 kwie 2011, 15:47
Lokalizacja: SinCity
Postawił piwo: 8 razy
Otrzymał  piwo: 1 raz
Kontakt:

07 wrz 2018, 13:24

Ja chcę się dowiedzieć dlaczego po zliczeniu elementów całej tablicy (czyli np. ile jest tych Skins(x) wywala liczbę o 1 większą, niż jest to w nawiasie Skins. :P
Bo 1 to skins 0


8=======D
Awatar użytkownika
Tiquill
V.I.P.
V.I.P.
Posty: 14479
Rejestracja: 25 sty 2007, 02:00
Lokalizacja: z naprzeciwka
Postawił piwo: 1 raz
Otrzymał  piwo: 1 raz
Kontakt:

11 wrz 2018, 15:29

seebeek17 pisze:Pomimo, że "długość" tablicy wyjdzie 1, to i tak musimy wpisać 0 w index tej tablicy. Tzw nawet jak będzie StringList[AktualnyIndex] to AktualnyIndex i tak zmieni się na 0, pomimo wcześniejszego ustawienia go na liczbę 1. Wyjaśni mi ktoś dlaczego tak jest?
StringList.Length liczy wielkość tablicy od liczby 1 (noo, trochę logiczne, bo "jeden" element tablicy, ale dlaczego sam index trzeba ustawiać jako 0 (gra sama tak zmieni nawet z automatu)?
Dobra, przeczytałem na spokojnie ten temat. I przyznam, że nie bardzo rozumiem, czego nie rozumiesz. Bo mnie wydaje się to oczywiste, zobacz: Length podaje faktyczną liczbę po zliczeniu, sumę. Jak jest 1 - no to 1, jak 2 - to 2... Zaś listowanie rozpoczyna się od wartości 0 a nie 1 - tak jak liczby naturalne. Normalnie ludzie nie zaczynają liczenia od 0, tylko od 1. Ale matematyka - to matematyka, tam 0 to też liczba. Tego nie zmienisz, maszyny, panie, maszyny. ;)

Trzeba to było jakoś pogodzić, stąd ten -1.

seebeek17 pisze:ale jest jakiś bardziej sensowny i mniej uprzykrzający życie sposób na to?
seebeek17 pisze:tylko nadal potrzebuję używać tego .Length
To trochę taka akademicka rozmowa, ale - czemu nie, można spróbować. ;)

Przychodzi mi do głowy pomysł, by użyć function bool i w niej zamieścić tablicę, która to funkcja zwracałaby takie coś:

Kod: Zaznacz cały

return liczba -1;
Wtedy używasz, zamiast tradycyjnego zapisu z .Length - jej wyniku. Dasz radę zrobić sobie?

seebeek17 pisze:Albo jak chcesz np. zmienić ostatnią wartość tablicy:
I za tą pomocą tylko ostatnią wartość. A może czegoś nie wiem? Zaskocz mnie. xD
seebeek17 pisze:Czekam na jakieś inne odpowiedzi jeszcze.
Od Bozi? xD ;)


Zawsze jest ryzyko, że wyczerpałeś już limit dobrych dni i czeka cię już tylko samo zło...
Obrazek
ODPOWIEDZ