ソースを参照

Added Polish translation for physics and animation manuals. Updated old animation manual. (#361)

Pawel 1 年間 前
コミット
9c9dce248e

+ 10 - 474
docs/pl/manuals/animation.md

@@ -1,481 +1,17 @@
 ---
-title: Animacja w silniku Defold
-brief: Instrukcja opisuje wsparcie dla animacji w silniku Defold.
+title: Animacja w Defoldzie
+brief: Ta instrukcja przedstawia różne możliwości animacji w Defoldzie
 ---
 
-# Animacja
+# Animacja w Defoldzie
 
-Defold posiada wbudowane wsparcie dla różnych typów animacji, których możesz używać jako źródło dla komponentów graficznych:
+Defold posiada wbudowane wsparcie dla wielu typów animacji, które można wykorzystać jako źródło grafiki komponentów wizualnych:
 
-* Animacja poklatkowa (Flip-book)
-* Animacja szkieletowa 2D (Spine)
-* Animacja szkieletowa 3D (3D skinned)
-* Animacja właściwości
+* [Animacje poklatkowe - Flip-book](/manuals/flipbook-animation) - Sukcesywne odtwarzanie serii statycznych obrazków/klatek animacji, jedna za drugą
+* [Animacje Modeli](/manuals/model-animation) - Odtwarzanie trójwymiarowej animacji modeli 3D
+* [Animacje Właściwości](/manuals/property-animation) - Animowanie Właściwości (ang. properties), czyli wartości takich jak pozycja, skala, rotacja i wiele innych, w tym niestandardowe, zdefiniowane przez użytkownika.
 
-## Flip-book - animacja poklatkowa
+Dodatkowe formaty animacji mogą być używane poprzez oficjalne rozszerzenia (extensions):
 
-Animacja poklatkowa składa się z serii obrazów, które są pokazywane jeden za drugim, więc patrząc na nie sprawiają wrażenie ruchu. Technika ta jest bardzo podobna do tradycyjnej animacji używanej w kinematografii [https://pl.wikipedia.org/wiki/Animacja](https://pl.wikipedia.org/wiki/Animacja) i oferuje nieograniczoną kontrolę, ponieważ każda klatka może być modyfikowana indywidualnie. Jednakże pamięć zajmowana przez wszystkie obrazy składające się na taką animację może być duża w zależności od ilości klatek i ich wielkości. Płynność animacji zależy od liczby klatek pokazywanych w każdej sekundzie (FPS z ang. frames per second), co wymaga oczywiście większej ilości pracy. Animacje typu flip-book w Defoldzie są przechowywane albo jako indywidualne obrazy umieszczone w galerii zwanej [Atlas](/manuals/atlas), albo jako obrazy umieszczone w bezpośrednim sąsiedztwie, w poziomej sekwencji jak kafelki w tzw. [Tile Source](/manuals/tilesource).
-
-  ![Animation sheet](images/animation/animsheet.png){.inline}
-  ![Run loop](images/animation/runloop.gif){.inline}
-
-## Spine - animacja szkieletowa
-
-Wsparcie dla animacji typu Spine w Defoldzie umożliwia tworzenie animacji szkieletowych z obrazów 2D (https://pl.wikipedia.org/wiki/Rigging). Jest to zupełnie inna technika niż animacja flip-book i bliżej jej do płynnych ruchów, bez podzielenia obrazu na poszatkowane klatki. Przykładowo w animacjach wykorzystujących wycinanki [https://en.wikipedia.org/wiki/Cutout_animation](https://en.wikipedia.org/wiki/Cutout_animation) osobne części (np. korpus, ramiona, nogi, oczy itp.) są poruszane indywidualnie w każdej klatce z zachowaniem stałego szkieletu i określonych połączeń między częściami, np. przegubów. Animacja typu Spine umożliwia stworzenie właśnie takiego wirtualnego, niewidzialnego szkieletu składającaego się z hierarchii konkretnie połączonych części - _kości_ (ang. bones) połączonych w łańcuchy kinematyczne. Taki szkielet, czy z ang. _rig_, jest właśnie animowany i przyczepione są do każdej z kości odpowiednie części - obrazy. Defold wspiera animacje stworzone w lub wyeksportowane do [formatu Spine JSON](http://esotericsoftware.com/spine-json-format). Animacja szkieletowa jest zwykle bardzo płynna, ponieważ silnik interpoluje położenie i orientację każdej z "kości" dla każdej klatki.
-
-  Szczegóły dotyczące importowania danych z programu Spine do komponentu "Spine model" w Defoldzie znajdziesz tutaj: [Instrukcja Spine](/manuals/spine).
-
-  ![Spine animation](images/animation/spine_animation.png){.inline}
-  ![Run loop](images/animation/frog_runloop.gif){.inline}
-
-## Animacja szkieletowa 3D
-
-Animacja szkieletowa trójwymiarowych modeli jest podobna do animacji typu Spine, z tym, że działa również w trójwymiarze. Model 3D nie jest jednak podzielony na osobne części związane ze sobą w łańcuch kinematyczny, a w zamian tego, ruch "kości" deformuję siatkę wierzchołków (ang. vertices) reprezentującą obiekt 3D, a Ty masz kontrolę nad tym w jaki sposób kości wpływają na taką deformację.
-
-  Szczegóły dotyczące importowania danych 3D do komponentu "Model" w Defoldzie znajdziesz tutaj: [Instrukcja Modeli 3D](/manuals/model).
-
-  ![Blender animation](images/animation/blender_animation.png){.inline srcset="images/animation/[email protected] 2x"}
-  ![Wiggle loop](images/animation/suzanne.gif){.inline}
-
-## Animacja właściwości
-
-Wszystkie numeryczne właściwości (liczby, wektory (vector3, vector4) i kwaterniony) i stałe [shader'ów](https://pl.wikipedia.org/wiki/Shader) mogą być animowane przez wbudowany system animacji, używając funkcji [`go.animate()`](https://defold.com/ref/stable/go/#go.animate). Defold automatycznie "wyśrodkuje" właściwości dla Ciebie w zależności od podanego sposobu odtwarzania (ang. playback) czy funkcji "wygładzania" (ang. easing - więcej: [Easing functions](https://easings.net)) predefiniowanych lub Twoich własnych.
-
-  ![Property animation](images/animation/property_animation.png){.inline srcset="images/animation/[email protected] 2x"}
-  ![Bounce loop](images/animation/bounce.gif){.inline}
-
-## Odtwarzanie animacji poklatkowych (flip-book)
-
-Sprite'y i węzły interfejsu GUI mogą odtwarzać animacje poklatkowe i masz nad tym całkowitą kontrolę w trakcie działania programu.
-
-Sprite'y
-: Aby odtworzyć animację w trakcie działania programu używa się funkcji [`sprite.play_flipbook()`](/ref/sprite/?q=play_flipbook#sprite.play_flipbook:url-id-[complete_function]-[play_properties]). Poniżej przykład.
-
-Węzły interfejsu GUI
-: Aby odtworzyć animację w trakcie działania programu używa się funkcji [`gui.play_flipbook()`](/ref/gui/?q=play_flipbook#gui.play_flipbook:node-animation-[complete_function]-[play_properties]). Poniżej przykład.
-
-::: sidenote
-Tryb odtwarzania (playback mode) "once ping-pong" odtworzy animację klatka po klatce do samego końca, a następnie odtworzy ją jeszcze raz w odwrotnej kolejności, od tyłu, ale do **drugiej** klatki animacji, a nie do pierwszej. Jest to zabieg służący łatwemu wiązaniu animacji w łańcuchy.
-:::
-
-### Przykład animacji poklatkowej ze spritem
-
-Załóżmy, że Twoja gra posiada możliwość uniku, która pozwala graczom nacisnąć klawisz, aby wykonać unik. Możesz wykonać 4 animacje, żeby w pełni pokazać unik:
-
-"idle"
-: Zapętlona animacja stojącej postaci będącej w bezczynności.
-
-"dodge_idle"
-: Zapętlona animacja postaci pochylonej, będącej w trakcie trwania uniku.
-
-"start_dodge"
-: Jednokrtotnie odtwarzana animacja postaci w momencie przejścia animacji z pozycji stojącej do pochylonej w celu wykonania uniku.
-
-"stop_dodge"
-: Jednokrtotnie odtwarzana animacja postaci w momencie przejścia animacji z pozycji uniku z powrotem do pozycji stojącej.
-
-Skrypt poniżej przedstawia potrzebną logikę:
-
-```lua
-
-local function play_idle_animation(self)
-    if self.dodge then
-        sprite.play_flipbook("#sprite", hash("dodge_idle"))
-    else
-        sprite.play_flipbook("#sprite", hash("idle"))
-    end
-end
-
-function on_input(self, action_id, action)
-    -- "dodge" is our input action
-    if action_id == hash("dodge") then
-        if action.pressed then
-            sprite.play_flipbook("#sprite", hash("start_dodge"), play_idle_animation)
-            -- remember that we are dodging
-            self.dodge = true
-        elseif action.released then
-            sprite.play_flipbook("#sprite", hash("stop_dodge"), play_idle_animation)
-            -- we are not dodging anymore
-            self.dodge = false
-        end
-    end
-end
-```
-
-### Przykład animacji poklatkowej z węzłem GUI
-
-Przy wyborze obrazu i animacji dla węzła interfejsu graficznego (box, pie) tak naprawdę właśnie przypisujesz źródło obrazów (atlas lub tile source) i domyślną animację, tak samo jak w przypadku sprite'ów. Galeria taka jest statycznie przypisana do węzła, ale animacja może być zmieniona w trakcie trwania programu. Nieruchome obrazki są traktowane jako jednoklatkowa animacja, więc zamiana obrazu jest jednoznaczna z odtworzeniem innej animacji poklatkowej (flip-book) na węźle:
-
-```lua
-local function flipbook_done(self)
-    msg.post("#", "jump_completed")
-end
-
-function init(self)
-    local character_node = gui.get_node("character")
-    -- This requires that the node has a default animation in the same atlas or tile source as
-    -- the new animation/image we're playing.
-    gui.play_flipbook(character_node, "jump_left", flipbook_done)
-end
-```
-
-Jako trzeci argument można podać opcjonalną funkcję, która jest wywoływana w momencie zakończenia animacji (flipbook_done) - to tzw. callback. Będzie ona wywołana po skończeniu animacji, więc tylko takich, które nie są zapętlone, czyli tryby playback: `gui.PLAYBACK_ONCE_*`.
-
-## Przykład animacji szkieletowej Spine
-
-Aby odtworzyć animację na Twoim modelu, po prostu użyj funkcji [`spine.play_anim()`](/ref/spine#spine.play_anim):
-
-```lua
-local function anim_done(self)
-    -- the animation is done, do something useful...
-end
-
-function init(self)
-    -- Play the "walk" animation on component "spinemodel" and blend against previous
-    -- animation for the first 0.1 seconds, then call callback.
-    local anim_props = { blend_duration = 0.1 }
-    spine.play_anim("#spinemodel", "run", go.PLAYBACK_LOOP_FORWARD, anim_props, anim_done)
-end
-```
-
-![Spine model in game](images/animation/spine_ingame.png){srcset="images/animation/[email protected] 2x"}
-
-Jeśli animacja jest odtwarzana w trybach `go.PLAYBACK_ONCE_*` i podałeś funkcję callback w `spine.play_anim()`, funkcja ta zostanie wywołana na końcu animacji. See below for information on callbacks.
-
-### Animacja kursora na modelu Spine
-
-Jako dodatek do `spine.play_anim()` komponenty zwane *Modele Spine* posiadają właściwość zwaną "kursor" (z ang. cursor), którą można animować przy użyciu funkcji `go.animate()`. Jest to wartość numeryczna między 0 i 1, gdzie 0 oznacza początek animacji, a 1 oznacza koniec animacji:
-
-```lua
--- Set the animation on the spine model but don't run it.
-spine.play_anim("#spinemodel", "run_right", go.PLAYBACK_NONE)
-
--- Set the cursor to position 0
-go.set("#spinemodel", "cursor", 0)
-
--- Tween the cursor slowly between 0 and 1 pingpong with in-out quad easing.
-go.animate("#spinemodel", "cursor", go.PLAYBACK_LOOP_PINGPONG, 1, go.EASING_INOUTQUAD, 6)
-```
-
-::: important
-Przy uśrednianiu (tweening) lub ustawianiu kursora, wydarzenia na osi czasu mogą nie być startowane w spodziewanym czasie.
-:::
-
-### Model Spine - hierarchia kości
-
-Indywidualne kości w szkielecie Spine są reprezentowane wewnętrznie przez podstawowe obiekty (game objects). W panelu *Outline* komponentu typu model Spine ukazana jest cała hierarchia. Możesz tu zobaczyć nazwę każdej z kości (bone) i ich miejsce w hierarchii.
-
-![Spine model hierarchy](images/animation/spine_bones.png){srcset="images/animation/[email protected] 2x"}
-
-Znając nazwy poszczególnych kości możesz uzyskać id danej instancji kości w czasie działania programu i dowolnie nią manipulować. Funkcja [`spine.get_go()`](/ref/spine#spine.get_go) zwraca id danej kości a Ty możesz, przykładowo, przypisać inne obiekty jako dzieci danej kości - czyli np. wręczyć postaci pistolet w miejscu ręki, który będzie od tej pory za nią naturalnie "podążał":
-
-```lua
--- Attach pistol game object to the hand of the heroine
-local hand = spine.get_go("heroine#spinemodel", "front_hand")
-msg.post("pistol", "set_parent", { parent_id = hand })
-```
-
-### Model Spine - wydarzenia na osi czasu
-
-Animacje szkieletowe mogą wywoływać wydarzenia w określonym czasie poprzez wysłanie wiadomości w konkretnym momencie. Jest to bardzo przydatne dla wydarzeń, które powinny być zsynchronizowane z animacją, jak na przykład odtworzenie odgłosu kroku w momencie dotknięcia stopą podłogi (np. gdy stopa jest w najniższym położeniu) czy odtworzenie w tym czasie efektu cząsteczkowego reprezentującego unoszącą się chmurę kurzu. Można w takim wydarzeniu odrzucić lub dołączyć dowolny obiekt do kości czy wywołać jakąkolwiek inną funckję.
-
-Wydarzenia są dodawane w programie Spine i pokazane na osi czasu:
-
-![Spine events](images/animation/spine_events.png)
-
-Każde wydarzenie jest określone przez identyfikator ("bump" w przykładzie powyżej) i może ponadto posiadać dodatkową informację:
-
-Integer
-: Wartość numeryczna całkowita.
-
-Float
-: Wartość numeryczna zmiennoprzecinkowa.
-
-String
-: Wartość słowna, tzw. string.
-
-Kiedy animacja jest odtwarzana i następuje dane wydarzenie to wiadomość o treści `spine_event` jest wysyłana do skryptu, który tę animację uruchomił wywołaniem `spine.play()`. Wiadomość ta posiada tablicę z powyższymi informacjami oraz innymi przydatnymi niejednokrotnie elementami:
-
-`t`
-: Liczba sekund, które upłynęły już od początku animacji.
-
-`animation_id`
-: Shaszowana nazwa (id) animacji.
-
-`string`
-: Opisana wyżej shaszowana wartość słowna.
-
-`float`
-: Opisana wyżej wartość numeryczna zmiennoprzecinkowa.
-
-`integer`
-: Opisana wyżej wartość numeryczna całkowita.
-
-`event_id`
-: Shaszowana nazwa (id) wydarzenia.
-
-`blend_weight`
-: Wartość opisująca jak dużo z animacji jest "zblendowane" w danej chwili. 0 oznacza, że nic z obecnej animacji nie jest jeszcze zblendowane, a 1, że 100% animacji jest już zblendowane.
-
-```lua
--- Spine animation contains events that are used to play sounds in sync with the animation.
--- These arrive here as messages.
-function on_message(self, message_id, message, sender)
-  if message_id == hash("spine_event") and message.event_id == hash("play_sound") then
-    -- Play animation sound. The custom event data contains the sound component and the gain.
-    local url = msg.url("sounds")
-    url.fragment = message.string
-    sound.play(url, { gain = message.float })
-  end
-end
-```
-
-## 3D Model animation
-
-Models are animated with the [`model.play_anim()`](/ref/model#model.play_anim) function:
-
-```lua
-function init(self)
-    -- Start the "wiggle" animation back and forth on #model
-    model.play_anim("#model", "wiggle", go.PLAYBACK_LOOP_PINGPONG)
-end
-```
-
-::: important
-Defold wspiera obecnie tylko gotowe animacje (baked). Animacje muszą mieć macierze dla każdej z animowanych kości na każdą z klatek animacji, a nie osobno pozycję, rotację i skalę jako osobne pola. 
-
-Animacje są interpolowane liniowo. Jeśli stworzysz bardziej zaawansowaną krzywą animacji, animacje muszę być przygotowane wcześniej w programie przed eksportem (prebaked).
-
-Klipy animacji (animation clips) w formacie Collada nie są obecnie wspierane. Aby używać wielu animacji na model, wyeksportuj je do osobnego pliku *.dae* i zbierz wszystkie pliki do osobnego pliku *.animationset* w edytorze Defold.
-:::
-
-### Model 3D  - hierarchia szkieletu
-
-Kości szkieletu modelu 3D są reprezentowane wewnętrznie również jako obiekty (game objects).
-
-Możesz uzyskać id danej instancji kości w czasie działania programu i dowolnie nią manipulować. Funkcja [`model.get_go()`](/ref/model#model.get_go) zwraca id obiektu danej kości.
-
-```lua
--- Get the middle bone go of our wiggler model
-local bone_go = model.get_go("#wiggler", "Bone_002")
-
--- Now do something useful with the game object...
-```
-
-### Model 3D - animacja kursora
-
-Tak jak powyżej dla komponentów typu Spine, modele 3D mogą być animowane przy użyciu tzw. kursora (ang. `cursor`):
-
-```lua
--- Set the animation on #model but don't start it
-model.play_anim("#model", "wiggle", go.PLAYBACK_NONE)
--- Set the cursor to the beginning of the animation
-go.set("#model", "cursor", 0)
--- Tween the cursor between 0 and 1 pingpong with in-out quad easing.
-go.animate("#model", "cursor", go.PLAYBACK_LOOP_PINGPONG, 1, go.EASING_INOUTQUAD, 3)
-```
-
-## Animowanie właściwości
-
-Aby animować właściwości (ang. properties) obiektu lub komponentu użyj funkcji `go.animate()`. Dla właściwości węzłów GUI, analogiczną funkcją jest `gui.animate()`.
-
-```lua
--- Set the position property y component to 200
-go.set(".", "position.y", 200)
--- Then animate it
-go.animate(".", "position.y", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_OUTBOUNCE, 2)
-```
-
-Aby zatrzymać wszystkie animacje danej właściwości, wywołaj `go.cancel_animations()`, a dla węzłów GUI, analogicznie: `gui.cancel_animation()` lub dookreśl, które właściwości chcesz zatrzymać:
-
-```lua
--- Stop euler z rotation animation on the current game object
-go.cancel_animations(".", "euler.z")
-```
-
-Jeśli zatrzymasz animacje właściwości, która jest właściwością "kompozytową" (składającą się z kilku osobnych wartości, jak np. `vector3 position`), osobne animacje każdego z elementów składowych danej właściwości (`position.x`, `position.y` i `position.z`) zostaną zatrzymane.
-
-[Instrukcja do właściwości](/manuals/properties) zawiera wszystkie informacje na temat dostępnych właściwości obiektów, komponentów i węzłów GUI.
-
-## Animowanie właściwości węzłów GUI
-
-Prawie każdą właściwość (ang. property) węzła GUI można animować. Możesz przykładowo ukryć węzeł poprzez ustawienie jego koloru na całkowicie przezroczysty, a następnie pokazać przez płynne pojawianie się animując kolor do wartości koloru białego (nieprzezroczystego):
-
-```lua
-local node = gui.get_node("button")
-local color = gui.get_color(node)
--- Animate the color to white
-gui.animate(node, gui.PROP_COLOR, vmath.vector4(1, 1, 1, 1), gui.EASING_INOUTQUAD, 0.5)
--- Animate the outline red color component
-gui.animate(node, "outline.x", 1, gui.EASING_INOUTQUAD, 0.5)
--- And move to x position 100
-gui.animate(node, hash("position.x"), 100, gui.EASING_INOUTQUAD, 0.5)
-```
-
-## Playback modes - tryby odtwarzania
-
-Animacje w Defoldzie mogą być odtwarzane w różnych trybach - np. jednokrotnie lub w pętli. Jest to określone przez tryby odtwarzania (ang. playback modes):
-
-* go.PLAYBACK_NONE
-* go.PLAYBACK_ONCE_FORWARD
-* go.PLAYBACK_ONCE_BACKWARD
-* go.PLAYBACK_ONCE_PINGPONG
-* go.PLAYBACK_LOOP_FORWARD
-* go.PLAYBACK_LOOP_BACKWARD
-* go.PLAYBACK_LOOP_PINGPONG
-
-Tryb pingpong odtwarza animację raz w poprawnej kolejności, do przodu, a następnie od tyłu. Analogiczne tryby służą do kontroli elementów (węzłów) GUI:
-
-* gui.PLAYBACK_NONE
-* gui.PLAYBACK_ONCE_FORWARD
-* gui.PLAYBACK_ONCE_BACKWARD
-* gui.PLAYBACK_ONCE_PINGPONG
-* gui.PLAYBACK_LOOP_FORWARD
-* gui.PLAYBACK_LOOP_BACKWARD
-* gui.PLAYBACK_LOOP_PINGPONG
-
-## Easing - funkcje wygładzania
-
-Funkcje wygładzania (ang. easing) opisują w jaki sposób animowane wartości zmieniają się w czasie. Obrazy poniżej przedstawiają wykresy funkcji tych wartości w czasie:
-
-Dla animowania wartości obiektów i komponentów przy użyciu `go.animate()`:
-
-|---|---|
-| go.EASING_LINEAR | |
-| go.EASING_INBACK | go.EASING_OUTBACK |
-| go.EASING_INOUTBACK | go.EASING_OUTINBACK |
-| go.EASING_INBOUNCE | go.EASING_OUTBOUNCE |
-| go.EASING_INOUTBOUNCE | go.EASING_OUTINBOUNCE |
-| go.EASING_INELASTIC | go.EASING_OUTELASTIC |
-| go.EASING_INOUTELASTIC | go.EASING_OUTINELASTIC |
-| go.EASING_INSINE | go.EASING_OUTSINE |
-| go.EASING_INOUTSINE | go.EASING_OUTINSINE |
-| go.EASING_INEXPO | go.EASING_OUTEXPO |
-| go.EASING_INOUTEXPO | go.EASING_OUTINEXPO |
-| go.EASING_INCIRC | go.EASING_OUTCIRC |
-| go.EASING_INOUTCIRC | go.EASING_OUTINCIRC |
-| go.EASING_INQUAD | go.EASING_OUTQUAD |
-| go.EASING_INOUTQUAD | go.EASING_OUTINQUAD |
-| go.EASING_INCUBIC | go.EASING_OUTCUBIC |
-| go.EASING_INOUTCUBIC | go.EASING_OUTINCUBIC |
-| go.EASING_INQUART | go.EASING_OUTQUART |
-| go.EASING_INOUTQUART | go.EASING_OUTINQUART |
-| go.EASING_INQUINT | go.EASING_OUTQUINT |
-| go.EASING_INOUTQUINT | go.EASING_OUTINQUINT |
-
-Dla animowania wartości węzłów GUI przy użyciu `gui.animate()`:
-
-|---|---|
-| gui.EASING_LINEAR | |
-| gui.EASING_INBACK | gui.EASING_OUTBACK |
-| gui.EASING_INOUTBACK | gui.EASING_OUTINBACK |
-| gui.EASING_INBOUNCE | gui.EASING_OUTBOUNCE |
-| gui.EASING_INOUTBOUNCE | gui.EASING_OUTINBOUNCE |
-| gui.EASING_INELASTIC | gui.EASING_OUTELASTIC |
-| gui.EASING_INOUTELASTIC | gui.EASING_OUTINELASTIC |
-| gui.EASING_INSINE | gui.EASING_OUTSINE |
-| gui.EASING_INOUTSINE | gui.EASING_OUTINSINE |
-| gui.EASING_INEXPO | gui.EASING_OUTEXPO |
-| gui.EASING_INOUTEXPO | gui.EASING_OUTINEXPO |
-| gui.EASING_INCIRC | gui.EASING_OUTCIRC |
-| gui.EASING_INOUTCIRC | gui.EASING_OUTINCIRC |
-| gui.EASING_INQUAD | gui.EASING_OUTQUAD |
-| gui.EASING_INOUTQUAD | gui.EASING_OUTINQUAD |
-| gui.EASING_INCUBIC | gui.EASING_OUTCUBIC |
-| gui.EASING_INOUTCUBIC | gui.EASING_OUTINCUBIC |
-| gui.EASING_INQUART | gui.EASING_OUTQUART |
-| gui.EASING_INOUTQUART | gui.EASING_OUTINQUART |
-| gui.EASING_INQUINT | gui.EASING_OUTQUINT |
-| gui.EASING_INOUTQUINT | gui.EASING_OUTINQUINT |
-
-![Linear interpolation](images/properties/easing_linear.png){.inline}
-![In back](images/properties/easing_inback.png){.inline}
-![Out back](images/properties/easing_outback.png){.inline}
-![In-out back](images/properties/easing_inoutback.png){.inline}
-![Out-in back](images/properties/easing_outinback.png){.inline}
-![In bounce](images/properties/easing_inbounce.png){.inline}
-![Out bounce](images/properties/easing_outbounce.png){.inline}
-![In-out bounce](images/properties/easing_inoutbounce.png){.inline}
-![Out-in bounce](images/properties/easing_outinbounce.png){.inline}
-![In elastic](images/properties/easing_inelastic.png){.inline}
-![Out elastic](images/properties/easing_outelastic.png){.inline}
-![In-out elastic](images/properties/easing_inoutelastic.png){.inline}
-![Out-in elastic](images/properties/easing_outinelastic.png){.inline}
-![In sine](images/properties/easing_insine.png){.inline}
-![Out sine](images/properties/easing_outsine.png){.inline}
-![In-out sine](images/properties/easing_inoutsine.png){.inline}
-![Out-in sine](images/properties/easing_outinsine.png){.inline}
-![In exponential](images/properties/easing_inexpo.png){.inline}
-![Out exponential](images/properties/easing_outexpo.png){.inline}
-![In-out exponential](images/properties/easing_inoutexpo.png){.inline}
-![Out-in exponential](images/properties/easing_outinexpo.png){.inline}
-![In circlic](images/properties/easing_incirc.png){.inline}
-![Out circlic](images/properties/easing_outcirc.png){.inline}
-![In-out circlic](images/properties/easing_inoutcirc.png){.inline}
-![Out-in circlic](images/properties/easing_outincirc.png){.inline}
-![In quadratic](images/properties/easing_inquad.png){.inline}
-![Out quadratic](images/properties/easing_outquad.png){.inline}
-![In-out quadratic](images/properties/easing_inoutquad.png){.inline}
-![Out-in quadratic](images/properties/easing_outinquad.png){.inline}
-![In cubic](images/properties/easing_incubic.png){.inline}
-![Out cubic](images/properties/easing_outcubic.png){.inline}
-![In-out cubic](images/properties/easing_inoutcubic.png){.inline}
-![Out-in cubic](images/properties/easing_outincubic.png){.inline}
-![In quartic](images/properties/easing_inquart.png){.inline}
-![Out quartic](images/properties/easing_outquart.png){.inline}
-![In-out quartic](images/properties/easing_inoutquart.png){.inline}
-![Out-in quartic](images/properties/easing_outinquart.png){.inline}
-![In quintic](images/properties/easing_inquint.png){.inline}
-![Out quintic](images/properties/easing_outquint.png){.inline}
-![In-out quintic](images/properties/easing_inoutquint.png){.inline}
-![Out-in quintic](images/properties/easing_outinquint.png){.inline}
-
-## Własne funkcje wygładzania
-
-Możesz tworzyć własne funkcje wygładzania zdefiniowane jako specjalny `vector` ze zbiorem odpowiednich, kolejnych wartości i użyć go zamiast predefiniowanych stałych przedstawionych powyżej. Wektor ten reprezentuje krzywą zmiany wartości numerycznej od wartości startowej (`0`) do wartości końcowej (`1`). Silnik interpoluje w czasie działania programu te wartości liniowo.
-
-Na przykład, wektor:
-
-```lua
-local values = { 0, 0.4, 0.2, 0.2, 0.5. 1 }
-local my_easing = vmath.vector(values)
-```
-
-stworzy następującą krzywą:
-
-![Custom curve](images/animation/custom_curve.png)
-
-W poniższym przykładzie wartość y pozycji obiektu skacze między aktualną pozycją startową, a pozycją docelową 200:
-
-```lua
-local values = { 0, 0, 0, 0, 0, 0, 0, 0,
-                 1, 1, 1, 1, 1, 1, 1, 1,
-                 0, 0, 0, 0, 0, 0, 0, 0,
-                 1, 1, 1, 1, 1, 1, 1, 1,
-                 0, 0, 0, 0, 0, 0, 0, 0,
-                 1, 1, 1, 1, 1, 1, 1, 1,
-                 0, 0, 0, 0, 0, 0, 0, 0,
-                 1, 1, 1, 1, 1, 1, 1, 1 }
-local square_easing = vmath.vector(values)
-go.animate("go", "position.y", go.PLAYBACK_LOOP_PINGPONG, 200, square_easing, 2.0)
-```
-
-a krzywa ruchu wygląda jak sygnał prostokątny:
-
-![Square curve](images/animation/square_curve.png)
-
-## Funkcje po zakończeniu animacji - callbacks
-
-Wszystkie funkcje animacji (`go.animate()`, `gui.animate()`, `gui.play_flipbook()`, `gui.play_spine_anim()`, `sprite.play_flipbook()`, `spine.play_anim()` i `model.play_anim()`) przyjmują opcjonalną funkcję zwaną callback jako ostatni argument. Ta funkcja jest wywoływana w momencie zakończenia animacji. Nie jest więc nigdy wywoływana, dla animacji, które są zapętlone, ani w przypadku, gdy animacja jest ręcznie zatrzymana przez funkcje rodzaju `go.cancel_animations()`. Callback może być użyty do uruchomienia wydarzeń, które powinny wystartować w momencie końca animacji, bez wiedzy programisty o czasie jej trwania lub do uruchomienia następnej animacji, zaraz po zakończeniu obecnej.
-
-Dokładna sygnatura funkcji callback różni się nieco dla różnych funkcji animacji (różne argumenty). Sprawdź dokumentację API dla funkcji, którą chcesz użyć.
-
-```lua
-local function done_bouncing(self, url, property)
-    -- We're done animating. Do something...
-end
-
-function init(self)
-    go.animate(".", "position.y", go.PLAYBACK_ONCE_FORWARD, 100, go.EASING_OUTBOUNCE, 2, 0, done_bouncing)
-end
-```
+* [Rive](/extension-rive) - odtwarzanie interaktywnych animacji grafik wektorowych używających dwuwymiarowych szkieletów, z programu Rive
+* [Spine](/extension-spine) - odtwarzanie animacji używających dwuwymiarowych szkieletów, z programu Spine (i podobnych, np. Dragonbones, etc)

+ 118 - 0
docs/pl/manuals/flipbook-animation.md

@@ -0,0 +1,118 @@
+---
+title: Animacja poklatkowa - Flip-book
+brief: Ta instrukcja opisuje wsparcie dla animacji poklatkowych w silniku Defold.
+---
+
+# Animacja poklatkowa - flip-book
+
+Animacja poklatkowa (ang. flip-book animation) składa się z serii obrazów (klatek animacji), które są pokazywane jeden za drugim, więc patrząc na nie sprawiają wrażenie ruchu. Technika ta jest bardzo podobna do tradycyjnej animacji używanej w kinematografii [https://pl.wikipedia.org/wiki/Animacja](https://pl.wikipedia.org/wiki/Animacja) i oferuje nieograniczoną kontrolę, ponieważ każda klatka może być modyfikowana indywidualnie. Jednakże pamięć zajmowana przez wszystkie obrazy składające się na taką animację może być duża w zależności od ilości klatek i ich wielkości. Płynność animacji zależy od liczby klatek pokazywanych w każdej sekundzie (FPS z ang. frames per second), co wymaga oczywiście większej ilości pracy. Animacje typu flip-book w Defoldzie są przechowywane albo jako indywidualne obrazy umieszczone w galerii zwanej [Atlas](/manuals/atlas), albo jako obrazy umieszczone w bezpośrednim sąsiedztwie, w poziomej sekwencji jak kafelki w tzw. Źródle Kafelków - [Tile Source](/manuals/tilesource).
+
+  ![Animation sheet](images/animation/animsheet.png){.inline}
+  ![Run loop](images/animation/runloop.gif){.inline}
+
+## Odtwarzanie animacji flip-book
+
+Sprite'y i węzły GUI mogą odtwarzać animacje poklatkowe i masz nad tym całkowitą kontrolę w trakcie działania programu.
+
+Sprite'y
+: Aby odtworzyć animację w trakcie działania programu używa się funkcji [`sprite.play_flipbook()`](/ref/sprite/?q=play_flipbook#sprite.play_flipbook:url-id-[complete_function]-[play_properties]). Poniżej przykład.
+
+Węzły GUI
+: Aby odtworzyć animację w trakcie działania programu używa się funkcji [`gui.play_flipbook()`](/ref/gui/?q=play_flipbook#gui.play_flipbook:node-animation-[complete_function]-[play_properties]). Poniżej przykład.
+
+::: sidenote
+Tryb odtwarzania (playback mode) "once ping-pong" odtworzy animację klatka po klatce do samego końca, a następnie odtworzy ją jeszcze raz w odwrotnej kolejności, od tyłu, ale do **drugiej** klatki animacji, a nie do pierwszej. Jest to zabieg służący łatwemu wiązaniu animacji w serie.
+:::
+
+### Przykład animacji ze spritem
+
+Załóżmy, że Twoja gra posiada możliwość "uniku", która pozwala graczom nacisnąć klawisz, aby wykonać unik. Masz przygotowane 4 animacje, żeby w pełni pokazać unik:
+
+"idle"
+: Zapętlona animacja stojącej postaci będącej w bezczynności.
+
+"dodge_idle"
+: Zapętlona animacja postaci pochylonej, będącej w trakcie trwania uniku.
+
+"start_dodge"
+: Jednokrtotnie odtwarzana animacja postaci w momencie przejścia animacji z pozycji stojącej do pochylonej w celu wykonania uniku.
+
+"stop_dodge"
+: Jednokrtotnie odtwarzana animacja postaci w momencie przejścia animacji z pozycji uniku z powrotem do pozycji stojącej.
+
+Skrypt poniżej przedstawia potrzebną logikę:
+
+```lua
+
+local function play_idle_animation(self)
+    if self.dodge then
+        sprite.play_flipbook("#sprite", hash("dodge_idle"))
+    else
+        sprite.play_flipbook("#sprite", hash("idle"))
+    end
+end
+
+function on_input(self, action_id, action)
+    -- "dodge" to nasza akcja zbindowana z inputem
+    if action_id == hash("dodge") then
+        if action.pressed then
+            sprite.play_flipbook("#sprite", hash("start_dodge"), play_idle_animation)
+            -- zapamiętaj, że wykonujemy unik
+            self.dodge = true
+        elseif action.released then
+            sprite.play_flipbook("#sprite", hash("stop_dodge"), play_idle_animation)
+            -- zapamiętaj, że skończyliśmy unik
+            self.dodge = false
+        end
+    end
+end
+```
+
+### Przykład animacji z węzłem GUI
+
+Przy wyborze obrazu i animacji dla węzła graficznego interfejsu użytkownika (ang. GUI), np. "box" albo "pie" tak naprawdę właśnie przypisujesz źródło obrazów (atlas lub tile source) i domyślną animację, tak samo jak w przypadku sprite'ów. Takie źródło grafiki jest statycznie przypisane do węzła, ale animacja może być zmieniona w trakcie trwania programu. Nieruchome obrazki są traktowane jako jednoklatkowa animacja, więc zamiana obrazu jest jednoznaczna z odtworzeniem innej animacji poklatkowej na węźle:
+
+```lua
+function init(self)
+    local character_node = gui.get_node("character")
+    -- To wymaga, żeby węzły miały domyślne animacje w tym samym atlasie lub źródłe kafelków
+    -- co nowa animacja, którą odtwarzamy
+    gui.play_flipbook(character_node, "jump_left")
+end
+```
+
+## Funkcje po zakończeniu animacji
+
+Funckje `sprite.play_flipbook()` i `gui.play_flipbook()` przyjmują jako ostatni argument opcjonalną funkcję, która jest wywoływana w momencie zakończenia animacji, tzw. callback. Będzie ona wywołana po skończeniu animacji, więc tylko dla takich, które nie są zapętlone, czyli w trybach odtwarzania: `PLAYBACK_ONCE_*` i nie będzie wywołana w przypadku ręcznego anulowania animacji za pomocą `go.cancel_animations()`. Można użyć takiej funkcjonalności w celu wywołania specjalnych wydarzeń po skończonej animacji (np. procesu zadania obrażeń po skończonej animacji ataku) lub do połączenia różnych animacji w serie, jedna za drugą. Przykłady:
+
+```lua
+local function flipbook_done(self)
+    msg.post("#", "jump_completed")
+end
+
+function init(self)
+    sprite.play_flipbook("#character", "jump_left", flipbook_done)
+end
+```
+
+```lua
+local function flipbook_done(self)
+    msg.post("#", "jump_completed")
+end
+
+function init(self)
+    gui.play_flipbook(gui.get_node("character"), "jump_left", flipbook_done)
+end
+```
+
+## Tryby odtwarzania
+
+Animacje można odtwarzać raz lub w pętli. Sposób odtwarzania animacji jest określany przez tryb odtwarzania (ang. Playback mode):
+
+* go.PLAYBACK_NONE
+* go.PLAYBACK_ONCE_FORWARD
+* go.PLAYBACK_ONCE_BACKWARD
+* go.PLAYBACK_ONCE_PINGPONG
+* go.PLAYBACK_LOOP_FORWARD
+* go.PLAYBACK_LOOP_BACKWARD
+* go.PLAYBACK_LOOP_PINGPONG

+ 84 - 0
docs/pl/manuals/model-animation.md

@@ -0,0 +1,84 @@
+---
+title: Animacja modeli 3D
+brief: Ta instrukcja opisuje wsparcie dla animacji modeli 3D w silniku Defold.
+---
+
+# Animacja modeli 3D
+
+Animacja szkieletowa trójwymiarowych modeli jest podobna do animacji typu Spine, z tym, że działa również w trójwymiarze. Animacja szkieletowa modeli 3D wykorzystuje "kości" (ang. bones) modelu do deformacji wierzchołków (ang. vertices) w modelu. Model 3D nie jest jednak podzielony na osobne części związane ze sobą w łańcuch kinematyczny, a w zamian tego, ruch "kości" deformuje siatkę wierzchołków reprezentującą obiekt 3D, a Ty masz kontrolę nad tym, w jaki sposób kości wpływają na taką deformację.
+
+  Szczegóły dotyczące importowania danych 3D do komponentu typu "Model" dla animacji znajdziesz tutaj: [Instrukcja Modeli 3D](/manuals/model).
+
+  ![Blender animation](images/animation/blender_animation.png){.inline srcset="images/animation/[email protected] 2x"}
+  ![Wiggle loop](images/animation/suzanne.gif){.inline}
+
+## Odtwarzanie animacji
+
+Modele są animowane za pomocą funkcji [`model.play_anim()`](/ref/model#model.play_anim):
+
+```lua
+function init(self)
+    -- Rozpocznij animację "wiggle" w tę i z powrotem komponentu #model
+    model.play_anim("#model", "wiggle", go.PLAYBACK_LOOP_PINGPONG)
+end
+```
+
+::: important
+W chwili obecnej Defold obsługuje tylko tzw. animacje wypieczone (baked animations). Animacje muszą zawierać macierze dla każdej animowanej kości na każdej klatce kluczowej, a nie pozycje, rotacje i skale jako osobne klucze.
+
+Animacje są także interpolowane liniowo. Jeśli chcesz użyć bardziej zaawansowanej interpolacji krzywych, animacje muszą zostać wypieczone (prebaked) z poziomu eksportera.
+
+Klipy animacji w Collada nie są obsługiwane. Aby użyć wielu animacji na jednym modelu, wyeksportuj je jako osobne pliki *.dae*, a następnie zgromadź te pliki w pliku *.animationset* w Defold.
+:::
+
+### Hierarchia kości
+
+Kości (ang. bones) w szkielecie modelu są reprezentowane wewnętrznie jako obiekty gry (game objects).
+
+Możesz uzyskać identyfikator (id) instancji obiektu gry kości w czasie rzeczywistym. Funkcja [`model.get_go()`](/ref/model#model.get_go) zwraca identyfikator obiektu gry dla określonej kości.
+
+```lua
+-- Weź środek kości 002 obiektu gry modelu wiggler
+local bone_go = model.get_go("#wiggler", "Bone_002")
+
+-- Zrób coś z obiektem gry
+```
+
+### Animacja kursora
+
+Oprócz korzystania z `model.play_anim()` do animacji modelu, komponenty typu *Model* udostępniają specjalną właściwość "kursor" (ang. cursor), którą można manipulować za pomocą `go.animate()` (więcej na temat [animacji właściwości](/manuals/property-animation))). Przykład:
+
+```lua
+-- Ustaw animację komponentu #model ale jeszcze nie rozpoczynaj
+model.play_anim("#model", "wiggle", go.PLAYBACK_NONE)
+-- Ustaw kursor animacji na początku (0)
+go.set("#model", "cursor", 0)
+-- Animuj wartość kursora animacji między 0 i 1 w tę i z powrotem
+go.animate("#model", "cursor", go.PLAYBACK_LOOP_PINGPONG, 1, go.EASING_INOUTQUAD, 3)
+```
+
+## Funkcje po zakończeniu animacji
+
+Animacje modelu (`model.play_anim()`) obsługują opcjonalną funkcję zwrotną Lua jako ostatni argument. Funkcja ta zostanie wywołana po zakończeniu animacji. Funkcja nigdy nie jest wywoływana dla animacji w pętli, więc takich, których tryby odtwarzania zaczynają się od: `PLAYBACK_LOOP_*`, ani w przypadku ręcznego anulowania animacji za pomocą `go.cancel_animations()`. Funkcję zwrotną można wykorzystać do wyzwalania zdarzeń po zakończeniu animacji (np. procesu zadania obrażeń po skończonej animacji ataku) lub do połączenia różnych animacji w serie, jedna za drugą. Przykłady: 
+
+```lua
+local function wiggle_done(self, message_id, message, sender)
+    -- Animacja skończona
+end
+
+function init(self)
+    model.play_anim("#model", "wiggle", go.PLAYBACK_ONCE_FORWARD, nil, wiggle_done)
+end
+```
+
+## Tryby odtwarzania
+
+Animacje można odtwarzać raz lub w pętli. Sposób odtwarzania animacji jest określany przez tryb odtwarzania (ang. Playback mode):
+
+* go.PLAYBACK_NONE
+* go.PLAYBACK_ONCE_FORWARD
+* go.PLAYBACK_ONCE_BACKWARD
+* go.PLAYBACK_ONCE_PINGPONG
+* go.PLAYBACK_LOOP_FORWARD
+* go.PLAYBACK_LOOP_BACKWARD
+* go.PLAYBACK_LOOP_PINGPONG

+ 55 - 0
docs/pl/manuals/physics-joints.md

@@ -0,0 +1,55 @@
+---
+title: Łączenia fizyczne w Defoldzie
+brief: Defold supports joints for 2D physics. This manual explains how to create and work with joints.
+---
+
+# Łączenia fizyczne (Joints)
+
+Defold obsługuje łączenia (ang. joints) w fizyce 2D. Łączenie łączy ze sobą dwa obiekty kolizji za pomocą wybranego rodzaju ograniczenia. Obsługiwane rodzaje połączeń to:
+
+* **Fixed (physics.JOINT_TYPE_FIXED)** - łączenie stałe, które ogranicza maksymalną odległość między dwoma punktami. W Box2D jest to znane jako połączenie "lina" (ang. rope joint).
+* **Hinge (physics.JOINT_TYPE_HINGE)** - łączenie zawiasowe/osi określa punkt kotwiczenia na dwóch obiektach kolizji i przesuwa je tak, aby obiekty były zawsze w tym samym miejscu, a względna rotacja obiektów kolizyjnych nie była ograniczona. Łączenie zawiasowe można łączyć ze specjalnym silnikiem (ang. motor) zdefiniowanym z maksymalnym momentem obrotowym i prędkością, co umożliwia przykładowo stworzenie koła pojazdu. W Box2D jest to znane jako połączenie obrotowe (ang. revolute joint).
+* **Weld (physics.JOINT_TYPE_WELD)** - łączenie spawane stara się ograniczyć wszelkie względne ruchy między dwoma obiektami kolizyji. Łączenie spawane można zrobić miękkie jak sprężyna z częstotliwością i współczynnikiem tłumienia. W Box2D jest to znane również jako połączenie spawane (ang. weld joint).
+* **Spring (physics.JOINT_TYPE_SPRING)** - łączenie sprężynowe utrzymuje dwa obiekty kolizyjne w stałej odległości od siebie. Połączenie sprężyny można zrobić miękkie jak sprężyna z częstotliwością i współczynnikiem tłumienia. W Box2D jest znane jako połączenie dystansowe (ang. distance joint).
+* **Slider (physics.JOINT_TYPE_SLIDER)** - łączenie przesuwne/suwaka umożliwia względną translację dwóch obiektów kolizji wzdłuż określonej osi i zapobiega względnej rotacji. W Box2D jest znane jako połączenie pryzmatyczne (ang. prismatic joint).
+
+## Tworzenie połączeń
+
+Obecnie połączenia można tworzyć tylko programowo za pomocą funkcji [`physics.create_joint()`](/ref/physics/#physics.create_joint:joint_type-collisionobject_a-joint_id-position_a-collisionobject_b-position_b-[properties]):
+::: sidenote
+Wsparcie Edytora do tworzenia połączeń jest planowane, ale nie ustalono jeszcze daty wydania.
+:::
+
+```lua
+-- połącz dwa obiekty kolizyjne za pomocą połączenia liny (fixed joint)
+physics.create_joint(physics.JOINT_TYPE_FIXED, "obj_a#collisionobject", "my_test_joint", vmath.vector3(10, 0, 0), "obj_b#collisionobject", vmath.vector3(0, 20, 0), { max_length = 20 })
+```
+
+Powyższy kod utworzy stałe połączenie o identyfikatorze `my_test_joint`, połączone między dwoma obiektami kolizyjnymi `obj_a#collisionobject` i `obj_b#collisionobject`. Połączenie jest ustanowione 10 pikseli na lewo od środka obiektu kolizyjnego `obj_a#collisionobject` i 20 pikseli nad środkiem obiektu kolizyjnego `obj_b#collisionobject`. Maksymalna długość połączenia wynosi 20 pikseli.
+
+## Niszczenie połączeń
+
+Połączenie można zniszczyć za pomocą funkcji [`physics.destroy_joint()`](/ref/physics/#physics.destroy_joint:collisionobject-joint_id):
+
+```lua
+-- zniszcz połączenie, które było wcześniej podłączone do pierwszego obiektu kolizyjnego
+physics.destroy_joint("obj_a#collisionobject", "my_test_joint")
+```
+
+## Odczytywanie i aktualizowanie połączeń
+
+Właściwości połączenia można odczytać za pomocą funkcji [`physics.get_joint_properties()`](/ref/physics/#physics.get_joint_properties:collisionobject-joint_id) i ustawić za pomocą funkcji [`physics.set_joint_properties()`](/ref/physics/#physics.set_joint_properties:collisionobject-joint_id-properties):
+
+```lua
+function update(self, dt)
+    if self.accelerating then
+        local hinge_props = physics.get_joint_properties("obj_a#collisionobject", "my_hinge")
+        -- zwiększ prędkość silnika o 100 obrotów na sekundę
+        hinge_props.motor_speed = hinge_props.motor_speed + 100 * 2 * math.pi * dt
+        physics.set_joint_properties("obj_a#collisionobject", "my_hinge", hinge_props)
+    end
+end
+```
+## Odczytywanie siły i momentu reakcji połączenia
+
+Siłę reakcji i moment reakcji, które zostały zastosowane do połączenia, można odczytać za pomocą funkcji odpowiednio [`physics.get_joint_reaction_force()`](/ref/physics/#physics.get_joint_reaction_force:collisionobject-joint_id) i [`physics.get_joint_reaction_torque()`](/ref/physics/#physics.get_joint_reaction_torque:collisionobject-joint_id).

+ 111 - 0
docs/pl/manuals/physics-messages.md

@@ -0,0 +1,111 @@
+---
+title: Wiadomości kolizji w Defoldzie
+brief: Kiedy obiekty się zderzają, silnik Defold wysyła wiadomości do komponentów tych obiektów.
+---
+
+# Wiadomości kolizji
+
+Kiedy dwa obiekty kolizji kolidują ze sobą, silnik wysyła wiadomości do wszystkich komponentów w obu tych obiektach:
+
+## Odpowiedź na kolizję
+
+Odpowiedź na kolizję `"collision_response"` to wiadomość wysyłana do wszystkich obiektów w przypadku ich kolizji. Zawiera ona następujące pola:
+
+`other_id`
+: identyfikator innej instancji, z którą obiekt kolizji kolidował (typ `hash`).
+
+`other_position`
+: pozycja innej instancji w przestrzeni świata gry (world position), z którą obiekt kolizji kolidował (typ `vector3`).
+
+`other_group`
+: grupa kolizyjna innego obiektu kolizji, z którą obiekt kolizji kolidował (typ `hash`).
+
+Wiadomość `"collision_response"` jest odpowiednia do rozwiązywania kolizji, gdzie nie potrzebujesz szczegółów dotyczących rzeczywistego przecięcia (intersection) obiektów, na przykład, jeśli chcesz wykryć tylko czy pocisk trafia wroga. W ciągu jednej klatki jest wysyłana tylko jedna z tych wiadomości dla każdej pary obiektów kolidujących ze sobą.
+
+```Lua
+function on_message(self, message_id, message, sender)
+    -- check for the message
+    if message_id == hash("collision_response") then
+        -- take action
+        print("I collided with", message.other_id)
+    end
+end
+```
+
+## Odpowiedź punktu kontaktu
+
+Odpowiedź punktu kontaktu `"contact_point_response"` to wiadomość wysyłana, gdy jeden z kolidujących obiektów jest dynamiczny lub kinematyczny. Zawiera ona następujące pola:
+
+`position`
+: pozycja punktu kontaktu/styku w przestrzeni świata gry (world position) (typ `vector3`)
+
+`normal`
+: wektor normalny w przestrzeni świata do punktu kontaktu/styku, który wskazuje od innego obiektu kolizji w kierunku bieżącego obiektu, czyli tego, który otrzymał tę wiadomość (typ `vector3`).
+
+`relative_velocity`
+: prędkość względna obiektu kolizji obserwowana z punktu widzenia innego obiektu kolizji, z którym obiekt, który otrzymał tę wiadomość kolidował (typ `vector3`).
+
+`distance`
+: odległość penetracji między obiektami kolizji - nieujemna (typ `number`).
+
+`applied_impulse`
+: impuls, czyli siła która wynikała z kontaktu (typ `number`).
+
+`life_time`
+: (*obecnie nieużywane!*) czas trwania kontaktu (typ `number`).
+
+`mass`
+: masa bieżącego obiektu kolizji w kilogramach (typ `number`).
+
+`other_mass`
+: masa innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość, w kilogramach (typ `number`).
+
+`other_id`
+: identyfikator instancji, z którą obiekt kolizji znajduje się w kontakcie (typ `hash`).
+
+`other_position`
+: pozycja w przestrzeni świata gry (world position) innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość (typ `vector3`).
+
+`group`
+: grupa kolizyjna innego obiektu kolizji, z którym kolidował obiekt, który otrzymał tę wiadomość (typ `hash`).
+
+Dla gry lub aplikacji, w których potrzebujesz idealnie rozdzielać obiekty, wiadomość `"contact_point_response"` dostarcza wszystkie informacje, których potrzebujesz. Należy jednak zauważyć, że w przypadku danej pary kolizji, w zależności od charakteru kolizji, można otrzymać wiele wiadomości `"contact_point_response"` w jednej klatce. Zobacz szczegóły w [instrukcji do rozwiązywania kolizji](/manuals/physics-resolving-collisions).
+
+```Lua
+function on_message(self, message_id, message, sender)
+    -- check for the message
+    if message_id == hash("contact_point_response") then
+        -- take action
+        if message.other_mass > 10 then
+            print("I collided with something weighing more than 10 kilos!")
+        end
+    end
+end
+```
+
+## Odpowiedź na wyzwalacz
+
+Odpowiedź na wyzwalacz `"trigger_response"` to wiadomość wysyłana, gdy obiekt kolidujący ma typ `"trigger"` (wyzwalacz).
+
+W kolizji typu "trigger" są wysyłane wiadomości `"collision_response"`. Dodatkowo, wyzwalacze wysyłają również specjalną wiadomość `"trigger_response"` na początku i na końcu kolizji. Wiadomość ta zawiera następujące pola:
+
+`other_id`
+: identyfikator instancji, z którą obiekt kolizji kolidował (typ `hash`).
+
+`enter`
+: wejście - `true` jeśli interakcja była wejściem do wyzwalacza, `false`, jeśli była wyjściem (typ `boolean`).
+
+```Lua
+function on_message(self, message_id, message, sender)
+    -- check for the message
+    if message_id == hash("trigger_response") then
+        if message.enter then
+            -- take action for entry
+            print("I am now inside", message.other_id)
+        else
+            -- take action for exit
+            print("I am now outside", message.other_id)
+        end
+    end
+end
+```

+ 108 - 0
docs/pl/manuals/physics-objects.md

@@ -0,0 +1,108 @@
+---
+title: Obiekty kolizji w Defoldzie
+brief: Obiekt kolizji to komponent, który nadaje obiektowi gry zachowanie fizyczne. Obiekt kolizji ma właściwości fizyczne i przestrzenną formę.
+---
+
+# Obiekty kolizji
+
+Obiekty kolizji (ang. collision object) w Defoldzie to, wbrew nazwie, komponenty, które nadają obiektowi gry zachowanie fizyczne i pozwalają być analizowane przez silnik fizyki gry. Obiekt kolizji ma właściwości fizyczne, takie jak masa, współczynnik restytucji (uderzenia) i współczynnik tarcia, a jego rozszerzenie przestrzenne (ang. spatial extension) jest określane przez jeden lub więcej _kształtów_ (ang. shapes), które dołączasz do komponentu. Defold obsługuje następujące rodzaje obiektów kolizji:
+
+Static objects
+: Obiekty statyczne nigdy się nie poruszają, ale obiekt dynamiczny, który koliduje z obiektem statycznym, zareaguje odbijaniem i/lub ślizganiem. Obiekty statyczne są bardzo przydatne do tworzenia geometrii poziomu (np. podłogi i ścian), która się nie rusza. Są także "tańsze" pod względem wydajności niż obiekty dynamiczne. Nie możesz przesuwać, ani w żaden inny sposób zmieniać obiektów statycznych.
+
+Dynamic objects
+: Obiekty dynamiczne są symulowane przez silnik fizyki gry. Silnik fizyczny rozwiązuje wszystkie kolizje i stosuje wynikowe siły. Obiekty dynamiczne nadają się dla obiektów, które powinny zachowywać się realistycznie, ale nie możesz bezpośrednio manipulować pozycją i orientacją obiektu dynamicznego. Jedynym sposobem na ich wpływanie jest wpływ pośredni - poprzez stosowanie zewnętrznych [sił (forces)](/ref/physics/#apply_force) lub zmianę [tłumienia kątowego (angular damping)](/ref/stable/physics/#angular_damping) i [prędkości liniowej (linear velocity)](/ref/stable/physics/#linear_velocity) oraz [tłumienia liniowego (linear damping)](/ref/stable/physics/#linear_damping) i [prędkości kątowej (angular velocity)](/ref/stable/physics/#angular_velocity).
+
+Kinematic objects
+: Obiekty kinematyczne rejestrują kolizje z innymi obiektami fizycznymi, ale silnik fizyczny nie przeprowadza automatycznej symulacji. Rozstrzyganie kolizji lub ignorowanie ich pozostawione jest Tobie ([dowiedz się więcej](/manuals/physics-resolving-collisions)). Obiekty kinematyczne są bardzo dobre dla obiektów sterowanych przez gracza lub skrypt, które wymagają precyzyjnej kontroli nad reakcjami fizycznymi, takie jak np. postać gracza.
+
+Triggers
+: Wyzwalacze to obiekty, które rejestrują proste kolizje. Wyzwalacze to bardzo "lekkie" obiekty kolizji. Są podobne do specjalnych, fizycznych [promieni (ang. ray casts)](/manuals/physics-ray-casts), ponieważ tylko odczytują świat fizyczny bez oddziaływania na niego. Nadają się do obiektów, które muszą tylko zarejestrować trafienie (np. pocisk) lub jako część logiki gry, w której chcesz wyzwalać określone akcje, gdy obiekt osiągnie określony punkt (często wykorzystywane waypointy, checkpointy, wyzwalacze miejsca, itp.). Wyzwalacze są obliczeniowo tańsze niż obiekty kinematyczne i powinny być stosowane zamiast nich, jeśli tylko jest to możliwe.
+
+## Dodawanie komponentu obiektu kolizji
+
+Komponent obiektu kolizji ma zestaw *Properties* (Właściwości), które określają jego typ i właściwości fizyczne. Zawiera także jeden lub więcej Kształtów (*Shapes*), które definiują całą formę obiektu fizycznego.
+
+Aby dodać komponent obiektu kolizji do obiektu gry:
+
+1. W panelu *Outline*, <kbd>kliknij prawym przyciskiem myszy</kbd> obiekt gry i wybierz z menu kontekstowego <kbd>Add Component ▸ Collision Object</kbd>. Tworzy to nowy komponent bez Kształtów.
+2. <kbd>Kliknij prawym przyciskiem myszy</kbd> nowy komponent i wybierz <kbd>Add Shape ▸ Box / Capsule / Sphere</kbd>. Dodaje to nowy Kształt (odpowiednio: Prostopadłościan / Kapsuła / Sfera) do komponentu obiektu kolizji. Możesz dodać dowolną liczbę kształtów do komponentu. Możesz także użyć mapy kafelków (tilemap) lub powłoki wypukłej (convex hull), aby zdefiniować Kształt obiektu fizycznego.
+3. Użyj narzędzi do przesuwania, obracania i skalowania, aby edytować Kształty.
+4. Wybierz komponent w panelu *Outline* i edytuj *Properties* obiektu kolizji.
+
+![Physics collision object](images/physics/collision_object.png){srcset="images/physics/[email protected] 2x"}
+
+## Dodawanie kształtu kolizji
+Komponent kolizji może używać kilku podstawowych kształtów (primitive shapes) lub pojedynczego, skomplikowanego kształtu. Dowiedz się więcej o różnych kształtach i jak je dodawać do komponentu kolizji w [instrukcji do Kształtów Kolizji](/manuals/physics-shapes).
+
+## Właściwości obiektu kolizji
+
+Id
+: Identyfikator komponentu.
+
+Collision Shape
+: Kształt Kolizji - ta właściwość jest używana dla geometrii mapy kafelków (tile map) lub kształtów wypukłych (convex shapes), które nie używają kształtów podstawowych. Zobacz szczegóły w [instrukcji do Kształtów Kolizji](/manuals/physics-shapes).
+
+Type
+: Typ obiektu kolizji: `Dynamic` - dynamiczny, `Kinematic` - kinematyczny, `Static` - statyczny lub `Trigger` - wyzwalacz. Jeśli ustawisz obiekt jako dynamiczny, to _musisz_ ustawić wartość *Mass* (Masa) na wartość niezerową. Dla obiektów dynamicznych lub statycznych powinieneś także sprawdzić, czy wartości *Friction* - Tarcia i *Restitution* - Restytucji są odpowiednie dla twojego przypadku użycia.
+
+Friction
+: Tarcie - pozwala na realistyczne ocieranie/ślizganie się obiektów względem siebie. Wartość współczynnika tarcia jest zazwyczaj ustawiana między 0 (brak tarcia — bardzo śliski obiekt) a 1 (duże tarcie — obiekt ścierny). Jednakże dowolna wartość dodatnia jest poprawna.
+
+  Siła tarcia jest proporcjonalna do siły normalnej (nazywa się to tarciem Coulomba). Gdy obliczana jest siła tarcia między dwoma kształtami (`A` i `B`), wartości tarcia obu obiektów są łączone za pomocą średniej geometrycznej:
+
+  $$
+  F = sqrt( F_A * F_B )
+  $$
+
+  Oznacza to, że jeśli jeden z obiektów ma współczynnik tarcia równy zeru, to kontakt między nimi będzie miał tarcie równe zeru.
+
+Restitution
+: Wartość restytucji (inaczej współczynnik uderzenia) określa "sprężystość" obiektu. Wartość ta zazwyczaj mieści się między 0 (kolizja anelastyczna — obiekt w ogóle nie odbija się) a 1 (kolizja idealnie elastyczna — prędkość obiektu będzie dokładnie odbita).
+
+  Wartości restytucji między dwoma kształtami (`A` i `B`) są łączone za pomocą następującej formuły:
+
+  $$
+  R = max( R_A, R_B )
+  $$
+
+  Gdy kształt ma wiele kontaktów, restytucja jest przybliżana, ponieważ Box2D (węwnetrznie używany silnik fizyki) używa rozwiązywania iteracyjnego. Box2D stosuje również kolizje anelastyczne, gdy prędkość kolizji jest mała, aby zapobiec drganiom odbicia (bounce-jitter).
+
+Linear damping
+: Tłumienie liniowe - zmniejsza liniową prędkość ciała. Różni się od tarcia, które występuje tylko podczas kontaktu, i może być używane, aby obiektom nadawać efekt "unoszenia się", jakby poruszały się przez coś gęstszego niż powietrze. Poprawne wartości mieszczą się w zakresie od 0 do 1.
+
+  Box2D przybliża tłumienie w celu utrzymania lepszej stabilności i wydajności. Przy małych wartościach efekt tłumienia jest niezależny od kroku czasowego, podczas gdy przy większych wartościach tłumienia efekt tłumienia zmienia się w zależności od kroku czasowego. Jeśli uruchamiasz swoją grę z ustalonym krokiem czasowym, nie jest to problemem.
+
+Angular damping
+: Tłumienie kątowe - działa jak tłumienie liniowe, ale zmniejsza prędkość kątową ciała. Poprawne wartości mieszczą się w zakresie od 0 do 1.
+
+Locked rotation
+: Zablokowana rotacja - Ustawiając tę właściwość całkowicie wyłącza się obracanie na obiekcie kolizji, niezależnie od sił, jakie na niego działają.
+
+Bullet
+: (ang. pocisk) Ustawienie tej właściwości umożliwia ciągłe wykrywanie kolizji (ang. Continuous Collision Detection - CCD) między obiektem kolizji a innymi dynamicznymi obiektami kolizji. Właściwość *Bullet* jest ignorowana, jeśli typ nie jest ustawiony na `Dynamic` - Dynamiczny.
+
+Group
+: Nazwa grupy kolizji, do której obiekt powinien należeć. Możesz mieć 16 różnych grup i nadajesz im nazwy, jakie uważasz za stosowne w swojej grze. Na przykład "gracze", "pociski", "wrogowie" czy "świat". Jeśli Kształt Kolizji jest ustawiony na Mapę Kafelków (Tile Map), to pole to nie jest używane, a nazwy grup są pobierane ze Źródła Kafelków (Tile Source). Dowiedz się więcej [tutaj o grupach kolizji](/manuals/physics-groups).
+
+Mask
+: Maska - inne grupy, z którymi ten obiekt powinien kolidować. Możesz nazwać jedną grupę lub podać wiele grup oddzielonych przecinkiem. Jeśli pozostawisz pole `Mask` puste, obiekt nie będzie kolidować z niczym. Dowiedz się więcej [tutaj o grupach kolizji](/manuals/physics-groups).
+
+## Właściwości w trakcie działania gry
+
+Obiekt fizyczny ma wiele różnych właściwości, które można odczytywać i zmieniać za pomocą `go.get()` i `go.set()` w trakcie działania programu (runtime):
+
+`angular_damping`
+: Wartość tłumienia kątowego komponentu obiektu kolizji (typ `number`). [Dokumentacja API](/ref/physics/#angular_damping).
+
+`angular_velocity`
+: Bieżąca prędkość kątowa komponentu obiektu kolizji (typ `vector3`). [Dokumentacja API](/ref/physics/#angular_velocity).
+
+`linear_damping`
+: Wartość tłumienia liniowego obiektu kolizji (typ `number`). [Dokumentacja API](/ref/physics/#linear_damping).
+
+`linear_velocity`
+: Bieżąca prędkość liniowa komponentu obiektu kolizji (typ `vector3`). [Dokumentacja API](/ref/physics/#linear_velocity).
+
+`mass`
+: Określona masa fizyczna komponentu obiektu kolizji. TYLKO DO ODCZYTU. (typ `number`). [Dokumentacja API](/ref/physics/#mass).

+ 29 - 0
docs/pl/manuals/physics-ray-casts.md

@@ -0,0 +1,29 @@
+---
+title: Promienie Ray casts w Defoldzie
+brief: Ta instrukcja wyjaśnia działanie promieni Ray casts w Defoldzie.
+---
+
+## Promienie Ray casts
+
+Promienie (ang. "ray casts") silnika fizycznego sprawdzają i odczytują świat wzdłuż liniowego promienia i raportują o wykrytych obiektach kolizji na ich przecięciu. Aby wysłać promień do świata fizycznego, podajesz pozycję początkową i końcową oraz zestaw [grup kolizyjnych](/manuals/physics-groups), z którymi chcesz przetestować dany promień.
+
+Jeśli promień trafi w obiekt fizyczny, otrzymasz informacje o obiekcie, który został trafiony. Promienie przecinają obiekty kolizji dynamiczne, kinematyczne i statyczne. Nie oddziałują one z wyzwalaczami (ang. trigger).
+
+```lua
+function update(self, dt)
+  -- wysłanie promienia
+  local my_start = vmath.vector3(0, 0, 0)
+  local my_end = vmath.vector3(100, 1000, 1000)
+  local my_groups = { hash("my_group1"), hash("my_group2") }
+
+  local result = physics.raycast(my_start, my_end, my_groups)
+  if result then
+       -- działanie w przypadku trafienia (zobacz wiadomość 'ray_cast_response' w celu uzyskania wszystkich wartości)
+      print(result.id)
+  end
+end
+```
+
+::: sidenote
+Promienie będą ignorować obiekty kolizji, które zawierają punkt początkowy promienia. Jest to ograniczenie w Box2D.
+:::

+ 89 - 0
docs/pl/manuals/physics-resolving-collisions.md

@@ -0,0 +1,89 @@
+---
+title: Rozwiązywanie kolizji kinematycznych w Defoldzie
+brief: Ta instrukcja wyjaśnia jak rozwiązywać kolizje kinematyczne w Defoldzie
+---
+
+# Rozwiązywanie kolizji kinematycznych
+
+Korzystanie z kinematycznych obiektów kolizji (kinematic collision objects) wymaga się od Ciebie ręcznego rozwiązywania kolizji i przemieszczania obiektów jako reakcji na nie. Proste podejście do rozdzielenia dwóch kolidujących obiektów wygląda następująco:
+
+```lua
+function on_message(self, message_id, message, sender)
+  -- Handle collision
+  if message_id == hash("contact_point_response") then
+    local newpos = go.get_position() + message.normal * message.distance
+    go.set_position(newpos)
+  end
+end
+```
+
+Ten kod rozdzieli Twój obiekt kinematyczny od innych obiektów fizycznych, które penetruje, ale rozdzielenie często jest zbyt duże, co prowadzi do drgań w wielu przypadkach. Aby lepiej zrozumieć problem, rozważmy następujący przypadek, w którym postać gracza koliduje z dwoma obiektami, *A* i *B*:
+
+![Kolzja fizyczna](images/physics/collision_multi.png){srcset="images/physics/[email protected] 2x"}
+
+Silnik fizyki wyśle wiele wiadomości `"contact_point_response"`, jedną dla obiektu *A* i jedną dla obiektu *B* w klatce, w której wystąpiła kolizja. Jeśli przesuniesz postać w odpowiedzi na każde przeniknięcie, jak w prostym kodzie powyżej, to rozdzielenie będzie się prezentować następująco:
+
+- Przesuń postać poza obiekt *A* zgodnie z jego odległością penetracji (czarna strzałka).
+- Przesuń postać poza obiekt *B* zgodnie z jego odległością penetracji (czarna strzałka).
+
+Kolejność tych działań jest dowolna, ale wynik jest taki sam w obu przypadkach: całkowite rozdzielenie, które stanowi *sumę wektorów penetracji* poszczególnych obiektów:
+
+![Proste rozdzielenie](images/physics/separation_naive.png){srcset="images/physics/[email protected] 2x"}
+
+Aby właściwie rozdzielić postać od obiektów *A* i *B*, musisz obsłużyć odległość penetracji punktów kontaktowych i sprawdzić, czy jakiekolwiek wcześniejsze rozdzielenia już całkowicie lub częściowo rozwiązały problem rozdzielenia.
+
+Załóżmy, że pierwsza wiadomość punktu kontaktowego pochodzi od obiektu *A* i przesuwasz postać poza obiekt *A* zgodnie z wektorem penetracji *A*:
+
+![Rozdzielenie krok 1](images/physics/separation_step1.png){srcset="images/physics/[email protected] 2x"}
+
+Wtedy postać zostaje już częściowo rozdzielona od obiektu *B*. Ostateczna korekta konieczna do pełnego rozdzielenia od obiektu *B* jest wskazana czarną strzałką powyżej. Długość wektora kompensacji (compensation vector) można obliczyć, projektując wektor penetracji *A* na wektor penetracji *B*:
+
+![Projekcja](images/physics/projection.png){srcset="images/physics/[email protected] 2x"}
+
+```
+l = vmath.project(A, B) * vmath.length(B)
+```
+
+Wektor kompensacji można znaleźć, zmniejszając długość *B* o *l*. Aby obliczyć to dla dowolnej liczby penetracji, można akumulować niezbędną korektę w wektorze, który zaczyna się od wektora kompensacji o zerowej długości:
+
+1. Zweryfikuj projekcję bieżącej korekcji na wektor penetracji kontaktu.
+2. Oblicz, ile kompensacji pozostało z wektora penetracji (zgodnie z powyższym wzorem).
+3. Przesuń obiekt o wektor kompensacji.
+4. Dodaj kompensację do akumulowanej korekty.
+
+Pełna implementacja wygląda tak:
+
+```lua
+function init(self)
+  -- wektor korekcji (kompensacji)
+  self.correction = vmath.vector3()
+end
+
+function update(self, dt)
+  -- zresetuj wektor korekcji
+  self.correction = vmath.vector3()
+end
+
+function on_message(self, message_id, message, sender)
+  -- Obsługa kolizji
+  if message_id == hash("contact_point_response") then
+    -- Pobierz informacje potrzebne do rozdzielenia kolizji. Możemy
+    -- otrzymać wiele punktów kontaktowych i musimy obliczyć,
+    -- jak się z nich wycofać, akumulując korekcję
+    -- na tę klatkę:
+    if message.distance > 0 then
+      -- Po pierwsze, zweryfikuj projektowaną korekcję na
+      -- wektor penetracji akumulowany
+      local proj = vmath.project(self.correction, message.normal * message.distance)
+      if proj < 1 then
+        -- Weź pod uwagę tylko projekcje, które nie przestrzeliły.
+        local comp = (message.distance - message.distance * proj) * message.normal
+        -- Dodaj kompensację
+        go.set_position(go.get_position() + comp)
+        -- Akumuluj korekcję
+        self.correction = self.correction + comp
+      end
+    end
+  end
+end
+```

+ 74 - 0
docs/pl/manuals/physics-shapes.md

@@ -0,0 +1,74 @@
+---
+title: Kształty Kolizji
+brief: Ta instrukcja opisuje szczegóły działania kształtów kolizji silnika fizyki.
+---
+
+# Kształty Kolizji
+
+Komponent Obiektu Kolizji (Collision Object) może używać kilku kształtów podstawowych (ang. primitive shapes) lub pojedynczego kształtu złożonego.
+
+### Kształty podstawowe
+
+Podstawowe kształty to *box* - prostokąt, *sphere* - sfera i *capsule* - kapsuła. Aby dodać kształt podstawowy, <kbd>kliknij prawym przyciskiem myszy</kbd> obiekt kolizji, a następnie wybierz <kbd>Add Shape</kbd>:
+
+![Add a primitive shape](images/physics/add_shape.png)
+
+## Kształt prostokątny
+Kształt prostokątny (box) posiada pozycję, rotację i wymiary (szerokość, wysokość i głębokość):
+
+![Kształt prostokątny](images/physics/box.png)
+
+## Kształt sfery
+Sfera (sphere) posiada pozycję, rotację i średnicę:
+
+![Kształt sfery](images/physics/sphere.png)
+
+## Kształt kapsuły
+Kapsuła posiada pozycję, rotację, średnicę i wysokość:
+
+![Kształt kapsuły](images/physics/capsule.png)
+
+::: important
+Kształty kapsuły są obsługiwane tylko w przypadku korzystania z fizyki 3D (skonfigurowanej w sekcji *Physics* w pliku *game.project*).
+:::
+
+### Kształty złożone
+Kształty złożone (ang. complex shapes) można utworzyć z komponentu mapy kafelków lub z kształtu wypukłego (convex hull shape).
+
+## Kształt kolizji mapy kafelków
+Defold zawiera funkcję, która umożliwia łatwe generowanie kształtów fizyki dla Źródła Kafelków (Tile Source) używanego przez mapę kafelków. W [instrukcji Źródła Kafelków](/manuals/tilesource/#tile-source-collision-shapes) wyjaśniono, jak dodać grupy kolizji do źródła kafelków i przypisać kafelki do grup kolizji ([przykład](/examples/tilemap/collisions/)).
+
+Aby dodać kolizję do mapy kafelków:
+
+1. Dodaj mapę kafelków do obiektu gry, <kbd>klikając go prawym przyciskiem myszy</kbd> i wybierając <kbd>Add Component File</kbd>. Wybierz plik mapy kafelków.
+2. Dodaj komponent obiektu kolizji do obiektu gry, <kbd>klikając go prawym przyciskiem myszy</kbd> i wybierając <kbd>Add Component ▸ Collision Object</kbd>.
+3. Zamiast dodawać kształty do komponentu, ustaw właściwość Kształt kolizji na plik mapa kafelków (*tilemap*).
+4. Skonfiguruj *Properties* komponentu obiektu kolizji.
+
+![Kształt kolizji mapy kafelków](images/physics/collision_tilemap.png){srcset="images/physics/[email protected] 2x"}
+
+::: important
+Należy zauważyć, że właściwość *Group* **nie** jest tutaj używana, ponieważ grupy kolizji są definiowane w źródle kafelków (tile source) mapy kafelków.
+:::
+
+## Kształt kolizji wypukłej
+Defold zawiera funkcję, która umożliwia tworzenie kształtu wypukłego (convex hull shape) z trzech lub więcej punktów. Możesz użyć zewnętrznego narzędzia, takiego jak [Defold Polygon Editor](/assets/defoldpolygoneditor/) lub [Physics Body Editor](https://selimanac.github.io/physics-body-editor/), aby utworzyć kształt wypukły.
+
+1. Utwórz plik kształtu wypukłego (o rozszerzeniu pliku .`.convexshape`) za pomocą zewnętrznego edytora.
+2. Zamiast dodawać kształty do komponentu obiektu kolizji, ustaw właściwość *Collision Shape* na plik *convex shape*.
+
+::: sidenote
+Kształt taki nie będzie rysowany w Edytorze. Możesz włączyć [debugowanie fizyki](/manuals/debugging/#debugging-problems-with-physics) podczas działania programu, aby zobaczyć kształt.
+:::
+
+# Skalowanie kształtów kolizji
+
+Obiekt kolizji i jego kształty dziedziczą skalę obiektu gry. Aby wyłączyć to zachowanie, odznacz pole wyboru "[Allow Dynamic Transforms](/manuals/project-settings/#allow-dynamic-transforms)", czyli Zezwalaj na dynamiczne transformacje w sekcji *Physics* pliku *game.project*. Należy pamiętać, że obsługiwane jest tylko skalowanie jednolite (uniform), a jeśli skala nie jest jednolita, zostanie użyta najmniejsza wartość skali.
+
+# Obracanie kształtów kolizji
+
+## Obracanie kształtów kolizji w fizyce 3D
+Kształty kolizji w fizyce 3D można obracać wokół wszystkich osi.
+
+## Obracanie kształtów kolizji w fizyce 2D
+Kształty kolizji w fizyce 2D można obracać tylko wokół osi Z. Obrót wokół osi X lub Y spowoduje nieprawidłowe wyniki i powinno się go unikać, nawet przy obracaniu o 180 stopni, aby efektywnie odwrócić kształt wzdłuż osi x lub y. Aby odwrócić kształt fizyczny, zaleca się korzystanie z [`physics.set_hlip(url, flip)`](/ref/stable/physics/?#physics.set_hflip:url-flip) i [`physics.set_vlip(url, flip)`](/ref/stable/physics/?#physics.set_vflip:url-flip).

+ 37 - 0
docs/pl/manuals/physics.md

@@ -0,0 +1,37 @@
+---
+title: Fizyka w Defoldzie
+brief: Ta instrukcja prezentuje fizykę w Defoldzie.
+---
+
+# Fizyka
+
+Defold zawiera zmodyfikowaną wersję silnika fizycznego [Box2D](http://www.box2d.org) (wersja 2.1) do symulacji fizyki 2D oraz silnik fizyczny Bullet (wersja 2.77) do fizyki 3D. Pozwala to na symulację oddziaływań fizyki klasycznej Newtona między różnymi rodzajami obiektów kolizji (_collision objects_). Ta instrukcja wyjaśnia, jak to działa.
+
+Główne koncepcje silników fizycznych używanych w Defoldzie to:
+
+* **Collision objects** - Obiekt kolizji - komponent, który stosujesz, aby nadać obiektowi gry właściwości fizyczne. Obiekt kolizji posiada właściwości fizyczne, takie jak masa, tarcie i kształt. [Dowiedz się, jak tworzyć obiekt kolizji](/manuals/physics-objects).
+* **Collision shapes** - Kształty kolizi - obiekty kolizji mogą używać kilku kształtów podstawowych (primitive shapes) lub pojedynczego kształtu złożonego (complex shape), aby określić jego rozszerzenie przestrzenne (spatial extension). [Dowiedz się, jak dodawać kształty do obiektu kolizji](/manuals/physics-groups).
+* **Collision groups** - Grupy kolizji - wszystkie obiekty kolizji muszą należeć do zdefiniowanej grupy, a każdy obiekt kolizji może określić listę innych grup, z którymi może kolidować. [Dowiedz się, jak korzystać z grup kolizji](/manuals/physics-groups).
+* **Collision messages** - Wiadomości kolizji - gdy dwa obiekty kolizji zderzają się, silnik fizyczny wysyła wiadomości do obiektów gry, do których należą komponenty obiektów kolizji. [Dowiedz się więcej o wiadomościach kolizji](/manuals/physics-messages).
+
+Oprócz samych obiektów kolizji, można również definiować ograniczenia (**constraints**) obiektu kolizji, bardziej znane jako łączenia (**joints**), aby połączyć ze sobą dwa obiekty kolizji i ograniczyć lub w inny sposób zastosować siłę oraz wpływać na ich zachowanie w symulacji fizycznej. [Dowiedz się więcej o łączeniach](/manuals/physics-joints).
+
+Możesz również badać i odczytywać świat fizyczny wzdłuż specjalnego liniowego promienia (**ray cast**). [Dowiedz się więcej o promieniach](/manuals/physics-ray-casts).
+
+## Jednostki używane w symulacji silnika fizycznego
+
+Silnik fizyczny symuluje fizykę klasyczną Newtona i został zaprojektowany do współpracy z jednostkami MKS - metrów, kilogramów i sekund. Ponadto silnik fizyczny jest dostrojony, aby dobrze działał z poruszającymi się obiektami o rozmiarze w zakresie od 0,1 do 10 metrów (obiekty statyczne mogą być większe), a domyślnie silnik traktuje 1 jednostkę (piksel) jako 1 metr. Ta konwersja między pikselami a metrami jest wygodna na poziomie symulacji, ale z perspektywy tworzenia gier nie jest zbyt przydatna. Domyślnie kształt kolizji o rozmiarze 200 pikseli jest traktowany jako obiekt o rozmiarze 200 metrów, co jest znacznie poza zalecanym zakresem, przynajmniej dla obiektu poruszającego się.
+
+W ogólności wymagane jest dostosowanie skali symulacji fizycznej, aby działała dobrze z typowym rozmiarem obiektów w grze. Skalę symulacji fizycznej można zmienić w pliku *game.project* za pomocą ustawienia skali fizyki - [physics scale setting](/manuals/project-settings/#physics). Ustawienie tej wartości na przykład na 0,02 oznacza, że 200 pikseli będzie traktowane jako 4 metry. Należy zauważyć, że grawitacja (również zmieniana w *game.project*) musi zostać zwiększona, aby dostosować się do zmiany skali.
+
+## Aktualizacja fizyki
+
+Zaleca się regularną aktualizację silnika fizycznego, aby zapewnić stabilną symulację (w przeciwieństwie do aktualizacji w nieregularnych odstępach czasu zależnych od częstotliwości klatek). Możesz używać stałej aktualizacji dla fizyki, zaznaczając opcję używania stałego kroku czasowego: ["Use Fixed Timestep"](/manuals/project-settings/#physics) w sekcji `Physics` w pliku *game.project*. Częstotliwość aktualizacji jest kontrolowana przez częstotliwość stałej aktualizacji: ["Fixed Update Frequency"](/manuals/project-settings/#engine) w sekcji `Engine` w pliku *game.project*. Gdy używasz stałego kroku czasowego dla fizyki, zaleca się również korzystanie ze specjalnej funkcji cyklu życia `fixed_update(self, dt)` do interakcji z obiektami kolizji w grze, na przykład podczas stosowania sił do nich.
+
+## Uwagi i typowe problemy
+
+Pełnomocnicy kolekcji
+: za pomocą pełnomocników kolekcji (collection proxies) można załadować więcej niż jedną kolekcję najwyższego poziomu lub inaczej *świat gry* do silnika. Przy takim rozwiązaniu ważne jest, aby wiedzieć, że każda kolekcja najwyższego poziomu to *osobny* świat fizyczny. Interakcje fizyczne ([kolizje, trigery/wyzwalacze](/manuals/physics-messages) i [promienie ray-cast](/manuals/physics-ray-casts))
+
+Kolizje nie wykrywane
+: Jeśli masz problemy z obsługą lub właściwym wykrywaniem kolizji, upewnij się, że zapoznałeś się z [debugowaniem fizyki w instrukcji debugowania](/manuals/debugging/#debugging-problems-with-physics).

+ 180 - 0
docs/pl/manuals/property-animation.md

@@ -0,0 +1,180 @@
+---
+title: Animacja właściwości
+brief: Ta instrukcja opisuje wsparcie dla animacji właściwości w silniku Defold.
+---
+
+# Animacja właściwości
+
+Wszystkie właściwości (ang. properties) będące zmiennymi numerycznymi (typy Lua: numbers, vector3, vector4 i quaterions (kwaterniony)) oraz stałe shaderów mogą być animowane w Defoldzie wykorzystując wbudowany system animacji, używając funkcji `go.animate()`. Silnik będzie automatycznie dopasowywał wartość (ang. tween) uwzględniając wybrany tryb odtwarzania (playback mode) i funkcję wygładzania (easing function). Można również definiować własne funkcje wygładzania.
+
+  ![Property animation](images/animation/property_animation.png)
+  ![Bounce loop](images/animation/bounce.gif)
+
+## Animowanie właściwości
+
+Aby animować właściwości (ang. properties) obiektu lub komponentu użyj funkcji `go.animate()`. Dla właściwości węzłów GUI, analogiczną funkcją jest `gui.animate()`.
+
+```lua
+-- Ustaw pozycję w osi Y - właściwość komponentu na 200
+go.set(".", "position.y", 200)
+-- Następnie przeprowadź animację właściwości do 100 i z powrotem
+go.animate(".", "position.y", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_OUTBOUNCE, 2)
+```
+
+Aby zatrzymać wszystkie animacje danej właściwości, wywołaj `go.cancel_animations()`, a dla węzłów GUI, analogicznie: `gui.cancel_animation()` lub dookreśl, które właściwości chcesz zatrzymać:
+
+```lua
+-- Zatrzymaj rotację eulera na osi Z obecnego obiektu gry
+go.cancel_animations(".", "euler.z")
+```
+
+Jeśli zatrzymasz animacje właściwości, która jest właściwością "kompozytową" (składającą się z kilku osobnych wartości, jak np. `vector3 position`), osobne animacje każdego z elementów składowych danej właściwości (`position.x`, `position.y` i `position.z`) zostaną zatrzymane.
+
+[Instrukcja do właściwości](/manuals/properties) zawiera wszystkie informacje na temat dostępnych właściwości obiektów, komponentów i węzłów GUI.
+
+## Animowanie właściwości węzłów GUI
+
+Prawie każdą właściwość węzła GUI można animować. Możesz, przykładowo, ukryć węzeł poprzez ustawienie jego koloru (`color`) na całkowicie przezroczysty, a następnie pokazać go przez płynne pojawianie się animując kolor do wartości koloru białego (nieprzezroczystego):
+
+```lua
+local node = gui.get_node("button")
+local color = gui.get_color(node)
+-- Animuj kolor do białego
+gui.animate(node, gui.PROP_COLOR, vmath.vector4(1, 1, 1, 1), gui.EASING_INOUTQUAD, 0.5)
+-- Animuj kolor obrzeży do czerwonego
+gui.animate(node, "outline.x", 1, gui.EASING_INOUTQUAD, 0.5)
+-- I animuj pozycję wzdłuż osi X do 100
+gui.animate(node, hash("position.x"), 100, gui.EASING_INOUTQUAD, 0.5)
+```
+
+## Funkcje po zakończeniu animacji
+
+Funkcje do animacji właściwości `go.animate()` i `gui.animate()` wspierają opcjonalną funkcję tzw. callback jako ostatni argument. Funkcja ta zostanie wywołana po zakończeniu animacji. Funkcja nigdy nie jest wywoływana dla animacji w pętli, więc takich, których tryby odtwarzania zaczynają się od: `PLAYBACK_LOOP_*`, ani w przypadku ręcznego anulowania animacji za pomocą `go.cancel_animations()`. Funkcję zwrotną można wykorzystać do wyzwalania zdarzeń po zakończeniu animacji lub do połączenia różnych animacji w serie, jedna za drugą.
+
+## Wygładzanie
+
+Wygładzanie (ang. easing) określa w jaki sposób animowana będzie wartość w czasie. Poniżej zaprezentowano wykresy funkcji wygładzania przedstawiające wartość w czasie.
+
+Tutaj przedstawione są funkcje wygładzania dostępne dla funkcji `go.animate()`:
+
+|---|---|
+| go.EASING_LINEAR | |
+| go.EASING_INBACK | go.EASING_OUTBACK |
+| go.EASING_INOUTBACK | go.EASING_OUTINBACK |
+| go.EASING_INBOUNCE | go.EASING_OUTBOUNCE |
+| go.EASING_INOUTBOUNCE | go.EASING_OUTINBOUNCE |
+| go.EASING_INELASTIC | go.EASING_OUTELASTIC |
+| go.EASING_INOUTELASTIC | go.EASING_OUTINELASTIC |
+| go.EASING_INSINE | go.EASING_OUTSINE |
+| go.EASING_INOUTSINE | go.EASING_OUTINSINE |
+| go.EASING_INEXPO | go.EASING_OUTEXPO |
+| go.EASING_INOUTEXPO | go.EASING_OUTINEXPO |
+| go.EASING_INCIRC | go.EASING_OUTCIRC |
+| go.EASING_INOUTCIRC | go.EASING_OUTINCIRC |
+| go.EASING_INQUAD | go.EASING_OUTQUAD |
+| go.EASING_INOUTQUAD | go.EASING_OUTINQUAD |
+| go.EASING_INCUBIC | go.EASING_OUTCUBIC |
+| go.EASING_INOUTCUBIC | go.EASING_OUTINCUBIC |
+| go.EASING_INQUART | go.EASING_OUTQUART |
+| go.EASING_INOUTQUART | go.EASING_OUTINQUART |
+| go.EASING_INQUINT | go.EASING_OUTQUINT |
+| go.EASING_INOUTQUINT | go.EASING_OUTINQUINT |
+
+Tutaj przedstawione są funkcje wygładzania dostępne dla funkcji `gui.animate()`:
+
+|---|---|
+| gui.EASING_LINEAR | |
+| gui.EASING_INBACK | gui.EASING_OUTBACK |
+| gui.EASING_INOUTBACK | gui.EASING_OUTINBACK |
+| gui.EASING_INBOUNCE | gui.EASING_OUTBOUNCE |
+| gui.EASING_INOUTBOUNCE | gui.EASING_OUTINBOUNCE |
+| gui.EASING_INELASTIC | gui.EASING_OUTELASTIC |
+| gui.EASING_INOUTELASTIC | gui.EASING_OUTINELASTIC |
+| gui.EASING_INSINE | gui.EASING_OUTSINE |
+| gui.EASING_INOUTSINE | gui.EASING_OUTINSINE |
+| gui.EASING_INEXPO | gui.EASING_OUTEXPO |
+| gui.EASING_INOUTEXPO | gui.EASING_OUTINEXPO |
+| gui.EASING_INCIRC | gui.EASING_OUTCIRC |
+| gui.EASING_INOUTCIRC | gui.EASING_OUTINCIRC |
+| gui.EASING_INQUAD | gui.EASING_OUTQUAD |
+| gui.EASING_INOUTQUAD | gui.EASING_OUTINQUAD |
+| gui.EASING_INCUBIC | gui.EASING_OUTCUBIC |
+| gui.EASING_INOUTCUBIC | gui.EASING_OUTINCUBIC |
+| gui.EASING_INQUART | gui.EASING_OUTQUART |
+| gui.EASING_INOUTQUART | gui.EASING_OUTINQUART |
+| gui.EASING_INQUINT | gui.EASING_OUTQUINT |
+| gui.EASING_INOUTQUINT | gui.EASING_OUTINQUINT |
+
+![Linear interpolation](images/properties/easing_linear.png)
+![In back](images/properties/easing_inback.png)
+![Out back](images/properties/easing_outback.png)
+![In-out back](images/properties/easing_inoutback.png)
+![Out-in back](images/properties/easing_outinback.png)
+![In bounce](images/properties/easing_inbounce.png)
+![Out bounce](images/properties/easing_outbounce.png)
+![In-out bounce](images/properties/easing_inoutbounce.png)
+![Out-in bounce](images/properties/easing_outinbounce.png)
+![In elastic](images/properties/easing_inelastic.png)
+![Out elastic](images/properties/easing_outelastic.png)
+![In-out elastic](images/properties/easing_inoutelastic.png)
+![Out-in elastic](images/properties/easing_outinelastic.png)
+![In sine](images/properties/easing_insine.png)
+![Out sine](images/properties/easing_outsine.png)
+![In-out sine](images/properties/easing_inoutsine.png)
+![Out-in sine](images/properties/easing_outinsine.png)
+![In exponential](images/properties/easing_inexpo.png)
+![Out exponential](images/properties/easing_outexpo.png)
+![In-out exponential](images/properties/easing_inoutexpo.png)
+![Out-in exponential](images/properties/easing_outinexpo.png)
+![In circlic](images/properties/easing_incirc.png)
+![Out circlic](images/properties/easing_outcirc.png)
+![In-out circlic](images/properties/easing_inoutcirc.png)
+![Out-in circlic](images/properties/easing_outincirc.png)
+![In quadratic](images/properties/easing_inquad.png)
+![Out quadratic](images/properties/easing_outquad.png)
+![In-out quadratic](images/properties/easing_inoutquad.png)
+![Out-in quadratic](images/properties/easing_outinquad.png)
+![In cubic](images/properties/easing_incubic.png)
+![Out cubic](images/properties/easing_outcubic.png)
+![In-out cubic](images/properties/easing_inoutcubic.png)
+![Out-in cubic](images/properties/easing_outincubic.png)
+![In quartic](images/properties/easing_inquart.png)
+![Out quartic](images/properties/easing_outquart.png)
+![In-out quartic](images/properties/easing_inoutquart.png)
+![Out-in quartic](images/properties/easing_outinquart.png)
+![In quintic](images/properties/easing_inquint.png)
+![Out quintic](images/properties/easing_outquint.png)
+![In-out quintic](images/properties/easing_inoutquint.png)
+![Out-in quintic](images/properties/easing_outinquint.png)
+
+## Własne funkcje wygładzania
+
+Możesz tworzyć własne funkcje wygładzania zdefiniowane jako specjalny `vector` ze zbiorem odpowiednich, kolejnych wartości i użyć go zamiast predefiniowanych stałych przedstawionych powyżej. Wektor ten reprezentuje krzywą zmiany wartości numerycznej od wartości startowej (`0`) do wartości końcowej (`1`). Silnik interpoluje w czasie działania programu te wartości liniowo.
+
+For example, the vector:
+
+```lua
+local values = { 0, 0.4, 0.2, 0.2, 0.5. 1 }
+local my_easing = vmath.vector(values)
+```
+
+stworzy następującą krzywą:
+
+![Custom curve](images/animation/custom_curve.png)
+
+W poniższym przykładzie wartość y pozycji obiektu skacze między aktualną pozycją startową, a pozycją docelową 200:
+
+```lua
+local values = { 0, 0, 0, 0, 0, 0, 0, 0,
+                 1, 1, 1, 1, 1, 1, 1, 1,
+                 0, 0, 0, 0, 0, 0, 0, 0,
+                 1, 1, 1, 1, 1, 1, 1, 1,
+                 0, 0, 0, 0, 0, 0, 0, 0,
+                 1, 1, 1, 1, 1, 1, 1, 1,
+                 0, 0, 0, 0, 0, 0, 0, 0,
+                 1, 1, 1, 1, 1, 1, 1, 1 }
+local square_easing = vmath.vector(values)
+go.animate("go", "position.y", go.PLAYBACK_LOOP_PINGPONG, 200, square_easing, 2.0)
+```
+
+![Square curve](images/animation/square_curve.png)

+ 63 - 0
docs/pl/manuals/resource.md

@@ -0,0 +1,63 @@
+---
+title: Zarządzanie zasobami w Defoldzie
+brief: Ta instrukcja wyjaśnia jak Defold automatycznie zarządza zasobami i jak można rędzie to robić.
+---
+
+# Zarządzanie zasobami
+
+Jeśli tworzysz bardzo małą grę, ograniczenia platformy docelowej (rozmiar pamięci, rozmiar paczki, moc obliczeniowa i zużycie baterii) mogą nigdy nie stanowić problemu. Jednak tworząc większe gry, zwłaszcza na urządzeniach przenośnych czy na przeglądarki, zużycie pamięci będzie prawdopodobnie jednym z największych ograniczeń. Doświadczony zespół będzie starannie zarządzać zasobami w oparciu o ograniczenia platformy. Defold dostarcza szereg funkcji do zarządzania pamięcią i rozmiarem paczki. Ta instrukcja pozwala się z nimi zapoznać.
+
+## Statyczne drzewo zasobów
+
+Podczas tworzenia gry w Defoldzie deklarujesz statycznie drzewo zasobów. Każda część gry jest łączona z drzewem, począwszy od kolekcji rozruchowej (ang. bootrstrap collection), zwykle nazywanej "main.collection". Drzewo zasobów podąża za każdym odniesieniem i zawiera wszystkie zasoby powiązane z tymi odniesieniami:
+
+- Dane obiektów gry (game objects) i komponentów (atlasy, dźwięki itp).
+- Prototypy komponentów fabryki (obiekty gry i kolekcje).
+- Odniesienia komponentów pełnomocników kolekcji (kolekcje).
+- Niestandardowe zasoby deklarowane w *game.project*.
+
+![Drzewo zasobów](images/resource/resource_tree.png)
+
+Podczas tworzenia i pakowania gry, tylko to, co znajduje się w drzewie zasobów, zostanie uwzględnione w paczce. To, czego nie ma w drzewie, jest pomijane. Nie ma potrzeby ręcznego wybierania, co ma być uwzględnione lub wyłączone z paczki.
+
+Podczas *uruchamiania* gry, silnik rozpoczyna działanie od korzenia drzewa rozruchowego (ang. bootstrap root) i ściąga zasoby do pamięci:
+
+- Każda kolekcja, do której odniesienie istnieje, wraz z jej zawartością.
+- Obiekty gry i dane komponentów.
+- Prototypy komponentów fabryki (obiekty gry i kolekcje).
+
+Defold nie ładuje jednak automatycznie następujących rodzajów odniesionych zasobów podczas działania:
+
+- Kolekcji świata gry, do której odniesienie istnieje przez proxy kolekcji. Światy gry są stosunkowo duże, więc będziesz musiał ręcznie uruchamiać i wyłączać ich ładowanie w kodzie. Zobacz [instrukcję do pełnomocników kolekcji](/manuals/collection-proxy), aby poznać szczegóły.
+- Pliki dodane za pomocą ustawienia *Custom Resources* (Niestandardowe zasoby) w *game.project*. Te pliki są ręcznie ładowane za pomocą funkcji [sys.load_resource()](/ref/sys/#sys.load_resource).
+
+Domyślny sposób, w jaki Defold pakuje i ładuje zasoby, można zmienić, aby uzyskać kontrolę nad tym, jak i kiedy zasoby wchodzą do pamięci.
+
+![Wczytywanie zasobów](images/resource/loading.png)
+
+## Dynamiczne ładowanie zasobów fabryki
+
+Zasoby odniesione przez komponenty fabryki (ang. factory components) są zazwyczaj ładowane do pamięci, w momencie, gdy komponent jest ładowany. Zasoby są gotowe do użycia w grze, zanim fabryka zostanie utworzona w czasie działania. Aby zmienić domyślne zachowanie i opóźnić ładowanie zasobów fabryki, można po prostu zaznaczyć w właściwościach fabryki opcję *Load Dynamically* (Ładuj dynamicznie).
+
+![Opcja Ładuj dynamicznie](images/resource/load_dynamically.png)
+
+Zaznaczenie tej opcji spowoduje, że silnik wciąż zawierać będzie odniesione zasoby w paczce gry, ale nie załaduje ich automatycznie. Zamiast tego masz dwie opcje:
+
+1. Wywołać funckję [`factory.create()`](/ref/factory/#factory.create) lub [`collectionfactory.create()`](/ref/collectionfactory/#collectionfactory.create), gdy chcesz tworzyć obiekty. To spowoduje synchroniczne ładowanie zasobów, a następnie tworzenie nowych instancji.
+2. Wywołać funckję [`factory.load()`](/ref/factory/#factory.load) lub [`collectionfactory.load()`](/ref/collectionfactory/#collectionfactory.load), aby asynchronicznie ładować zasoby. Gdy zasoby będą gotowe do tworzenia, zostanie odebrane odpowiednie wywołanie zwrotne (callback).
+
+Zobacz [instrukcję do fabryk](/manuals/factory) i [instrukcję do fabryk kolekcji](/manuals/collection-factory) po szczegóły dotyczące działania tych opcji.
+
+## Dynamiczne zwalnianie ładowanych zasobów
+
+Defold zachowuje liczniki odniesień dla wszystkich zasobów. Jeśli licznik odniesienia zasobu wynosi zero, oznacza to, że nie ma do niego już żadnego odniesienia. Zasób zostaje wtedy automatycznie usunięty z pamięci. Na przykład, jeśli usuniesz wszystkie obiekty utworzone przez fabrykę i dodatkowo usuniesz obiekt zawierający komponent fabryki, zasoby wcześniej odniesione przez fabrykę zostaną usunięte z pamięci.
+
+Dla fabryk oznaczonych jako *Load Dynamically* można wywołać funkcję [`factory.unload()`](/ref/factory/#factory.unload) albo [`collectionfactory.unload()`](/ref/collectionfactory/#collectionfactory.unload). To wywołanie usuwa odniesienie komponentu fabryki do zasobu. Jeśli nic innego nie odnosi się do zasobu (np. wszystkie utworzone obiekty są usunięte), zasób zostanie zwolniony z pamięci.
+
+## Wykluczanie zasobów z paczki
+
+Dzięki proxy (pełnomocnikom) kolekcji można pominąć wszystkie zasoby, do których odnosi się komponent, w procesie pakowania (bundling). Jest to przydatne, jeśli potrzebujesz zachować minimalny rozmiar paczki. Na przykład, podczas uruchamiania gier w sieci jako HTML5, przeglądarka pobierze całą paczkę przed uruchomieniem gry.
+
+![Wykluczanie zasobów z paczki](images/resource/exclude.png)
+
+Zaznaczenie opcji pełnomocnika kolekcji nazwanej *Exclude* (Wyklucz) spowoduje, że odniesienie do zasobu zostanie pominięte w paczce gry. Zamiast tego można przechowywać wyłączone kolekcje w wybranym przechowywaniu w chmurze. W [instrukcji do aktualizacji na żywo - Live update](/manuals/live-update/) wyjaśniono, jak działa ta funkcja.

+ 34 - 0
docs/pl/manuals/texture-filtering.md

@@ -0,0 +1,34 @@
+---
+title: Filtrowanie i próbkowanie tekstur
+brief: Ta instrukcja opisuje możliwe opcje filtrowania i próbkowania tekstur podczas renderowania grafiki.
+---
+
+# Filtrowanie i próbkowanie tekstur
+
+Filtrowanie tekstury decyduje o wyniku wizualnym w przypadkach, gdy _texel_ (pojedynczy piksel w teksturze) nie jest idealnie wyrównany z rzeczywistym pikselem na ekranie. Dzieje się tak, gdy przesuniesz element graficzny zawierający teksturę o mniej niż jeden piksel. Dostępne są następujące metody filtrowania:
+
+Nearest
+: Najbliższy texel zostanie wybrany do pokolorowania piksela na ekranie. Ta metoda próbkowania powinna być wybrana, jeśli chcesz uzyskać idealne mapowanie jeden do jednego od pikseli na teksturze do tego, co widzisz na ekranie. Dzięki filtrowaniu "Nearest" wszystko będzie przeskakiwać z piksela na piksel podczas przesuwania. Może to wyglądać "nerwowo", jeśli Sprite porusza się wolno, za to może się sprawdzać przy grafice pixelart.
+
+Linear
+: Liniowe filtrowanie - kolor texelu zostanie uśredniony z kolorami sąsiadujących texeli przed pokolorowaniem piksela na ekranie. Ta metoda sprawia, że powolne, płynne ruchy wyglądają gładko, ponieważ Sprite stopniowo przechodzi w piksele, zanim zostaną one w pełni pokolorowane - dzięki czemu możliwe jest przesuwanie Sprite'a o mniej niż jeden pełny piksel.
+
+Ustawienie, której metody filtrowania używać, znajduje się w Ustawieniach Projektu - [Project Settings](/manuals/project-settings/#graphics). Istnieją dwa takie ustawienia:
+
+default_texture_min_filter
+: Filtrowanie przy pomniejszaniu jest stosowane, gdy texel jest mniejszy niż piksel na ekranie.
+
+default_texture_mag_filter
+: Filtrowanie przy powiększaniu jest stosowane, gdy texel jest większy niż piksel na ekranie.	
+
+Oba ustawienia mogą przyjmować wartości `linear` lub `nearest`. Na przykład:
+
+```ini
+[graphics]
+default_texture_min_filter = nearest
+default_texture_mag_filter = nearest
+```
+
+Jeśli nie określisz niczego, oba są domyślnie ustawione na `linear`.
+
+Zauważ, że ustawienie w *game.project* jest używane w domyślnych narzędziach do próbkowania (samplers). Jeśli określisz samplery we własnym, niestandardowym materiale, możesz ustawić metodę filtrowania dla każdego samplera osobno. Zobacz szczegóły w [instrukcji do materiałów](/manuals/material/).

+ 235 - 0
docs/pl/manuals/texture-profiles.md

@@ -0,0 +1,235 @@
+---
+title: Profile tekstur w Defoldzie
+brief:  Defold wspiera automatyczne przetwarzanie tekstur i kompresję obrazów. Ta instrukcja opisuje te funckjonalności.
+---
+
+# Profile tekstur w Defoldzie
+
+Defold obsługuje automatyczne przetwarzanie tekstur i kompresję danych obrazów (w Atlasie, Źródłach Kafelków (*Tile sources*), Mapach Kostkowych (*Cubemaps*) i samodzielnych teksturach używanych do modeli, GUI itp).
+
+Istnieją dwa rodzaje kompresji: programowa i sprzętowa kompresja tekstur.
+
+1. Programowa kompresja tekstur (software texture compression) (takie jak PNG i JPEG) zmniejsza rozmiar pamięci zasobów obrazu. Powoduje to zmniejszenie ostatecznego rozmiaru paczki z grą. Jednak pliki obrazów muszą być rozpakowane podczas wczytywania do pamięci, więc nawet jeśli obraz jest mały na dysku, może zajmować dużo miejsca w pamięci.
+
+2. Sprzętowa kompresja tekstur (hardware texture compression) również zmniejsza rozmiar pamięci zasobów obrazu. Jednak w przeciwieństwie do kompresji programowej, zmniejsza rozmiar tekstur w pamięci. Dzieje się tak, ponieważ sprzęt graficzny może bezpośrednio zarządzać teksturami skompresowanymi, bez konieczności ich wcześniejszego dekompresowania.
+
+Przetwarzanie tekstur jest konfigurowane za pomocą konkretnego profilu tekstury (ang. texture profile). W tym pliku tworzysz _profile_, które wyrażają, jakie skompresowane formaty i jakiego typu powinny być używane przy tworzeniu paczki z grą dla określonej platformy. _Profile_ są przypisane do odpowiadających im wzorców plików - _paths patterns_, co pozwala na dokładną kontrolę nad tym, które pliki w twoim projekcie powinny być kompresowane i w jaki sposób dokładnie.
+
+Ponieważ każda dostępna sprzętowa kompresja tekstur jest stratna, otrzymasz tzw. artefakty w danych tekstury. Te artefakty są silnie zależne od tego, jak wygląda twój materiał źródłowy i jakie metody kompresji są używane. Powinieneś przetestować swój materiał źródłowy i eksperymentować, aby uzyskać najlepsze wyniki. Wujek Google może być twoim przyjacielem w tej kwestii.
+
+Możesz wybrać, jakie kompresje obrazów oprogramowania są stosowane na ostatecznych danych tekstury (skompresowane lub nieskompresowane) w archiwum paczki (bundle archives). Defold obsługuje kompresję tekstury [Basis Universal](https://github.com/BinomialLLC/basis_universal), która kompresuje obraz w pośredni format. Ten format jest przekształcany w czasie rzeczywistym na format sprzętu odpowiedni dla GPU bieżącego urządzenia. Format Basis Universal jest formatem wysokiej jakości, ale stratnym. Wszystkie obrazy są również kompresowane za pomocą LZ4, aby jeszcze bardziej zmniejszyć rozmiar pliku, gdy są przechowywane w archiwum gry.
+
+::: sidenote
+Kompresja jest operacją czasochłonną i wymagającą sporych zasobów, która może spowodować bardzo długie czasy kompilacji, w zależności od liczby obrazów do skompresowania oraz wybranych formatów tekstury i rodzaju wybranej programowej kompresji tekstur.
+:::
+
+## Profile tekstur
+
+Każdy projekt zawiera określony plik *.texture_profiles*, który zawiera konfigurację używaną podczas kompresji tekstur. Domyślnie ten plik to *builtins/graphics/default.texture_profiles* i zawiera konfigurację dopasowującą każdy zasób tekstury do profilu przy użyciu RGBA bez sprzętowej kompresji tekstur i z domyślną kompresją plików ZLib.
+
+Aby dodać kompresję tekstur:
+
+- Wybierz <kbd>File ▸ New...</kbd>, a następnie *Texture Profiles* (Profile tekstur), aby utworzyć nowy plik profili tekstur. (Albo skopiuj *default.texture_profiles* poza folder *builtins* na wybrane miejsce)
+- Wybierz nazwę i lokalizację nowego pliku.
+- Zmień wpis *texture_profiles* w *game.project*, aby wskazywał na nowy plik.
+- Otwórz plik *.texture_profiles* i skonfiguruj go zgodnie z własnymi wymaganiami.
+
+![Nowy plik profili tekstur](images/texture_profiles/texture_profiles_new_file.png)
+
+![Ustawienia profilu tekstur](images/texture_profiles/texture_profiles_game_project.png)
+
+W preferencjach Edytora można włączyć i wyłączyć korzystanie z profili tekstur. Wybierz <kbd>File ▸ Preferences...</kbd>. Karta *General* zawiera opcję *Enable texture profiles* (Włącz profile tekstur).
+
+![Preferencje profili tekstur](images/texture_profiles/texture_profiles_preferences.png)
+
+## Ustawienia ścieżki
+
+Sekcja *Path Settings* (Ustawienia ścieżki) w pliku profilów tekstur zawiera listę wzorców ścieżek i informacje, który *profil* ma być używany przy przetwarzaniu zasobów odpowiadających danej ścieżce. Ścieżki wyrażone są jako wzorce "Ant Glob" ([zobacz tutaj](http://ant.apache.org/manual/dirtasks.html#patterns) w celu uzyskania szczegółów). Wzorce można wyrazić przy użyciu następujących symboli wieloznacznych (wildcards):
+
+`*`
+: Dopasowanie do zera lub więcej znaków. Na przykład `sprite*.png` pasuje do plików `sprite.png`, `sprite1.png` i `sprite_with_a_long_name.png`.
+
+`?`
+: Dopasowanie dokładnie do jednego znaku. Na przykład `sprite?.png` pasuje do plików `sprite1.png`, `spriteA.png`, ale nie pasuje do `sprite.png` ani `sprite_with_a_long_name.png`.
+
+`**`
+: Dopasowanie do całego drzewa katalogów lub - gdy używane jako nazwa katalogu - do zera lub więcej katalogów. Na przykład `/gui/**` pasuje do wszystkich plików w katalogu `/gui` i wszystkich jego podkatalogach.
+
+![Ścieżki](images/texture_profiles/texture_profiles_paths.png)
+
+Ten przykład zawiera dwa wzorce ścieżek i odpowiadające im profile.
+
+`/gui/**/*.atlas`
+: Wszystkie pliki *.atlas* w katalogu */gui* lub którymkolwiek z jego podkatalogów będą przetwarzane zgodnie z profilem "gui_atlas".
+
+`/**/*.atlas`
+: Wszystkie pliki *.atlas* w dowolnym miejscu w projekcie będą przetwarzane zgodnie z profilem "atlas".
+
+Należy zauważyć, że bardziej ogólna ścieżka jest podawana na końcu. Kryterium działania jest określone jako od góry do dołu. Pierwsze wystąpienie, które pasuje do ścieżki zasobu, zostanie użyte. Dopasowanie ścieżki niżej na liście nigdy nie zastępuje pierwszego trafienia. Gdyby ścieżki były podane w odwrotnej kolejności, każda mapa kostek zostałaby przetworzona profilem "atlas", nawet te w katalogu */gui*.
+
+Zasoby tekstur, które _nie_ pasują do żadnej ścieżki w pliku profili, zostaną skompilowane i przeskalowane do najbliżej potęgi liczby 2, ale poza tym pozostaną nietknięte.
+
+## Profile
+
+Sekcja *profiles* (profile) w pliku profili tekstur zawiera listę nazwanych profili. Każdy profil zawiera jedną lub więcej platform (*platforms*), a każdą platformę opisuje lista właściwości.
+
+![Profile](images/texture_profiles/texture_profiles_profiles.png)
+
+*Platforms*
+: Określa pasującą platformę. `OS_ID_GENERIC` pasuje do wszystkich platform, w tym do wersji dev-app na urządzeniu, `OS_ID_WINDOWS` pasuje do wersji docelowych systemów Windows, `OS_ID_IOS` pasuje do wersji na urządzenia iOS itp. Należy zauważyć, że jeśli określono `OS_ID_GENERIC`, zostanie on uwzględniony we wszystkich platformach.
+
+::: important
+Jeśli dwa [ustawienia ścieżki](#path-settings) pasują do tego samego pliku i ścieżka używa różnych profili z różnymi platformami, zostaną użyte **oba** profile i zostaną wygenerowane **dwie** tekstury.
+:::
+
+*Formats*
+: Jedna lub więcej formatów tekstury do wygenerowania. Jeśli określono wiele formatów, zostaną wygenerowane tekstury dla każdego formatu i dołączone do paczki. Silnik wybiera tekstury formatu obsługiwanego przez platformę uruchomieniową.
+
+*Mipmaps*
+: Jeśli zaznaczone, generowane są [mipmapy](https://pl.wikipedia.org/wiki/Mipmapping) dla platformy. Domyślnie jest zaznaczone.
+
+*Premultiply alpha*
+: Jeśli zaznaczone, alfa, czyli wskaźnik przezroczystości, jest wstępnie mnożona do danych tekstury. Domyślnie jest zaznaczone.
+
+*Max Texture Size*
+: Maksymalny rozmiar tekstury. Jeśli ustawiono tę opcję na wartość różną od zera, tekstury są ograniczone pod względem liczby pikseli do określonej liczby. Każda tekstura, która ma szerokość lub wysokość większą niż określona wartość, zostanie przeskalowana w dół.
+
+Do każdego profilu dodawane są następujące formaty (*Formats*):
+
+*Format*
+: Format do użycia podczas enkodowania tekstury. Poniżej znajdują się dostępne formaty tekstur.
+
+*Compression*
+: Kompresja. Wybiera poziom jakości wynikowego obrazu skompresowanego.
+
+| Poziom   | Informacja                                      |
+| -------- | ----------------------------------------------- |
+| `FAST`   | Najszybsza kompresja. Niska jakość grafiki      |
+| `NORMAL` | Domyślna kompresja. Najlepsza jakość grafiki    |
+| `HIGH`   | Najwolniejsza kompresja. Mniejszy rozmiar pliku |
+| `BEST`   | Wolna kompresja. Najmniejszy rozmiar pliku      |
+
+::: sidenote
+Od wersji 1.2.185 nazwy te zostały zmienione - zredefiniowane, aby uniknąć niejednoznaczności.
+:::
+
+*Type*
+: Pozwala określić typ kompresji dla obrazów, `COMPRESSION_TYPE_DEFAULT`, `COMPRESSION_TYPE_WEBP` albo `COMPRESSION_TYPE_WEBP_LOSSY`. Zobacz [Typy Kompresji tutaj](#compression-types).
+
+## Formaty tekstur
+
+Tekstury sprzętowe mogą być przetwarzane na dane nieskompresowane lub skompresowane *stratnie* o różnej liczbie kanałów i głębi bitowej. Kompresja sprzętowa oznacza, że ostateczny obraz będzie miał stały rozmiar, niezależnie od zawartości obrazu. Oznacza to, że utrata jakości podczas kompresji zależy od zawartości oryginalnej tekstury.
+
+Ponieważ transkodowanie kompresji Basis Universal zależy od możliwości karty graficznej (GPU) urządzenia, zalecane formaty do użycia z kompresją Basis Universal to ogólne formaty, takie jak:
+`TEXTURE_FORMAT_RGB`, `TEXTURE_FORMAT_RGBA`, `TEXTURE_FORMAT_RGB_16BPP`, `TEXTURE_FORMAT_RGBA_16BPP`, `TEXTURE_FORMAT_LUMINANCE` i `TEXTURE_FORMAT_LUMINANCE_ALPHA`.
+
+Transkoder Basis Universal obsługuje wiele formatów wyjściowych, takich jak: `ASTC4x4`, `BCx`, `ETC2`, `ETC1` i `PVRTC1`.
+
+::: sidenote
+Specyficzne formaty wyjściowe sprzętu są obecnie wyłączone z powodu ostatniej aktualizacji naszego kodera Basis Universal.
+
+Obecnie analizujemy, jak ponownie wprowadzić obsługę tych formatów, a także dodatkową obsługę kompresji WEBP.
+Nasze obecne długotrwałe zadanie polegające na wprowadzeniu wtyczek do przetwarzania treści ma na celu rozwiązanie tego problemu.
+:::
+
+Obecnie obsługiwane są następujące formaty kompresji stratnej:
+
+PVRTC
+: [PowerVR Texture Compression](https://en.wikipedia.org/wiki/PVRTC) - tekstury są kompresowane w blokach. W trybie 4-bitowym (4BPP) każdy blok ma rozmiar 4x4 pikseli. W trybie 2-bitowym (2BPP) każdy blok ma rozmiar 8x4 pikseli. Każdy blok zawsze zajmuje 64 bity (8 bajtów) miejsca w pamięci. Format ten jest używany we wszystkich generacjach iPhone'a, iPoda Touch i iPada (niektóre urządzenia Androida, korzystające z układów graficznych PowerVR, również obsługują ten format). Defold obsługuje PVRTC1, oznaczane przyrostkiem "V1" w identyfikatorach formatów.
+
+ETC
+: [Ericsson Texture Compression](https://en.wikipedia.org/wiki/Ericsson_Texture_Compression) - bloki 4x4 pikseli są kompresowane do jednego słowa o rozmiarze 64 bitów. Blok 4x4 jest dzielony na pół, a każda połowa jest przypisana do podstawowego koloru. Następnie każdy piksel jest kodowany jako jedna z czterech wartości przesunięcia od koloru podstawowego swojej połowy. Android obsługuje ETC1 od wersji 2.2 (Froyo). Defold kompresuje tekstury ETC1.
+
+| Format                            | Kompresja   | Szczegóły  |
+| --------------------------------- | ----------- | -------------------------------- | ---- |
+| `TEXTURE_FORMAT_RGB`              | brak        | Kolor 3-kanałowy. Alfa jest usuwana. |
+| `TEXTURE_FORMAT_RGBA`             | brak        | Kolor 3-kanałowy i pełna alfa. |
+| `TEXTURE_FORMAT_RGB_16BPP`        | brak        | Kolor 3-kanałowy. 5+6+5 bitów. |
+| `TEXTURE_FORMAT_RGBA_16BPP`       | brak        | Kolor 3-kanałowy i pełna alfa. 4+4+4+4 bity. |
+| `TEXTURE_FORMAT_LUMINANCE`        | brak        | Skala szarości 1-kanałowa, brak alfy. Kanały RGB pomnożone przez siebie. Alfa jest usuwana. |
+| `TEXTURE_FORMAT_LUMINANCE_ALPHA`  | brak        | Skala szarości 1-kanałowa i pełna alfa. Kanały RGB pomnożone przez siebie. |
+| `TEXTURE_FORMAT_RGB_PVRTC2BPPV1`  | 1:16 stała  | Brak alfy. Wymagane obrazy kwadratowe. Obrazy niekwadratowe zostaną przeskalowane. |
+| `TEXTURE_FORMAT_RGB_PVRTC4BPPV1`  | 1:8 stała   | Brak alfy. Wymagane obrazy kwadratowe. Obrazy niekwadratowe zostaną przeskalowane. |
+| `TEXTURE_FORMAT_RGBA_PVRTC2BPPV1` | 1:16 stała  | Wstępnie pomnożona alfa. Wymagane obrazy kwadratowe. Obrazy niekwadratowe zostaną przeskalowane. |
+| `TEXTURE_FORMAT_RGBA_PVRTC4BPPV1` | 1:8 stała   | Wstępnie pomnożona alfa. Wymagane obrazy kwadratowe. Obrazy niekwadratowe zostaną przeskalowane. |
+| `TEXTURE_FORMAT_RGB_ETC1`         | 1:6 stała   | Brak alfy |
+
+
+## Typy kompresji
+
+Obsługiwane są następujące typy programowych kompresji obrazów. Dane są rozpakowywane, gdy plik tekstury jest ładowany do pamięci.
+
+::: sidenote
+Aktualnie kompresja `WEBP` zawsze przekierowuje do kompresji `BASIS_UASTC`.
+
+Obecnie analizujemy, jak ponownie wprowadzić obsługę obu tych formatów, a także dodatkową obsługę kompresji WEBP.
+Nasze obecne długotrwałe zadanie polegające na wprowadzeniu wtyczek do przetwarzania treści ma na celu rozwiązanie tego problemu.
+:::
+
+| Typ                               | Formaty                    | Szczegóły |
+| --------------------------------- | -------------------------- | --------- |
+| `COMPRESSION_TYPE_DEFAULT`        | Wszystkie formaty          | Ogólna kompresja danych bez utraty. Domyślna. |
+| `COMPRESSION_TYPE_BASIS_UASTC`    | Wszystkie formaty RGB/RGBA | Wysoka jakość kompresji Basis Universal, utrata jakości. Niższy poziom jakości prowadzi do mniejszego rozmiaru. |
+| `COMPRESSION_TYPE_WEBP`           | Wszystkie formaty          | Kompresja WEBP bez utraty. Wyższy poziom jakości prowadzi do mniejszego rozmiaru. |
+| `COMPRESSION_TYPE_WEBP_LOSSY`     | Wszystkie formaty niekompresowane sprzętowo. | Kompresja WEBP z utratą jakości. Niższy poziom jakości prowadzi do mniejszego rozmiaru. |
+
+Dla sprzętowo skompresowanych formatów tekstury PVRTC lub ETC, proces bezstratnej kompresji WebP przekształca dane sprzętowo skompresowanej tekstury na dane bardziej odpowiednie do kompresji obrazu WebP za pomocą wewnętrznego formatu pośredniego. Następnie jest on przekształcany z powrotem na sprzętowo skompresowany format tekstury podczas ładowania podczas czasu wykonywania programu. Aktualnie typ stratny WebP nie jest obsługiwany dla sprzętowo skompresowanych formatów tekstury PVRTC i ETC.
+
+## Przykładowy obraz
+
+Aby lepiej zrozumieć wyniki, oto przykład.
+Należy pamiętać, że jakość obrazu, czas kompresji i rozmiar kompresji zawsze zależą od obrazu wejściowego i mogą się różnić.
+
+Obraz oryginalny (1024x512):
+![Obraz oryginalny](images/texture_profiles/kodim03_pow2.png)
+
+### Czasy kompresji
+
+| Poziom     | Czas kompresji   | Czasy relatywny |
+| ----------------------------- | --------------- |
+| `FAST`     | 0m0.143s         | 0.5x            |
+| `NORMAL`   | 0m0.294s         | 1.0x            |
+| `HIGH`     | 0m1.764s         | 6.0x            |
+| `BEST`     | 0m1.109s         | 3.8x            |
+
+### Utrata sygnału
+
+Porównanie wykonuje się za pomocą narzędzia `basisu` (pomiar PSNR)
+100 dB oznacza brak utraty sygnału (jest to to samo co oryginalny obraz)
+
+| Poziom     | Sygnał                                          |
+| ------------------------------------------------------------ |
+| `FAST`     | Max:  34 Mean: 0.470 RMS: 1.088 PSNR: 47.399 dB |
+| `NORMAL`   | Max:  35 Mean: 0.439 RMS: 1.061 PSNR: 47.620 dB |
+| `HIGH`     | Max:  37 Mean: 0.898 RMS: 1.606 PSNR: 44.018 dB |
+| `BEST`     | Max:  51 Mean: 1.298 RMS: 2.478 PSNR: 40.249 dB |
+
+### Rozmiary plików skompresowanych
+
+Oryginalny rozmiar pliku wynosi 1572882 bajtów.
+
+| Poziom     | Rozmiar pliku | Procent  |
+| ------------------------------------- |
+| `FAST`     | 357225        | 22.71 %  |
+| `NORMAL`   | 365548        | 23.24 %  |
+| `HIGH`     | 277186        | 17.62 %  |
+| `BEST`     | 254380        | 16.17 %  |
+
+
+### Jakość obrazu
+
+Oto wynikowe obrazy (pobrane z kodowania ASTC przy użyciu narzędzia `basisu`)
+
+`FAST`
+![fast compression level](images/texture_profiles/kodim03_pow2.fast.png)
+
+`NORMAL`
+![normal compression level](images/texture_profiles/kodim03_pow2.normal.png)
+
+`HIGH`
+![high compression level](images/texture_profiles/kodim03_pow2.high.png)
+
+`BEST`
+![best compression level](images/texture_profiles/kodim03_pow2.best.png)
+
+

+ 100 - 0
docs/pl/manuals/tilesource.md

@@ -0,0 +1,100 @@
+---
+title: Źródła kafelków (tile source)
+brief: Ta instrukcja opisuje jak korzystać ze Źródła Kafelków.
+---
+
+# Źródła Kafelków (tile source)
+
+Źródła Kafelków - *Tile Source* może być używane przez komponent typu [Mapa kafelków - Tilemap](/manuals/tilemap), aby rysować kafelki na obszarze siatki lub może być używane jako źródło grafiki dla komponentu typu [Sprite](/manuals/sprite) lub Efektu cząsteczkowego - [Particle Effect](/manuals/particlefx).. Możesz również użyć Kształtów Kolizji - *Collision Shapes* ze Źródła Kafelków w Mapie Kafelków do [wykrywania kolizji i symulacji fizycznej](/manuals/physics) ([tutaj przykład](/examples/tilemap/collisions/))).
+
+## Tworzenie Źródła Kafelków
+
+Potrzebujesz obrazu zawierającego wszystkie kafelki. Każdy kafelek musi mieć dokładnie te same wymiary i być umieszczony w siatce. Defold obsługuje odstępy (_spacing_) między kafelkami oraz margines ( _margin_) wokół każdego kafelka.
+
+![Obraz dla Źródła Kafelków](images/tilemap/small_map.png){srcset="images/tilemap/[email protected] 2x"}
+
+Gdy już masz utworzony obraz źródłowy, możesz stworzyć Źródło Kafelków (Tile Source):
+
+- Zaimportuj obraz do projektu, przeciągając go do lokalizacji projektu w panelu *Assets*.
+- Utwórz nowy plik Źródła Kafelków (<kbd>klikając prawym przyciskiem myszy</kbd> lokalizację w panelu *Assets*, a następnie wybierając <kbd>New... ▸ Tile Source</kbd>).
+- Nazwij nowy plik.
+- Plik zostanie teraz otwarty w edytorze Źródło Kafelków.
+- Kliknij przycisk przeglądania obok właściwości *Image* (Obraz) i wybierz swój obraz. Teraz powinieneś widzieć obraz wyświetlony w edytorze.
+- Dostosuj Properties* (Właściwości) do obrazu źródłowego. Gdy wszystko jest poprawnie, kafelki będą idealnie do siebie pasować.
+
+![Tworzenie Źródła Kafelków](images/tilemap/tilesource.png){srcset="images/tilemap/[email protected] 2x"}
+
+Size
+: Rozmiar obrazu źródłowego.
+
+Tile Width
+: Szerokość każdego kafelka.
+
+Tile Height
+: Wysokość każdego kafelka.
+
+Tile Margin
+: Liczba pikseli otaczająca każdy kafelek (pomarańczowy kolor na obrazku powyżej).
+
+Tile Spacing
+: Liczba pikseli między każdym kafelkiem (niebieski kolor na obrazku powyżej).
+
+Inner Padding
+: Wewnętrzny margines - określa, ile pustych pikseli ma być automatycznie dodawane dookoła kafelka podczas działania gry.
+
+Extrude Border
+: Obramowanie ekstrudera - określa, ile razy krawędzie pikseli mają być automatycznie powielane wokół kafelka podczas działania gry.
+
+Collision
+: Określa obraz do automatycznego generowania kształtów kolizji dla kafelków.
+
+## Animacje poklatkowe (flip-book) Źródła Kafelków
+
+Aby zdefiniować animację poklatkową w Źródle Kafelków, kafelki animacji klatek muszą leżeć obok siebie w sekwencji od lewej do prawej. Sekwencja może zawijać się z jednego wiersza na kolejny. Wszystkie nowo utworzone Źródła Kafelków mają domyślną animację o nazwie "anim". Możesz dodać nowe animacje, <kbd>klikając prawym przyciskiem myszy</kbd> na korzeń (root) Źródła Kafelków w *Outline* i wybierając <kbd>Add ▸ Animation</kbd>.
+
+Wybierając animację, wyświetlane są *Properties* (Właściwości) animacji.
+
+![Animacje Źródła Kafelków](images/tilemap/animation.png){srcset="images/tilemap/[email protected] 2x"}
+
+Id
+: Identyfikator animacji. Nazwa musi być unikalna w Źródle Kafelków.
+
+Start Tile
+: Pierwszy kafelek animacji. Numeracja zaczyna się od 1 w lewym górnym rogu i idzie w prawo, wiersz po wierszu, w dół do prawego dolnego rogu.
+
+End Tile
+: Ostatni kafelek animacji.
+
+Playback
+: Określa, w jaki sposób ma być odtwarzana animacja:
+
+  - `None` - w ogóle nie jest odtwarzany, wyświetlany jest pierwszy obraz.
+  - `Once Forward` - odtwarza animację raz od pierwszego do ostatniego obrazu.
+  - `Once Backward` - odtwarza animację raz od ostatniego do pierwszego obrazu.
+  - `Once Ping Pong` - odtwarza animację raz od pierwszego do ostatniego obrazu, a następnie z powrotem do pierwszego obrazu.
+  - `Loop Forward` - odtwarza animację powtarzalnie (w pętli) od pierwszego do ostatniego obrazu.
+  - `Loop Backward` - odtwarza animację powtarzalnie (w pętli) od ostatniego do pierwszego obrazu.
+  - `Loop Ping Pong` - odtwarza animację powtarzalnie (w pętli) od pierwszego do ostatniego obrazu, a następnie z powrotem do pierwszego obrazu.
+
+Fps
+: Prędkość odtwarzania animacji, wyrażona w klatkach na sekundę (Frames per second - FPS).
+
+Flip horizontal
+: Odbija animację poziomo.
+
+Flip vertical
+: Odbija animację pionowo.
+
+## Kształty kolizji źródła kafelków
+
+Defold używa obrazu określonego w właściwości *Collision* (Kolizja), aby generować kształt wypukły (_convex_) dla każdego kafelka. Kształt będą wyznaczać piksele kafelka, które zawierają informacje o kolorze, czyli nie są w 100% przezroczyste.
+
+Często sensowne jest używanie tego samego obrazu do kolizji, co do obrazu zawierającego grafikę, ale możesz wybrać oddzielny obraz, jeśli chcesz kształty kolizji różniące się od wyglądu. Gdy określisz obraz kolizji, podgląd zostaje zaktualizowany z zarysem na każdym kafelku, co wskazuje na wygenerowane kształty kolizji.
+
+W zarysie źródła kafelków są wymieniane grupy kolizji, które dodano do źródła kafelków. Nowe pliki źródła kafelków otrzymają dodaną jedną grupę kolizji "default" ("domyślna"). Możesz dodać nowe grupy, <kbd>klikając prawym przyciskiem myszy</kbd> na korzeń (root) Źródła Kafelków w *Outline* i wybierając <kbd>Add ▸ Collision Group</kbd>.
+
+Aby wybrać kształty kafelków, które powinny należeć do określonej grupy, wybierz grupę w *Outline*, a następnie kliknij każdy kafelek, który chcesz przypisać do wybranej grupy. Kształt kafelka i kształt są wtedy zaznaczane kolorem grupy. Kolor jest automatycznie przypisywany do grupy w Edytorze.
+
+![Kształty kolizji](images/tilemap/collision.png){srcset="images/tilemap/[email protected] 2x"}
+
+Aby usunąć kafelek z grupy kolizji, wybierz element główny (root) Źródła Kafelków w *Outline*, a następnie kliknij kafelek odznaczając tym samym dotychczas wybraną grupę.