Skip to content

Commit 8dc511e

Browse files
committed
bunch two
1 parent 58d7852 commit 8dc511e

File tree

10 files changed

+606
-497
lines changed

10 files changed

+606
-497
lines changed
Lines changed: 68 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,57 @@
11
---
2-
title: Instrukcja do Fabryk kolekcji
3-
brief: Instrukcja ta wyjaśnia jak używać Fabryk kolekcji, żeby tworzyć hierarchię obiektów gry.
2+
title: Fabryki kolekcji
3+
brief: Ta instrukcja wyjaśnia, jak używać komponentów Collection factory do tworzenia hierarchii obiektów gry.
44
---
55

6-
# Fabryka kolekcji (Collection factory)
6+
# Fabryki kolekcji
77

8-
Fabryki kolekcji to komponenty używane do tworzenia grup i hierarchi obiektów gry przechowywanych w pliku danej kolekcji w trakcie działania programu.
8+
Komponent Collection factory służy do tworzenia grup i hierarchii obiektów gry zapisanych w plikach kolekcji w działającej grze.
99

10-
Kolekcje są potężnym narzędziem do tworzenia szablonów, które można utylizować wielokrotnie (podobnie jak prefaby). Więcej szczegółów na temat kolekcji znajdziesz w [dokumentacji podstawowych elementów Defold](/manuals/building-blocks#collections). Kolekcje mogą być umieszczane bezpośrednio w Edytorze lub tworzone dynamicznie.
10+
Kolekcje są w Defold wygodnym mechanizmem tworzenia szablonów wielokrotnego użytku, czyli odpowiednika prefabów. Przegląd kolekcji znajdziesz w [dokumentacji o blokach budujących](/manuals/building-blocks#collections). Kolekcje można umieszczać w edytorze albo dynamicznie wstawiać do gry.
1111

12-
Używając fabryki kolekcji możesz tworzyć w świecie gry zawartość pliku kolekcji. Jest to uproszczonie analogicznego procesu tworzenia wszystkich obiektów gry opisanych w danym pliku kolekcji i przypisywanie im relacji rodzic-dziecko również opisanych w takim pliku. Typowym przykładem jest tworzenie postaci wrogów składających się z wielu różnych obiektów (np. jedno z wariantów ciał + jedna z broni).
12+
Za pomocą komponentu Collection factory możesz tworzyć w świecie gry zawartość pliku kolekcji. To odpowiednik utworzenia przez Factory wszystkich obiektów gry zapisanych w kolekcji, a następnie odtworzenia relacji rodzic-dziecko pomiędzy nimi. Typowym zastosowaniem jest tworzenie przeciwników złożonych z wielu obiektów gry, na przykład wroga i jego broni.
1313

1414
## Tworzenie kolekcji
1515

16-
Załóżmy, że chcesz, żeby obiekt reprezentujący Twojego bohatera miał również obiekt-dziecko reprezentujący tarczę. Zbudujemy taką hierarchię w pliku kolekcji i zapiszemy jako "bean.collection".
16+
Załóżmy, że chcemy mieć obiekt gry postaci oraz osobny obiekt gry tarczy będący dzieckiem tej postaci. Budujemy taką hierarchię w pliku kolekcji i zapisujemy ją jako `bean.collection`.
1717

1818
::: sidenote
19-
Komponent typu pełnomocnik kolekcji (*collection proxy*) różni się od fabryki i jest używany do stworzenia nowego świata gry, a co za tym idzie również osobnego świata fizyki z obiektami bazującymi na hierarchi w pliku danej kolekcji. Nowy świat ma swoje nowe gniazdo (socket), więc i nową przestrzeń adresową. Wszystkie zasoby z danej kolekcji są wczytywane przez pełnomocnika, kiedy wyślesz do niego wiadomość o rozpoczęciu wczytywania. Jest więc to przydatne przykładowo przy tworzeniu nowych poziomów w grze. Nowy świat gry wiąże się jednak z zajęciem sporej ilości nowych zasobów w pamięci, więc lepiej nie używać ich do dynamicznego wczytywania. Więcej szczegółów znajdziesz w [dokumentacji pełnomocników kolekcji](/manuals/collection-proxy).
19+
Komponent *collection proxy* służy do tworzenia nowego świata gry, w tym osobnego świata fizyki, na podstawie kolekcji. Nowy świat jest dostępny przez nowe gniazdo adresowe. Wszystkie zasoby zawarte w kolekcji są ładowane przez pełnomocnika po wysłaniu do niego wiadomości rozpoczynającej ładowanie. To bardzo przydatne na przykład przy zmianie poziomów w grze. Nowe światy gry mają jednak spory narzut, więc nie należy ich używać do dynamicznego ładowania małych elementów. Więcej informacji znajdziesz w [dokumentacji Collection proxy](/manuals/collection-proxy).
2020
:::
2121

2222
![Collection to spawn](images/collection_factory/collection.png)
2323

24-
Dodajemy następnie komponent typu *Collection factory* (Fabryka kolekcji) do obiektu gry, który będzie odpowiedzialny za stworzenie obiektów i hierarchi z pliku kolekcji "bean.collection" podanego jako właściwość *Prototype*:
24+
Następnie dodajemy *Collection factory* do obiektu gry, który ma odpowiadać za tworzenie instancji, i ustawiamy `bean.collection` jako *Prototype* komponentu:
2525

2626
![Collection factory](images/collection_factory/factory.png)
2727

28-
Tworzenie bohatera i tarczy jest teraz tylko kwestią wywołania funckji `collectionfactory.create()`:
28+
Utworzenie postaci i tarczy sprowadza się teraz do wywołania `collectionfactory.create()`:
2929

3030
```lua
3131
local bean_ids = collectionfactory.create("#bean_factory")
3232
```
3333

34-
Funkcja przyjmuje 5 parameterów:
34+
Funkcja przyjmuje 5 parametrów:
3535

3636
`url`
37-
: Identyfikator fabryki kolekcji, która ma być użyta do tworzenia nowego zestawu obiektów.
37+
: Id komponentu Collection factory, który ma utworzyć nowy zestaw obiektów gry.
3838

3939
`[position]`
40-
: (opcjonalnie) Pozycja w świecie (bezwzględna) nowych obiektów. Typu `vector3`. Jeśli nie określisz pozycji, obiekty będą tworzone w miejscu komponentu fabryki kolekcji.
40+
: Opcjonalna pozycja tworzonych obiektów gry w przestrzeni świata. Powinna mieć typ `vector3`. Jeśli jej nie podasz, obiekty zostaną utworzone w pozycji komponentu Collection factory.
4141

4242
`[rotation]`
43-
: (opcjonalnie) Orientacja w świecie (bezwzględna) nowych obiektów. Typu `quat`. Jeśli nie określisz orientacji, obiekty będą tworzone z orientacją komponentu fabryki kolekcji.
43+
: Opcjonalny obrót tworzonych obiektów gry w przestrzeni świata. Powinien mieć typ `quat`.
4444

4545
`[properties]`
46-
: (opcjonalnie) Właściwości - tabela Lua o strukturze par `id`-`table` używana przy tworzeniu obiektów gry. Poniżej opisano jak skonstruować taką tabelę.
46+
: Opcjonalna tabela Lua zawierająca pary `id`-`table`, używana do inicjalizowania tworzonych obiektów gry. Poniżej opisano, jak ją zbudować.
4747

4848
`[scale]`
49-
: (opcjonalnie) Skala tworzonych obiektów, określona jako liczba (`number`) (większa od 0), która określa jednolitą skalę wzdłuż wszystkich osi. Możesz też podać wektor (`vector3`), gdzie każdy komponent będzie odpowiadał skali wzdłuż danej osi.
49+
: Opcjonalna skala tworzonych obiektów gry. Może być podana jako `number` większy od 0, co oznacza jednolite skalowanie we wszystkich osiach. Możesz też przekazać `vector3`, gdzie każdy komponent określa skalę na odpowiedniej osi.
5050

51-
Funkcja `collectionfactory.create()` zwraca tabelę z identyfikatorami utworzonych obiektów gry. Klucze tabeli mapują hashe kolekcji do lokalnych identyfikatorów każdego z obiektów:
51+
`collectionfactory.create()` zwraca tabelę z identyfikatorami utworzonych obiektów gry. Klucze tabeli mapują hash lokalnego id obiektu w kolekcji na runtime id danego obiektu:
5252

5353
::: sidenote
54-
Relacja rodzic-dziecko między "bean" a "shield" *NIE* jest odzwierciedlona w zwracanej tabeli. Ta relacja istnieje jedynie w grafie sceny w trakcie działania programu, co określa jak obiekty są ustawione w stosunku do siebie. Przypisywanie rodzica nigdy nie zmienia identyfikatora obiektu.
54+
Relacja rodzic-dziecko między `bean` i `shield` *nie* jest odzwierciedlona w zwracanej tabeli. Ta relacja istnieje tylko w runtime scene-graph, czyli w sposobie, w jaki obiekty są razem transformowane. Zmiana rodzica nigdy nie zmienia id obiektu.
5555
:::
5656

5757
```lua
@@ -64,89 +64,106 @@ pprint(bean_ids)
6464
-- hash: [/bean] = hash: [/collection0/bean],
6565
-- }
6666
```
67-
68-
1. Prefix `/collection[N]/`, gdzie `[N]` jest licznikiem dodanym do ID, żeby zidentyfikować obiekt w sposób unikalny dla każdej instancji:
67+
1. Do id dodawany jest prefiks `/collection[N]/`, gdzie `[N]` to licznik, aby każdą instancję jednoznacznie rozróżnić.
6968

7069
## Właściwości
7170

72-
Podczas tworzenia kolekcji, możesz przekazać właściwości do każdego obiektu gry konstruując tabelę, gdzie klucze odpowiadają identyfikatorom obiektów, a wartości są tabelami z właściwościami (scrip properties) dla danych obiektów.
71+
Podczas tworzenia kolekcji możesz przekazać właściwości do poszczególnych obiektów gry, budując tabelę, w której kluczami są id obiektów, a wartościami tabele z właściwościami skryptu do ustawienia.
7372

7473
```lua
7574
local props = {}
7675
props[hash("/bean")] = { shield = false }
7776
local ids = collectionfactory.create("#bean_factory", nil, nil, props)
7877
```
7978

80-
Załóżmy, że obiekt "bean" w kolekcji "bean.collection" ma właściwość "shield". [Instrukcja do właściwości skryptów](/manuals/script-properties) zawiera więcej szczegółów na ten temat.
79+
Załóżmy, że obiekt gry `bean` w `bean.collection` definiuje właściwość `shield`. [Instrukcja o właściwościach skryptu](/manuals/script-properties) zawiera więcej informacji o takich właściwościach.
8180

8281
```lua
83-
-- bean/controller.script
82+
-- plik bean/controller.script
8483
go.property("shield", true)
8584

8685
function init(self)
8786
if not self.shield then
8887
go.delete("shield")
89-
end
88+
end
9089
end
9190
```
9291

93-
## Wczytywanie dynamiczne zasobów
92+
## Dynamiczne ładowanie zasobów fabryki
9493

95-
Zaznaczając właściwość *Load Dynamically* fabryki kolekcji, silnik odłoży wczytywanie zasobów danej kolekcji aż do momentu rozpoczęcia tworzenia.
94+
Po zaznaczeniu pola *Load Dynamically* we właściwościach Collection factory silnik opóźni ładowanie zasobów powiązanych z fabryką.
9695

9796
![Load dynamically](images/collection_factory/load_dynamically.png)
9897

99-
Z odznaczoną opcją, silnik wczyta prototypy zasobów kolekcji w momencie wczytywania komponentu fabryki kolekcji, więc będzie można je utworzyć w świecie gry natychmiastowo.
98+
Gdy pole nie jest zaznaczone, silnik ładuje zasoby prototypu podczas ładowania komponentu Collection factory, dzięki czemu są one od razu gotowe do tworzenia instancji.
10099

101-
Z zaznaczoną opcją, możesz użyć fabryki na dwa sposoby:
100+
Gdy pole jest zaznaczone, masz dwa sposoby użycia:
102101

103-
Wczytywanie synchroniczne:
104-
: Wywołaj [`collectionfactory.create()`](/ref/collectionfactory/#collectionfactory.create:url-[position]-[rotation]-[properties]-[scale]) kiedy chcesz utworzyć obiekty kolekcji. Funkcja wczyta wszystkie zasoby potrzebe do utworzenia obiektów synchronicznie (co może spowodować zwieszenie programu w zależności od wielkości zasobów), a następnie utworzy obiekty z danymi zasobami.
102+
Wczytywanie synchroniczne
103+
: Wywołaj [`collectionfactory.create()`](/ref/collectionfactory/#collectionfactory.create:url-[position]-[rotation]-[properties]-[scale]) wtedy, gdy chcesz tworzyć obiekty. Spowoduje to synchroniczne załadowanie zasobów, co może wywołać chwilowe przycięcie, a następnie utworzenie nowych instancji.
105104

106105
```lua
107106
function init(self)
108-
-- Żadne zasoby fabryki nie są załadowane kiedy kolekcja rodzic
109-
-- zawierająca daną fabrykę kolekcji jest utworzona.
110-
-- Wywołanie create spowoduje wczytanie zasobów synchronicznie.
111-
self.go_ids = collecionfactory.create("#collectionfactory")
107+
-- Zasoby fabryki nie są ładowane, gdy ładowana jest kolekcja
108+
-- nadrzędna komponentu Collection factory. Wywołanie create
109+
-- bez wcześniejszego load wczyta zasoby synchronicznie.
110+
self.go_ids = collectionfactory.create("#collectionfactory")
112111
end
113112

114-
function final(self)
115-
-- Usuwanie obiektów gry. Zwolni to zasoby.
116-
-- W tym przypadku obiekty są usuwane, ponieważ
117-
-- fabryka kolekcji nie ma żadnych referencji.
113+
function final(self)
114+
-- Usuń obiekty gry. To zmniejszy licznik referencji zasobów.
115+
-- W tym przypadku zasoby zostaną usunięte, ponieważ komponent
116+
-- Collection factory nie trzyma już do nich referencji.
118117
go.delete(self.go_ids)
119118

120-
-- Wywołanie unload nie zrobi nic, ponieważ
121-
-- fabryka kolekcji nie ma żadnych referencji.
119+
-- Wywołanie unload nic nie zrobi, ponieważ fabryka
120+
-- nie ma żadnych referencji.
122121
collectionfactory.unload("#factory")
123122
end
124123
```
125124

126-
Wczytywanie asynchroniczne:
127-
: Wywołaj [`collectionfactory.load()`](/ref/collectionfactory/#collectionfactory.load:[url]-[complete_function]), żeby jawnie załadować zasoby asynchronicznie. Kiedy zasoby będą gotowe, skrypt, w którym wywołano load() otrzyma callback.
125+
Wczytywanie asynchroniczne
126+
: Wywołaj [`collectionfactory.load()`](/ref/collectionfactory/#collectionfactory.load:[url]-[complete_function]), aby jawnie załadować zasoby asynchronicznie. Gdy zasoby będą gotowe do tworzenia obiektów, otrzymasz callback.
128127

129128
```lua
130-
--callback, który zostanie wywołany po wczytaniu zasobów:
131129
function load_complete(self, url, result)
132-
-- Wczytywanie zakończone, zasoby są gotowe do utworzenia
130+
-- Ładowanie zakończone, zasoby są gotowe do tworzenia instancji.
133131
self.go_ids = collectionfactory.create(url)
134132
end
135133

136134
function init(self)
137-
-- Żadne zasoby nie są wczytywane przy utworzeniu kolekcji
138-
-- która jest rodzicem komponentu fabryki kolekcji.
139-
-- Zasoby są wczytywane po wywołaniu load():
135+
-- Zasoby fabryki nie są ładowane, gdy ładowana jest kolekcja
136+
-- nadrzędna komponentu Collection factory. Wywołanie load
137+
-- spowoduje ich załadowanie.
140138
collectionfactory.load("#factory", load_complete)
141139
end
142140

143141
function final(self)
144-
-- Usuwanie obiektu gry. Zasoby są zwalniane.
145-
-- W tym przypadku zasoby nie są usuwane, ponieważ
146-
-- fabryka kolekcji nadal posiada do nich referencję.
142+
-- Usuń obiekty gry. To zmniejszy licznik referencji zasobów.
143+
-- W tym przypadku zasoby nie zostaną usunięte, ponieważ komponent
144+
-- Collection factory nadal trzyma do nich referencję.
147145
go.delete(self.go_ids)
148146

149-
-- Wywołanie unload zwolni zasoby utrzymywane przez farbykę i usunie je
147+
-- Wywołanie unload zmniejszy licznik referencji zasobów
148+
-- trzymanych przez komponent fabryki, co doprowadzi do ich usunięcia.
150149
collectionfactory.unload("#factory")
151150
end
152151
```
152+
153+
## Dynamiczny prototyp
154+
155+
Możesz zmienić to, jaki *Prototype* potrafi tworzyć Collection factory, zaznaczając pole *Dynamic Prototype* we właściwościach komponentu.
156+
157+
![Dynamic prototype](images/collection_factory/dynamic_prototype.png)
158+
159+
Gdy opcja *Dynamic Prototype* jest włączona, komponent Collection factory może zmieniać prototyp za pomocą `collectionfactory.set_prototype()`. Przykład:
160+
161+
```lua
162+
collectionfactory.unload("#factory") -- zwolnij poprzednie zasoby
163+
collectionfactory.set_prototype("#factory", "/main/levels/level1.collectionc")
164+
local ids = collectionfactory.create("#factory")
165+
```
166+
167+
::: important
168+
Gdy opcja *Dynamic Prototype* jest włączona, liczba komponentów w kolekcji nie może zostać zoptymalizowana i kolekcja właściciela będzie używać domyślnych limitów komponentów z pliku *game.project*.
169+
:::

0 commit comments

Comments
 (0)