Explorar el Código

Merge branch 'master' of https://github.com/defold/doc

Björn Ritzl hace 4 años
padre
commit
a44dc49b4a
Se han modificado 100 ficheros con 1167 adiciones y 52 borrados
  1. 8 8
      docs/ru/manuals/addressing.md
  2. 13 0
      docs/ru/manuals/animation.md
  3. 6 6
      docs/ru/manuals/application-lifecycle.md
  4. 3 3
      docs/ru/manuals/building-blocks.md
  5. 143 0
      docs/ru/manuals/camera.md
  6. 150 0
      docs/ru/manuals/collection-factory.md
  7. 192 0
      docs/ru/manuals/collection-proxy.md
  8. 97 0
      docs/ru/manuals/components.md
  9. 8 8
      docs/ru/manuals/editor.md
  10. 249 0
      docs/ru/manuals/factory.md
  11. 107 0
      docs/ru/manuals/flipbook-animation.md
  12. 164 0
      docs/ru/manuals/font.md
  13. 27 27
      docs/ru/manuals/glossary.md
  14. BIN
      docs/ru/manuals/images/animation/animsheet.png
  15. BIN
      docs/ru/manuals/images/animation/blender_animation.png
  16. BIN
      docs/ru/manuals/images/animation/[email protected]
  17. BIN
      docs/ru/manuals/images/animation/bounce.gif
  18. BIN
      docs/ru/manuals/images/animation/custom_curve.png
  19. BIN
      docs/ru/manuals/images/animation/frog_runloop.gif
  20. BIN
      docs/ru/manuals/images/animation/model_hierarchy.png
  21. BIN
      docs/ru/manuals/images/animation/property_animation.png
  22. BIN
      docs/ru/manuals/images/animation/[email protected]
  23. BIN
      docs/ru/manuals/images/animation/runloop.gif
  24. BIN
      docs/ru/manuals/images/animation/spine_animation.png
  25. BIN
      docs/ru/manuals/images/animation/spine_bones.png
  26. BIN
      docs/ru/manuals/images/animation/[email protected]
  27. BIN
      docs/ru/manuals/images/animation/spine_events.png
  28. BIN
      docs/ru/manuals/images/animation/spine_ingame.png
  29. BIN
      docs/ru/manuals/images/animation/[email protected]
  30. BIN
      docs/ru/manuals/images/animation/square_curve.png
  31. BIN
      docs/ru/manuals/images/animation/suzanne.gif
  32. BIN
      docs/ru/manuals/images/animation/wiggle.gif
  33. BIN
      docs/ru/manuals/images/camera/create.png
  34. BIN
      docs/ru/manuals/images/camera/[email protected]
  35. BIN
      docs/ru/manuals/images/camera/follow.png
  36. BIN
      docs/ru/manuals/images/camera/projections.png
  37. BIN
      docs/ru/manuals/images/camera/[email protected]
  38. BIN
      docs/ru/manuals/images/camera/settings.png
  39. BIN
      docs/ru/manuals/images/camera/[email protected]
  40. BIN
      docs/ru/manuals/images/collection-proxy/bootstrap.png
  41. BIN
      docs/ru/manuals/images/collection-proxy/[email protected]
  42. BIN
      docs/ru/manuals/images/collection-proxy/collection_id.png
  43. BIN
      docs/ru/manuals/images/collection-proxy/[email protected]
  44. BIN
      docs/ru/manuals/images/collection-proxy/create_proxy.png
  45. BIN
      docs/ru/manuals/images/collection-proxy/[email protected]
  46. BIN
      docs/ru/manuals/images/collection-proxy/message_passing.png
  47. BIN
      docs/ru/manuals/images/collection-proxy/[email protected]
  48. BIN
      docs/ru/manuals/images/collection-proxy/proxy_load.png
  49. BIN
      docs/ru/manuals/images/collection-proxy/[email protected]
  50. BIN
      docs/ru/manuals/images/collection_factory/collection.png
  51. BIN
      docs/ru/manuals/images/collection_factory/collection_factory_collection.png
  52. BIN
      docs/ru/manuals/images/collection_factory/collection_factory_factory.png
  53. BIN
      docs/ru/manuals/images/collection_factory/collection_factory_game.png
  54. BIN
      docs/ru/manuals/images/collection_factory/factory.png
  55. BIN
      docs/ru/manuals/images/collection_factory/load_dynamically.png
  56. BIN
      docs/ru/manuals/images/factory/factory_collection.png
  57. BIN
      docs/ru/manuals/images/factory/factory_component.png
  58. BIN
      docs/ru/manuals/images/factory/factory_max_instances.png
  59. BIN
      docs/ru/manuals/images/factory/factory_spawned.png
  60. BIN
      docs/ru/manuals/images/factory/factory_spawned2.png
  61. BIN
      docs/ru/manuals/images/factory/factory_uniform_scaling.png
  62. BIN
      docs/ru/manuals/images/factory/load_dynamically.png
  63. BIN
      docs/ru/manuals/images/font/bm_font.png
  64. BIN
      docs/ru/manuals/images/font/[email protected]
  65. BIN
      docs/ru/manuals/images/font/df_artifacts.png
  66. BIN
      docs/ru/manuals/images/font/[email protected]
  67. BIN
      docs/ru/manuals/images/font/df_font.png
  68. BIN
      docs/ru/manuals/images/font/[email protected]
  69. BIN
      docs/ru/manuals/images/font/new_font.png
  70. BIN
      docs/ru/manuals/images/font/[email protected]
  71. BIN
      docs/ru/manuals/images/font/new_font_name.png
  72. BIN
      docs/ru/manuals/images/font/[email protected]
  73. BIN
      docs/ru/manuals/images/font/scale_down.png
  74. BIN
      docs/ru/manuals/images/font/[email protected]
  75. BIN
      docs/ru/manuals/images/font/scale_up.png
  76. BIN
      docs/ru/manuals/images/font/[email protected]
  77. BIN
      docs/ru/manuals/images/label/add_label.png
  78. BIN
      docs/ru/manuals/images/label/[email protected]
  79. BIN
      docs/ru/manuals/images/label/align.png
  80. BIN
      docs/ru/manuals/images/label/[email protected]
  81. BIN
      docs/ru/manuals/images/label/font_material.png
  82. BIN
      docs/ru/manuals/images/label/[email protected]
  83. BIN
      docs/ru/manuals/images/label/label.png
  84. BIN
      docs/ru/manuals/images/label/[email protected]
  85. BIN
      docs/ru/manuals/images/mesh/mesh.png
  86. BIN
      docs/ru/manuals/images/mesh/[email protected]
  87. BIN
      docs/ru/manuals/images/particlefx/acceleration.png
  88. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  89. BIN
      docs/ru/manuals/images/particlefx/add_modifier.png
  90. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  91. BIN
      docs/ru/manuals/images/particlefx/add_modifier_select.png
  92. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  93. BIN
      docs/ru/manuals/images/particlefx/curve_editor.png
  94. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  95. BIN
      docs/ru/manuals/images/particlefx/default.png
  96. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  97. BIN
      docs/ru/manuals/images/particlefx/drag.png
  98. BIN
      docs/ru/manuals/images/particlefx/[email protected]
  99. BIN
      docs/ru/manuals/images/particlefx/editor.png
  100. BIN
      docs/ru/manuals/images/particlefx/[email protected]

+ 8 - 8
docs/ru/manuals/addressing.md

@@ -39,13 +39,13 @@ end
 
 ![bean](images/addressing/bean.png)
 
-Идентификаторы в структуре произвольны. В данном примере для игрового объекта был выбран идентификатор - "bean", для компонента Sprite - "body", а для скрипта, управляющего персонажем - "controller".
+Идентификаторы в структуре произвольны. В данном примере для игрового объекта был выбран идентификатор --- "bean", для компонента Sprite --- "body", а для скрипта, управляющего персонажем --- "controller".
 
 ::: sidenote
 В случае, если имя не выбрано, это сделает редактор. При создании нового игрового объекта или компонента в редакторе уникальное свойство *Id* устанавливается автоматически.
 
-- Игровые объекты автоматически получают идентификатор "go" с добавлением нумерации ("go2", "go3" и т. д.).
-- Компоненты получают идентификатор в соответствии с типом этого компонента ("sprite", "sprite2" и т. д.).
+- Игровые объекты автоматически получают идентификатор "go" с добавлением нумерации ("go2", "go3" и т.д.).
+- Компоненты получают идентификатор в соответствии с типом этого компонента ("sprite", "sprite2" и т.д.).
 
 При желании можно придерживаться этих автоматически назначаемых имен, но рекомендуется изменять идентификаторы на читабельные и описательные имена.
 :::
@@ -64,7 +64,7 @@ end
 ![bean](images/addressing/name_collision.png)
 :::
 
-Теперь посмотрим, что произойдет, если добавить еще игровых объектов. Предположим, необходимо объединить двух "bean" в небольшую команду. Один из игровых объектов назовем "bean", а другой - "buddy". Кроме того, когда "bean" некоторое время простаивает, он должен сказать: "buddy", танцуй. Это делается посредством отправки пользовательского сообщения "dance" из скрипта "controller" объекта "bean" в скрипт "controller" объекта "buddy":
+Теперь посмотрим, что произойдет, если добавить еще игровых объектов. Предположим, необходимо объединить двух "bean" в небольшую команду. Один из игровых объектов назовем "bean", а другой --- "buddy". Кроме того, когда "bean" некоторое время простаивает, он должен сказать: "buddy", танцуй. Это делается посредством отправки пользовательского сообщения "dance" из скрипта "controller" объекта "bean" в скрипт "controller" объекта "buddy":
 
 ![bean](images/addressing/bean_buddy.png)
 
@@ -147,7 +147,7 @@ Defold предлагает два полезных сокращения, кот
 
 Любой адрес, начинающийся с символа '/' будет вычисляться исходя из корня игрового мира, что соответствует корню *коллекции начальной загрузки*, которая загружается при старте игры.
 
-Абсолютный адрес скрипта менеджера - `"/manager#controller"` и этот абсолютный адрес будет актуальным для компонента вне зависимости от того, где он используется.
+Абсолютный адрес скрипта менеджера --- `"/manager#controller"` и этот абсолютный адрес будет актуальным для компонента вне зависимости от того, где он используется.
 
 ![teams and manager](images/addressing/teams_manager.png)
 
@@ -167,7 +167,7 @@ local spawned_id = factory.create("#some_factory")
 print(spawned_id) --> hash: [/instance42]
 ```
 
-Такой идентификатор можно использовать взамен строкового идентификатора, или сформировать его самостоятельно. При этом следует иметь в виду, что хэшированный идентификатор соответствует пути к объекту, т.е. абсолютному адресу:
+Такой идентификатор можно использовать взамен строкового идентификатора, или сформировать его самостоятельно. При этом следует иметь в виду, что хэшированный идентификатор соответствует пути к объекту, то есть абсолютному адресу:
 
 ::: sidenote
 Причина, по которой относительные адреса должны быть указаны в виде строк, заключается в том, что движок вычисляет новый хэш идентификатора, основанный на хэш-состоянии текущего контекста именования (коллекции) с добавлением в хэш данной строки.
@@ -190,7 +190,7 @@ go.set_position(pos, relative_id)
 
 Для полноты картины, давайте посмотрим на полный формат адресов Defold: URL.
 
-URL - это объект, записанный, как правило, в виде строк специального формата. Типовой URL состоит из трех частей:
+URL --- это объект, записанный, как правило, в виде строк специального формата. Типовой URL состоит из трех частей:
 
 `[socket:][path][#fragment]`
 
@@ -243,4 +243,4 @@ my_url.fragment = "controller" -- specify as string or hash
 
 -- Отправить сообщение целевому объекту, указанному в URL
 msg.post(my_url, "hello_manager!")
-```
+```

+ 13 - 0
docs/ru/manuals/animation.md

@@ -0,0 +1,13 @@
+---
+title: Руководство по анимации в Defold
+brief: Данное руководство описывает работу с анимацией в движке Defold
+---
+
+# Анимация
+
+В Defold есть встроенная поддержка нескольких типов анимации, которые можно использовать в качестве источника графики для компонентов:
+
+* [Мультипликация](/manuals/flipbook-animation) --- Последовательное воспроизведение серии статичных изображений
+* [Скелетная анимация](/manuals/spine) --- Проигрывание скелетных 2D-анимаций
+* [Анимация моделей](/manuals/model-animation) --- Проигрывание анимации 3D-моделей
+* [Анимация свойств](/manuals/property-animation) --- Анимация свойств объекта, таких как положение, масштаб, углы поворота и многих других

+ 6 - 6
docs/ru/manuals/application-lifecycle.md

@@ -23,7 +23,7 @@ brief: В этом руководстве подробно описываетс
 
 ![Lifecycle overview](images/application_lifecycle/application_lifecycle_init.png)
 
-На самом деле движок выполняет гораздо больше шагов во время инициализации перед загрузкой основной коллекции. Происходит настройка профилировщика памяти, сокетов, графики, HID (устройств ввода), звука, физики и т. д. Кроме того, загружается и настраивается конфигурация приложения ("game.project").
+На самом деле движок выполняет гораздо больше шагов во время инициализации перед загрузкой основной коллекции. Происходит настройка профилировщика памяти, сокетов, графики, HID (устройств ввода), звука, физики и т.д. Кроме того, загружается и настраивается конфигурация приложения ("game.project").
 
 Первой подконтрольной пользователю точкой входа в конце инициализации движка является вызов функции `init()` актуального рендер-скрипта.
 
@@ -35,7 +35,7 @@ brief: В этом руководстве подробно описываетс
 
 Поскольку код функции `init()` может посылать новые сообщения, приказывать фабрикам порождать новые объекты, отмечать объекты для удаления и совершать другие действия, движок осуществляет очередной полный проход "постобновления". Этот проход выполняет доставку сообщений, фактическое порождение игровых объектов фабриками и удаление объектов. Следует иметь в виду, что проход постобновления включает последовательность "диспетчеризации сообщений", которая не только отправляет все поставленные в очередь сообщения, но и обрабатывает сообщения, отправленные прокси коллекциям. Любые последующие обновления прокси (включение и отключение, загрузка и пометка для выгрузки) выполняются во время этих шагов.
 
-Изучение приведенной выше диаграммы показывает, что вполне возможно загрузить [прокси-коллекцию](/manuals/collection-proxy) во время `init()`, обеспечить инициализацию всех содержащихся в ней объектов, а затем выгрузить коллекцию через прокси --- и все это до вызова `update()` первого компонента, т.е. до того, как движок выйдет из стадии инициализации и войдет в цикл обновления:
+Изучение приведенной выше диаграммы показывает, что вполне возможно загрузить [прокси-коллекцию](/manuals/collection-proxy) во время `init()`, обеспечить инициализацию всех содержащихся в ней объектов, а затем выгрузить коллекцию через прокси --- и все это до вызова `update()` первого компонента, то есть до того, как движок выйдет из стадии инициализации и войдет в цикл обновления:
 
 ```lua
 function init(self)
@@ -88,7 +88,7 @@ end
 
 ## Рендер обновление
 
-Рендер обновление блокирует диспетчеризацию сообщений в сокет `@render` (сообщение камеры `set_view_projection`, сообщение `set_clear_color` и др.). Тажк вызывается `update()` в рендер-скрипте.
+Рендер обновление блокирует диспетчеризацию сообщений в сокет `@render` (сообщение камеры `set_view_projection`, сообщение `set_clear_color` и др.). Также вызывается `update()` в рендер-скрипте.
 
 ## Постобновление
 
@@ -96,7 +96,7 @@ end
 
 Далее любой компонент Factory, которому было указано породить игровой объект, выполнит это. Наконец, игровые объекты, помеченные для удаления, действительно удаляются.
 
-Последний шаг в цикле обновления включает отправку `@system`-сообщений (сообщения `exit`, `reboot`, переключение профайлера, запуск и остановка захвата видео и т. д.). Затем происходит рендеринг графики. Во время рендеринга графики производится захват видео, а также визуальный профайлер (см. [документацию по отладке](/manuals/debugging).)
+Последний шаг в цикле обновления включает отправку `@system`-сообщений (сообщения `exit`, `reboot`, переключение профайлера, запуск и остановка захвата видео и т.д.). Затем происходит рендеринг графики. Во время рендеринга графики производится захват видео, а также визуальный профайлер (см. [документацию по отладке](/manuals/debugging).)
 
 ## Частота кадров и временной шаг коллекции
 
@@ -114,6 +114,6 @@ end
 
 Сначала вызываются компонентные функции `final()`. Затем следует очередная диспетчеризация сообщений. Наконец, все игровые объекты удаляются, а основная коллекция выгружается.
 
-После этого движок выполняет закулисное отключение подсистем: конфигурация проекта удаляется, профилировщик памяти отключается и т. д.
+После этого движок выполняет закулисное отключение подсистем: конфигурация проекта удаляется, профилировщик памяти отключается и т.д.
 
-Теперь приложение считается полностью закрытым.
+Теперь приложение считается полностью закрытым.

+ 3 - 3
docs/ru/manuals/building-blocks.md

@@ -15,7 +15,7 @@ brief: В этом руководстве подробно описан прин
 : Коллекция представляет собой файл, используемый для структурирования игры. В коллекциях выстраиваются иерархии игровых объектов и других коллекций. Как правило, они используются для структурирования игровых уровней, групп врагов или персонажей, сформированных из нескольких игровых объектов.
 
 Игровой объект (game object)
-: Игровой объект - это контейнер с идентификатором, положением, вращением и масштабом. Он используется в качестве контейнера с компонентами. Обычно они используются для создания игровых персонажей, пуль, системы правил игры или для загрузки/выгрузки уровней.
+: Игровой объект --- это контейнер с идентификатором, положением, вращением и масштабом. Он используется в качестве контейнера с компонентами. Обычно они используются для создания игровых персонажей, пуль, системы правил игры или для загрузки/выгрузки уровней.
 
 Компонент (сomponent)
 : Компонентами являются сущности, которые помещаются в игровой объект, с целью придать им визуальное, звуковое и/или логическое представление в игре. Обычно используются для создания спрайтов персонажей, файлов сценариев, для добавления звуковых эффектов или эффектов частиц.
@@ -48,7 +48,7 @@ local pos = go.get_position("bean/bean")
 
 ## Игровые объекты (Game objects)
 
-Игровые объекты - это простые объекты, каждый из которых имеет свою продолжительность жизни во время выполнения игры. Игровые объекты имеют позицию, вращение и масштаб, которыми можно манипулировать и анимировать во время выполнения.
+Игровые объекты --- это простые объекты, каждый из которых имеет свою продолжительность жизни во время выполнения игры. Игровые объекты имеют позицию, вращение и масштаб, которыми можно манипулировать и анимировать во время выполнения.
 
 ```lua
 -- animate X position of "can" game object
@@ -94,7 +94,7 @@ go.animate("can", "position.x", go.PLAYBACK_LOOP_PINGPONG, 100, go.EASING_LINEAR
 
 ![Childing game objects](images/building_blocks/childing.png){srcset="images/building_blocks/[email protected] 2x"}
 
-Объектная иерархия "родительский-дочерний" - это динамическое отношение, влияющее на то, как объекты реагируют на трансформации. Любые трансформации (перемещение, вращение или масштабирование), применяемые к объекту, будут, в свою очередь, применяться к дочерним элементам объекта, как в редакторе, так и во время выполнения:
+Объектная иерархия "родительский-дочерний" --- это динамическое отношение, влияющее на то, как объекты реагируют на трансформации. Любые трансформации (перемещение, вращение или масштабирование), применяемые к объекту, будут, в свою очередь, применяться к дочерним элементам объекта, как в редакторе, так и во время выполнения:
 
 ![Child transform](images/building_blocks/child_transform.png){srcset="images/building_blocks/[email protected] 2x"}
 

+ 143 - 0
docs/ru/manuals/camera.md

@@ -0,0 +1,143 @@
+---
+title: Компонент Camera
+brief: В данном руководстве описаны функциональные возможности компонента Camera в Defold.
+---
+
+# Компонент Camera
+
+В Defold камера --- это компонент, который изменяет область обзора и проекцию игрового мира. Компонент Camera лишь поверхностно определяет перспективную или ортографическую камеры, которая предоставляет рендер-скрипту матрицу вида и проекции. Перспективная камера обычно используется для 3D-игр, ортографическая камера --- для 2D. Если требуются расширенные возможности, такие как преследование, зумирование, дрожание и т.д., придётся реализовать их самостоятельно (см. раздел ниже [сторонние решения для камер](https://www.defold.com/manuals/camera/#third-party-camera-solutions)).
+
+## Создание камеры
+
+Чтобы создать камеру, <kbd>кликните ПКМ</kbd> на игровом объекте и выберите <kbd>Add Component ▸ Camera</kbd>. Можно также создать файл компонента в иерархии проекта и добавить этот файл к игровому объекту.
+
+![create camera component](images/camera/create.png){srcset="images/camera/[email protected] 2x"}
+
+Компонент Camera имеет следующие свойства, определяющие усечённую пирамиду видимости, или *фрустум* (только для перспективной камеры):
+
+![camera settings](images/camera/settings.png){srcset="images/camera/[email protected] 2x"}
+
+Id
+: Идентификатор компонента
+
+Aspect Ratio
+: (**Только для перспективной камеры**) --- Соотношение между шириной и высотой фрустума. 1.0 предполагает квадратичное представление. 1,33 подходит для формата 4:3, например, 1024x768. 1.78 подходит для формата 16:9. Данное свойство игнорируется, если отмечена опция *Auto Aspect Ratio*.
+
+Fov
+: (**Только для перспективной камеры**) --- Поле зрения камеры по *вертикали*, выраженное в _радианах_. Чем шире поле зрения, тем больше камера видит. Обратите внимание, что текущее значение по умолчанию (45) вводит в заблуждение. Для поля зрения в 45 градусов измените значение на 0.785 (`π / 4`).
+
+Near Z
+: (**Только для перспективной камеры**) --- Z-значение ближней плоскости отсечения.
+
+Far Z
+: (**Только для перспективной камеры**) --- Z-значение дельней плоскости отсечения.
+
+Auto Aspect Ratio
+: (**Только для перспективной камеры**) --- Если опция отмечена, камера будет вычислять соотношение сторон автоматически.
+
+## Использование камеры
+
+Чтобы активировать камеру и передать ее матрицы вида и проекции в рендер-скрипт, компоненту посылается сообщение acquire_camera_focus:
+
+```lua
+msg.post("#camera", "acquire_camera_focus")
+```
+
+В каждом кадре компонент Camera, который в данный момент имеет фокус, будет посылать сообщение `"set_view_projection"` в сокет "@render", то есть оно будет поступать в рендер-скрипт:
+
+```lua
+-- builtins/render/default.render_script
+--
+function on_message(self, message_id, message)
+    if message_id == hash("set_view_projection") then
+        self.view = message.view                    -- [1]
+        self.projection = message.projection
+    end
+end
+```
+1. Сообщение, переданное от компонента камеры, включает матрицу вида и матрицу проекции.
+
+### Панорамирование камеры
+
+Панорамирование/перемещение камеры по игровому миру осуществляется путем перемещения игрового объекта, к которому присоединен компонент камеры. Компонент Camera автоматически отправляет обновленную матрицу вида согласно текущему положению камеры по осям X и Y.
+
+### Зумирование камеры
+
+Увеличение и уменьшение масштаба при использовании перспективной камеры осуществляется путем перемещения игрового объекта, к которому прикреплена камера, вдоль оси Z. Компонент камеры автоматически отправляет обновленную матрицу вида согласно текущему положению камеры по оси Z.
+
+Увеличивать и уменьшать масштаб при использовании ортографической камеры можно, только если тип проекции установлен в `Fixed`, при этом масштаб изменяется путем отправки рендер-скрипту сообщения с требуемым уровнем масштабирования:
+
+```Lua
+msg.post("@render:", "use_fixed_projection", { zoom = 2, near = -1, far = 1 })
+```
+
+### Следование за игровым объектом
+
+Можно заставить камеру следовать за игровым объектом. Для этого достаточно создать игровой объект с прикрепленным к нему компонентом Camera и разместить его в качестве дочернего по отношению к тому объекту, за которым необходимо следовать:
+
+![follow game object](images/camera/follow.png)
+
+Альтернативный способ заключается в обновлении положения игрового объекта, к которому прикреплен компонент Camera, каждый кадр по мере перемещения игрового объекта, за которым нужно следить.
+
+### Преобразование экранных координат в мировые
+
+При панорамировании, масштабировании или изменении проекции камеры с ортографической проекцией типа Stretch по умолчанию координаты мыши, предоставленные в функции жизненного цикла on_input(), больше не будут соответствовать мировым координатам игровых объектов. Необходимо вручную учесть изменение вида или проекции. Преобразование координат мыши/экрана в мировые координаты из стандартного рендер-скрипта выполняется следующим образом:
+
+::: sidenote
+[Сторонние решения для камер, упомянутые в данном руководстве](/manuals/camera/#third-party-camera-solutions) предоставляют функции для преобразования в экранные координаты и обратно.
+:::
+
+```Lua
+-- builtins/render/default.render_script
+--
+local function screen_to_world(x, y, z)
+	local inv = vmath.inv(self.projection * self.view)
+	x = (2 * x / render.get_width()) - 1
+	y = (2 * y / render.get_height()) - 1
+	z = (2 * z) - 1
+	local x1 = x * inv.m00 + y * inv.m01 + z * inv.m02 + inv.m03
+	local y1 = x * inv.m10 + y * inv.m11 + z * inv.m12 + inv.m13
+	local z1 = x * inv.m20 + y * inv.m21 + z * inv.m22 + inv.m23
+	return x1, y1, z1
+end
+```
+
+## Проекции
+
+Компонент Camera передаёт рендер-скрипту перспективную проекцию. Это хорошо подходит для 3D-игр. Для 2D-игр зачастую требуется рендерить сцену с *ортографической проекцией*. Это означает, что вид камеры определяется не фрустумом, а фреймом. Ортографическая проекция нереалистична, поскольку она не искажает размер объектов в зависимости от расстояния до них. Объект, находящийся на расстоянии в 1000 единиц, будет отображаться в том же размере, что и объект прямо перед камерой.
+
+![projections](images/camera/projections.png){srcset="images/camera/[email protected] 2x"}
+
+### Ортографическая проекция (2D)
+Для использования ортографической проекции матрица проекции, передаваемая компонентом Camera, игнорируется, и вместо этого она создается самостоятельно в рендер-скрипте. Рендер-скрипт по умолчанию поддерживает три ортографические проекции: `Stretch`, `Fixed` и `Fixed Fit`. Чтобы выбрать, какую из них использовать, достаточно послать сообщение в рендер-скрипт:
+
+```lua
+msg.post("@render:", "use_fixed_fit_projection", { near = -1, far = 1 })
+```
+
+::: important
+Следует отметить, что ближняя и дальняя плоскости также указываются в сообщении. Ближняя и дальняя плоскости, заданные в свойствах камеры, используются только для перспективной проекции.
+:::
+
+::: important
+При ортографической проекции представление будет расположено так, что левый нижний угол отрендеренной части экрана будет соответствовать положению игрового объекта, к которому прикреплен компонент Camera.
+:::
+
+Подробнее о рендер-скрипте и о том, как изменить тип используемой ортографической проекции, можно узнать в [руководстве по рендерингу](/manuals/render/#default-view-projection).
+
+### Перспективная проекция (3D)
+Чтобы использовать перспективную проекцию, необходимо использовать как вид, так и проекцию, предоставляемые камерой. Рендер-скрипт должен использовать проекцию, исходящую от камеры, отправленную ему в сообщении:
+
+```lua
+msg.post("@render:", "use_camera_projection")
+```
+
+За подробностями о рендер-скрипте обращайтесь к [руководстве по рендерингу](/manuals/render/#perspective-projection).
+
+
+## Сторонние решения для камер
+
+Существует несколько библиотечных решений, реализующих общие функции камеры, такие как следование за игровым объектом, преобразование координат экрана в мировые и так далее. Они доступны на портале ассетов сообщества Defold:
+
+- [Rendercam](https://defold.com/assets/rendercam/) (2D & 3D), автор Ross Grams.
+- [Ortographic camera](https://defold.com/assets/orthographic/) (2D only), автор Björn Ritzl.

+ 150 - 0
docs/ru/manuals/collection-factory.md

@@ -0,0 +1,150 @@
+---
+title: Компонент Collection Factory
+brief: Это руководство объясняет особенности использования компонентов Collection Factory, предназначенных для порождения иерархий игровых объектов.
+---
+
+# Компонент Collection Factory
+
+Компонент Collection Factory используется для порождения групп и иерархий игровых объектов, хранящихся в файлах коллекций, в запущенной игре.
+
+В Defold коллекции обеспечивают эффективный способ создания многократно используемых шаблонов, или "префабов". Обзор коллекций см. в [документации по структурным элементам](/manuals/building-blocks#collections). Коллекции можно создавать в редакторе или вставлять в игру динамически.
+
+С помощью фабрик коллекций можно порождать содержимое файла коллекции в игровой мир. Это аналогично выполнению порождения фабрикой всех игровых объектов внутри коллекции с последующим построением иерархии "родительский-дочерний" между объектами. Типичным примером является порождение врагов, состоящих из нескольких игровых объектов (например, враг + оружие).
+
+## Порождение коллекции
+
+Предположим, нам нужен игровой объект персонаж и отдельный игровой объект щит, дочерний по отношению к персонажу. Мы построим иерархию игровых объектов в файле коллекции и сохраним его под именем "bean.collection".
+
+::: sidenote
+Компонент *collection proxy* используется для создания нового игрового мира, включая отдельный физический мир, на основе коллекции. Доступ к новому миру осуществляется через новый сокет. Все ассеты, содержащиеся в коллекции, загружаются через прокси, когда вы сообщаете прокси о начале загрузки. Это делает их очень полезными, например, для изменения уровней в игре. Однако новые игровые миры сопровождаются довольно большими накладными расходами, поэтому не стоит использовать их для динамической загрузки мелкого контента. За подробностями обращайтесь к [документации по прокси-коллекциям](/manuals/collection-proxy).
+:::
+
+![Collection to spawn](images/collection_factory/collection.png)
+
+Затем добавляется *Collection factory* к игровому объекту, который будет осуществлять порождение, и устанавливается "bean.collection" в качестве *прототипа* компонента:
+
+![Collection factory](images/collection_factory/factory.png)
+
+Теперь порождение объектов "bean" и "shield" --- это просто вызов функции `collectionfactory.create()`:
+
+```lua
+local bean_ids = collectionfactory.create("#bean_factory")
+```
+
+Функция принимает 5 параметров:
+
+`url`
+: Идентификатор фабрики коллекций, которая должна породить новый набор игровых объектов.
+
+`[position]`
+: (Опционально) Мировая позиция порожденных игровых объектов. Это должен быть `vector3`. Если не указать позицию, объекты будут порождены в позиции фабрики.
+
+`[rotation]`
+: (Опционально) Мировое вращение новых игровых объектов. Это должен быть `quat`.
+
+`[properties]`
+: (Опционально) Lua-таблица с парами `id`-`table`, используемая для инициирования порожденных игровых объектов. Как построить эту таблицу, смотрите ниже.
+
+`[scale]`
+: (Опционально) Масштаб порождаемых игровых объектов. Масштаб может быть выражен в виде `number` (больше 0), которое задает равномерное масштабирование по всем осям. Можно также указать `vector3`, где каждый компонент задает масштабирование по соответствующей оси.
+
+`collectionfactory.create()` возвращает идентификаторы порожденных игровых объектов в виде таблицы. Ключи таблицы отображают хэш локального идентификатора коллекции каждого объекта на идентификатор каждого объекта в среде выполнения:
+
+::: sidenote
+Отношение "родительский-дочерний" между "bean" и "shield" *не* отражается в возвращаемой таблице. Это отношение существует только в графе сцены среды выполнения, то есть в том, как объекты преобразуются вместе. Повторное подчинение объекта никогда не изменяет его id.
+:::
+
+```lua
+local bean_ids = collectionfactory.create("#bean_factory")
+go.set_scale(0.5, bean_ids[hash("/bean")])
+pprint(bean_ids)
+-- DEBUG:SCRIPT:
+-- {
+--   hash: [/shield] = hash: [/collection0/shield], -- <1>
+--   hash: [/bean] = hash: [/collection0/bean],
+-- }
+```
+1. Префикс `/collection[N]/`, где `[N]` --- счетчик, добавляемый к id для уникальной идентификации каждого экземпляра:
+
+## Свойства
+
+При порождении коллекции можно передать свойства каждому игровому объекту, построив таблицу, где ключами являются идентификаторы объектов, а значениями --- таблицы со свойствами скрипта, которые нужно установить.
+
+```lua
+local props = {}
+props[hash("/bean")] = { shield = false }
+local ids = collectionfactory.create("#bean_factory", nil, nil, props)
+```
+
+Предположим, что игровой объект "bean" в "bean.collection" определяет свойство "shield". [Руководство по свойствам скрипта](/manuals/script-properties) содержит информацию о свойствах сценария.
+
+```lua
+-- bean/controller.script
+go.property("shield", true)
+
+function init(self)
+    if not self.shield then
+        go.delete("shield")
+    end     
+end
+```
+
+## Динамическая загрузка ресурсов фабрики
+
+Отметив в свойствах фабрики коллекций *Load Dynamically*, движок откладывает загрузку ресурсов, связанных с фабрикой.
+
+![Load dynamically](images/collection_factory/load_dynamically.png)
+
+Если опция не отмечена, движок загружает ресурсы прототипа при загрузке компонента фабрики коллекций, так что они сразу готовы к порождению.
+
+Если опция отмечена, есть два варианта использования:
+
+Синхронная загрузка
+: Вызовите [`collectionfactory.create()`](/ref/collectionfactory/#collectionfactory.create:url-[position]-[rotation]-[properties]-[scale]), когда нужно породить объекты. При этом ресурсы будут загружены синхронно, что может вызвать заминку, а затем будут порождены новые экземпляры.
+
+  ```lua
+  function init(self)
+      -- No factory resources are loaded when the collection factory’s
+      -- parent collection is loaded. Calling create without
+      -- having called load will create the resources synchronously.
+      self.go_ids = collecionfactory.create("#collectionfactory")
+  end
+
+  function final(self)
+      -- Delete game objects. Will decref resources.
+      -- In this case resources are deleted since the collection
+      -- factory component holds no reference.
+      go.delete_all(self.go_ids)
+
+      -- Calling unload will do nothing since factory holds
+      -- no references
+      collectionfactory.unload("#factory")
+  end
+  ```
+
+Асинхронная загрузка
+: Вызовите [`collectionfactory.load()`](/ref/collectionfactory/#collectionfactory.load:[url]-[complete_function]) для явной асинхронной загрузки ресурсов. Когда ресурсы будут готовы к порождению, будет получен обратный вызов.
+
+  ```lua
+  function load_complete(self, url, result)
+      -- Loading is complete, resources are ready to spawn
+      self.go_ids = collectionfactory.create(url)
+  end
+
+  function init(self)
+      -- No factory resources are loaded when the collection factory’s
+      -- parent collection is loaded. Calling load will load the resources.
+      collectionfactory.load("#factory", load_complete)
+  end
+
+  function final(self)
+      -- Delete game object. Will decref resources.
+      -- In this case resources aren’t deleted since the collection factory
+      -- component still holds a reference.
+      go.delete_all(self.go_ids)
+
+      -- Calling unload will decref resources held by the factory component,
+      -- resulting in resources being destroyed.
+      collectionfactory.unload("#factory")
+  end
+  ```

+ 192 - 0
docs/ru/manuals/collection-proxy.md

@@ -0,0 +1,192 @@
+---
+title: Компонент Collection Proxy
+brief: Это руководство объясняет, как динамически создавать новые игровые пространства и переключаться между ними.
+---
+
+# Компонент Collection Proxy
+
+Компонент Collection Proxy используется для динамической загрузки и выгрузки новых игровых "миров", основываясь на содержимом файла коллекции. Они могут использоваться для реализации переключения между игровыми уровнями, экранами графического интерфейса, загрузки и выгрузки повествовательных "сцен" на протяжении уровня, загрузки/выгрузки мини-игр и многого другого.
+
+Defold организует все игровые объекты в коллекции. Коллекция может содержать игровые объекты и другие коллекции (то есть субколлекции). Прокси-коллекции позволяют разделить содержимое на отдельные коллекции и затем динамически управлять загрузкой и выгрузкой этих коллекций с помощью скриптов.
+
+Прокси-коллекции отличаются от [фабрик коллекций](/manuals/collection-factory/). Фабрика коллекций внедряет содержимое коллекции в текущий игровой мир. Прокси-коллекции создают новый игровой мир во время выполнения и, следовательно, имеют другие сценарии использования.
+
+## Создание компонента Collection Proxy
+
+1. Добавьте прокси-коллекцию к игровому объекту, <kbd>кликнув ПКМ</kbd> на игровом объекте и выбрав <kbd>Add Component ▸ Collection Proxy</kbd> из контекстного меню.
+
+2. В свойстве *Collection* укажите ссылку на коллекцию, которую необходимо динамически загрузить в среду выполнения позднее. Ссылка является статической и гарантирует, что все содержимое коллекции, на которую ссылаются, в конечном счете окажется в игре.
+
+![add proxy component](images/collection-proxy/create_proxy.png){srcset="images/collection-proxy/[email protected] 2x"}
+
+(Содержимое можно исключить из сборки и загрузить вместо него код, отметив опцию *Exclude* и используя [Live-обновление](/manuals/live-update/).)
+
+## Загрузочная коллекция
+
+Когда движок Defold запускается, он загружает и инстанцирует все игровые объекты из *загрузочной (bootstrap) коллекции* в среду выполнения. Затем он инициализирует и активирует игровые объекты и их компоненты. Какая загрузочная коллекция должна использоваться движком, указывается в [настройках проекта](/manuals/project-settings/#main-collection). По договоренности этот файл коллекции обычно называется "main.collection".
+
+![bootstrap](images/collection-proxy/bootstrap.png){srcset="images/collection-proxy/[email protected] 2x"}
+
+Для размещения игровых объектов и их компонентов движок выделяет память, необходимую для всего "игрового мира", в который инстанцируется содержимое загрузочной коллекции. Кроме того, создается отдельный физический мир для любых объектов столкновений и физических симуляций.
+
+Поскольку скрипты должны иметь возможность обращаться ко всем объектам в игре, даже извне загрузочного мира, им присваивается уникальное имя: свойство *Name*, которое задается в файле коллекции:
+
+![bootstrap](images/collection-proxy/collection_id.png){srcset="images/collection-proxy/[email protected] 2x"}
+
+Если загружаемая коллекция содержит прокси-коллекции, коллекции, на которые они ссылаются, автоматически *не* загружаются. Необходимо контролировать загрузку этих ресурсов с помощью скриптов.
+
+## Загрузка коллекции
+
+Динамическая загрузка коллекции посредством прокси осуществляется путем отправки сообщения ``load`` компоненту прокси из скрипта:
+
+```lua
+-- Сказать прокси "myproxy", чтобы он начал загрузку.
+msg.post("#myproxy", "load")
+```
+
+![load](images/collection-proxy/proxy_load.png){srcset="images/collection-proxy/[email protected] 2x"}
+
+Прокси укажет движку выделить место для нового мира. Также будет создана отдельная среда выполнения физики и инстанцируются все игровые объекты в коллекции.
+
+Новый мир получает свое имя из свойства *Name* в файле коллекции, в данном примере оно установлено в "mylevel". Имя должно быть уникальным. Если *Name*, заданное в файле коллекции, уже используется для загруженного мира, движок сообщит об ошибке конфликта имен:
+
+```txt
+ERROR:GAMEOBJECT: The collection 'default' could not be created since there is already a socket with the same name.
+WARNING:RESOURCE: Unable to create resource: build/default/mylevel.collectionc
+ERROR:GAMESYS: The collection /mylevel.collectionc could not be loaded.
+```
+
+Когда движок закончит загрузку коллекции, прокси-коллекция отправит сообщение `"proxy_loaded"` обратно скрипту, который отправил сообщение `"load"`. Затем скрипт может инициализировать и активировать коллекцию в качестве реакции на это сообщение:
+
+```lua
+function on_message(self, message_id, message, sender)
+    if message_id == hash("proxy_loaded") then
+        -- Новый мир загружен. Инициировать и активировать его.
+        msg.post(sender, "init")
+        msg.post(sender, "enable")
+        ...
+    end
+end
+```
+
+`"load"`
+: Это сообщение указывает компоненту Collection Proxy начать загрузку своей коллекции в новый мир. Прокси отправит обратно сообщение `"proxy_loaded"`, когда все будет готово.
+
+`"async_load"`
+: Это сообщение указывает компоненту Collection Proxy начать фоновую загрузку своей коллекции в новый мир. Прокси отправит обратно сообщение `"proxy_loaded"`, когда все будет готово.
+
+`"init"`
+: Это сообщение указывает компоненту Collection Proxy, что все игровые объекты и компоненты, которые были инстанцированы, должны быть инициализированы. На этом этапе вызываются все функции скрипта.
+
+`"enable"`
+: Это сообщение указывает компоненту Collection Proxy, что все игровые объекты и компоненты должны быть активированы. Например, все компоненты Sprite начинают отрисовываться при активации.
+
+## Отправка сообщений в новый игровой мир
+
+Имя *Name*, заданное в свойствах файла коллекции, используется для обращения к игровым объектам и компонентам в загруженном мире. Если, например, создать объект-загрузчик в коллекции начальной загрузки, может понадобиться взаимодействовать с ним из любой загруженной коллекции:
+
+```lua
+-- сообщить загрузчику о необходимости загрузить следующий уровень:
+msg.post("main:/loader#script", "load_level", { level_id = 2 })
+```
+
+![load](images/collection-proxy/message_passing.png){srcset="images/collection-proxy/[email protected] 2x"}
+
+## Выгрузка мира
+
+Чтобы выгрузить загруженную коллекцию, необходимо отправить сообщения, соответствующие обратным этапам загрузки:
+
+```lua
+-- unload the level
+msg.post("#myproxy", "disable")
+msg.post("#myproxy", "final")
+msg.post("#myproxy", "unload")
+```
+
+`"disable"`
+: Это сообщение указывает компоненту Collection Proxy деактивировать все игровые объекты и компоненты в мире. На этом этапе прекращается отрисовка спрайтов.
+
+`"final"`
+: Это сообщение указывает компоненту Collection Proxy завершить все игровые объекты и компоненты в мире. На этом этапе вызываются функции `final()` всех скриптов.
+
+`"unload"`
+: Это сообщение указывает компоненту Collection Proxy полностью удалить мир из памяти.
+
+Если более тонкий контроль не требуется, можно отправить сообщение `"unload"` напрямую, без предварительной деактивации и финализации коллекции. Тогда прокси автоматически отключит и завершит коллекцию перед ее выгрузкой.
+
+Когда Collection Proxy закончит выгрузку коллекции, он отправит сообщение `"proxy_unloaded"` обратно в скрипт, который отправил сообщение `"unload"`:
+
+```lua
+function on_message(self, message_id, message, sender)
+    if message_id == hash("proxy_unloaded") then
+        -- Ok, мир выгружен...
+        ...
+    end
+end
+```
+
+
+## Временной шаг
+
+Обновления прокси-коллекции можно масштабировать, изменяя _временной шаг_. Это означает, что даже если игра имеет постоянную частоту 60 FPS, прокси может обновляться с большей или меньшей скоростью, влияя на такие аспекты, как:
+
+* Скорость физических симуляций
+* `dt`, переданное в `update()`
+* [Анимация свойств игровых объектов и GUI](https://defold.com/manuals/animation/#property-animation-1)
+* [Мультипликационная анимация](https://defold.com/manuals/animation/#flip-book-animation)
+* [Симуляции эффектов частиц](https://defold.com/manuals/particlefx/)
+* Частота таймера
+
+Можно также установить режим обновления, который позволяет контролировать, должно ли масштабирование выполняться дискретно (что имеет смысл только при коэффициенте масштабирования менее 1.0) или непрерывно.
+
+Управление коэффициентом масштабирования и режимом масштабирования осуществляется путем отправки прокси сообщения `set_time_step`:
+
+```lua
+-- обновлять загруженный мир на 1/5 скорости.
+msg.post("#myproxy", "set_time_step", {factor = 0.2, mode = 1}
+```
+
+Чтобы увидеть, что происходит при изменении временного шага, мы можем создать объект со следующим кодом в скрипте и поместить его в коллекцию, временной шаг которой мы изменяем:
+
+```lua
+function update(self, dt)
+    print("update() with timestep (dt) " .. dt)
+end
+```
+
+При шаге по времени 0.2 мы получаем следующий результат в консоли:
+
+```txt
+INFO:DLIB: SSDP started (ssdp://192.168.0.102:54967, http://0.0.0.0:62162)
+INFO:ENGINE: Defold Engine 1.2.37 (6b3ae27)
+INFO:ENGINE: Loading data from: build/default
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0.016666667535901
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0
+DEBUG:SCRIPT: update() with timestep (dt) 0.016666667535901
+```
+
+`update()` по-прежнему вызывается 60 раз в секунду, но значение `dt` меняется. Мы видим, что только 1/5 (0.2) вызовов `update()` будет иметь `dt` равное 1/60 (что соответствует 60 FPS) --- остальные равны нулю. Все физические симуляции также будут обновляться в соответствии с этим `dt` и продвигаться только в 1/5 кадров.
+
+:::sidenote
+Функциональность временного шага коллекции можно использовать для приостановки игры, например, при отображении всплывающего окна или когда окно потеряло фокус. Используйте `msg.post("#myproxy", "set_time_step", {factor = 0, mode = 0})` для паузы и `msg.post("#myproxy", "set_time_step", {factor = 1, mode = 1})` для возобновления.
+:::
+
+За подробностями обращайтесь к [`set_time_step`](/ref/collectionproxy#set_time_step).
+
+## Предостережения и общие проблемы
+
+Физика
+: С помощью прокси-коллекций можно загрузить в движок более одной коллекции верхнего уровня, или *игрового мира*. При этом важно знать, что каждая коллекция верхнего уровня --- это отдельный физический мир. Физические взаимодействия (столкновения, триггеры, рэйкасты) происходят только между объектами, принадлежащими одному и тому же миру. Поэтому даже если объекты столкновения из двух миров визуально располагаются прямо друг на друге, между ними не может быть какого-либо физического взаимодействия.
+
+Память
+: Каждая загруженная коллекция создает новый игровой мир, который занимает относительно много памяти. Если одновременно загружаются десятки коллекций через прокси, возможно, стоит пересмотреть структуру игры. Для порождения множества экземпляров иерархий игровых объектов больше подходят [фабрики коллекций](/manuals/collection-factory).
+
+Ввод
+: Если в загруженной коллекции есть объекты, требующие действий ввода, необходимо убедиться, что игровой объект, содержащий прокси-коллекцию, получает данные ввода. Когда игровой объект получает сообщения ввода, они передаются компонентам этого объекта, то есть прокси коллекции. Действия ввода отправляются через прокси в загруженную коллекцию.

+ 97 - 0
docs/ru/manuals/components.md

@@ -0,0 +1,97 @@
+---
+title: Компоненты игрового объекта
+brief: В данном руководстве дается обзор компонентов и краткие сведения об их использовании.
+---
+
+# Компоненты
+
+:[components](../shared/components.md)
+
+## Типы компонентов
+
+Defold поддерживает следующие типы компонентов:
+
+* [Collection Factory](/manuals/collection-factory) --- Порождает коллекции
+* [Collection Proxy](/manuals/collection-proxy) --- Загружает и выгружает коллекции
+* [Collision Object](/manuals/physics) --- Оснащает игровой объект физическим поведением
+* [Camera](/manuals/camera) --- Отвечает за область видимости и проекцию игрового мира
+* [Factory](/manuals/factory) --- Порождает игровые объекты
+* [GUI](/manuals/gui) --- Визуализирует графический пользовательский интерфейс
+* [Label](/manuals/label) --- Визуализирует текстовые фрагменты
+* [Mesh](/manuals/mesh) --- Отображает 3D-сетку (с возможностью создания и манипулирования при выполнении)
+* [Model](/manuals/model) --- Отображает 3D-модель (с возможностью анимации)
+* [Particle FX](/manuals/particlefx) ---  Порождает частицы
+* [Script](/manuals/script) --- Оснащает игру логикой
+* [Sound](/manuals/sound) --- Воспроизводит звуки или музыку
+* [Spine Model](/manuals/spinemodel) --- Визуализирует Spine-анимацию
+* [Sprite](/manuals/sprite) --- Отображает 2D-изображение (с возможностью мультипликации)
+* [Tile Map](/manuals/tilemap) --- Отображает сетку тайлов
+
+## Включение и отключение компонентов
+
+Компоненты игрового объекта активируются при создании этого игрового объекта. Если требуется отключить компонент, это делается путем отправки ему сообщения [`disable`](/ref/go/#disable):
+
+```lua
+-- отключить компонент с id 'weapon' в том же игровом объекте, что и этот скрипт
+msg.post("#weapon", "disable")
+
+-- отключить компонент с идентификатором 'shield' в игровом объекте 'enemy'
+msg.post("enemy#shield", "disable")
+
+-- отключить все компоненты в текущем игровом объекте
+msg.post(".", "disable")
+
+-- отключить все компоненты игрового объекта 'enemy'
+msg.post("enemy", "disable")
+```
+
+Чтобы снова включить компонент, достаточно отправить ему сообщение [`enable`](/ref/go/#enable):
+
+```lua
+-- включить компонент с id 'weapon'
+msg.post("#weapon", "enable")
+```
+
+## Свойства компонента
+
+В Defold компоненты всех типов имеют различные свойства. Панель [Properties](/manuals/editor/#the-editor-views) в редакторе отображает свойства текущего выделенного в [Outline](/manuals/editor/#the-editor-views) компонента. За дополнительной информацией о доступных свойствах обращайтесь к руководствам по различным типам компонентов.
+
+## Позиция, вращение и масштаб компонента
+
+Визуальные компоненты, как правило, имеют свойства позиции и вращения, а также, чаще всего, масштаб. Эти свойства могут быть изменены в редакторе, и почти во всех случаях не могут изменятся при выполнении. Единственным исключением является масштаб компонентов Sprite и Label, который все же может быть изменен при выполнении.
+
+Если необходимо изменять позицию, поворот или масштаб компонента во время выполнения, то вместо этого следует изменять позицию, поворот или масштаб игрового объекта, к которому этот компонент принадлежит. Такой подход имеет побочный эффект, поскольку будут затронуты все компоненты игрового объекта. Если требуется манипулировать только одним компонентом из множества, прикрепленных к игровому объекту, рекомендуется переместить данный компонент в отдельный игровой объект и добавить его в качестве дочернего игрового объекта к объекту, к которому изначально принадлежал компонент.
+
+## Порядок отрисовки компонентов
+
+Порядок отрисовки визуальных компонентов зависит от двух факторов.
+
+### Предикаты рендер-скрипта
+Каждому компоненту назначается [материал](/manuals/material/), и каждый материал имеет один или несколько тегов. Рендер-скрипт, в свою очередь, определяет ряд предикатов, каждый из которых соответствует одному или нескольким тегам материала. В функции *update()* рендер-скрипта [предикаты отрисовываются один за другим](/manuals/render/#render-predicates), а также отрисовываются компоненты, соответствующие тегам, определенным в каждом предикате. Рендер-скрипт по умолчанию сперва отрисовывает спрайты и тайловые карты за один проход, затем частицы за другой проход (оба в мировом пространстве). Далее рендер-скрипт переходит к отрисовке компонентов графического интерфейса в отдельном проходе в пространстве экрана.
+
+### Значение по оси Z
+Все игровые объекты и компоненты позиционируются в 3D пространстве, причем позиции выражаются в виде объектов типа vector3. Когда мы просматриваем графическое содержимое игры в 2D, значения по осям X и Y определяют позицию объекта вдоль осей "ширины" и "высоты", а значение по Z определяет позицию вдоль оси "глубины". Позиция по Z позволяет управлять видимостью перекрывающихся объектов: спрайт со значением по Z, равным 1, будет отображаться поверх спрайта в позиции по Z, равной 0. По умолчанию Defold использует систему координат, допускающую значения по оси Z от -1 до 1:
+
+![model](images/graphics/z-order.png){srcset="images/graphics/[email protected] 2x"}
+
+Компоненты, соответствующие [предикату рендера](/manuals/render/#render-predicates) отрисовываются совместно, и порядок их отрисовки зависит от конечного значения по оси Z компонента. Конечное значение компонента по Z --- это сумма значений по Z самого компонента, игрового объекта, к которому он принадлежит, и значений по Z всех родительских игровых объектов.
+
+::: sidenote
+Порядок отрисовки нескольких компонентов GUI значением по Z **не** определяется. Он контролируется функцией [gui.set_render_order()](/ref/gui/#gui.set_render_order:order).
+:::
+
+Пример: Есть два игровых объекта A и B. B является дочерним по отношению к A. B имеет компонент Sprite.
+
+| What     | Z-value |
+|----------|---------|
+| A        | 2       |
+| B        | 1       |
+| B#sprite | 0.5     |
+
+С помощью приведенной выше иерархии окончательное значение по Z спрайта в объекте B равно 2 + 1 + 0.5 = 3.5.
+
+::: important
+Если два компонента имеют одинаковое значение по оси Z, то порядок считается неопределенным, что в итоге приведет к мерцанию компонентов, или компоненты будут отображаться в одном порядке на одной платформе и в другом порядке на другой платформе.
+
+Рендер-скрипт определяет ближнюю и дальнюю плоскости для значений по Z. Любой компонент со значением по Z, выходящим за пределы этого диапазона, рендерится не будет. По умолчанию диапазон составляет от -1 до 1, но [его можно легко изменить](/manuals/render/#default-view-projection). Числовая точность значений по оси Z с ближним и дальним пределами -1 и 1 очень высока. При работе с 3D-ассетами может возникнуть необходимость изменить ближний и дальний пределы проекции по умолчанию в пользовательском рендер-скрипте. За подробностями обращайтесь к [руководству по рендерингу](/manuals/render/).
+:::

+ 8 - 8
docs/ru/manuals/editor.md

@@ -5,7 +5,7 @@ brief: Данное руководство представляет собой 
 
 # Обзор редактора
 
-Назначение редактора - просмотр и эффективное управление файлами игрового проекта. При открытии файла на редактирование, запускается соответствующий редактор, при этом вся необходимая информация о файле отображается в отдельных представлениях.
+Назначение редактора --- просмотр и эффективное управление файлами игрового проекта. При открытии файла на редактирование, запускается соответствующий редактор, при этом вся необходимая информация о файле отображается в отдельных представлениях.
 
 ## Запуск редактора
 
@@ -41,7 +41,7 @@ New Project
 : Представление по центру отображает текущий открытый файл в редакторе соответствующего типа. Все визуальные редакторы позволяют управлять видом камеры:
 
 - Панорамирование: <kbd>Alt + ЛКМ</kbd>.
-- Зумирование: <kbd>Alt + ПКМ</kbd> (трёхкнопочная мышь) или <kbd>Ctrl + Mouse button</kbd> (однокнопочная мышь). Если мышь оснащена колесом прокрутки, его можно использовать для зумирования.
+- Зумирование: <kbd>Alt + ПКМ</kbd> (трехкнопочная мышь) или <kbd>Ctrl + Mouse button</kbd> (однокнопочная мышь). Если мышь оснащена колесом прокрутки, его можно использовать для зумирования.
 - Вращение в 3D: <kbd>Ctrl + ЛКМ</kbd>.
 
 В правом верхнем углу представления сцены расположен тулбар, на котором можно найти инструменты манипулирования объектами: *Move*, *Rotate* и *Scale*.
@@ -52,16 +52,16 @@ New Project
 : Это представление отображает содержимое редактируемого в данный момент файла в виде иерархической древовидной структуры. Outline отражает представление редактора, позволяя выполнять операции с элементами:
    - <kbd>Кликните</kbd> по элементу, чтобы выделить его. Удерживайте <kbd>Shift</kbd> или <kbd>Option</kbd>, чтобы расширить выделение.
    - <kbd>Перетащите и бросьте</kbd> элемент для перемещения. Бросьте какой-либо игровой объект на другой игровой объект в коллекции, чтобы сделать его дочерним.
-   - <kbd>Кликните ПКМ</kbd> чтобы открыть _контекстное меню_, с помощью которого можно добавлять, удалять выделенные элементы и т. д.
+   - <kbd>Кликните ПКМ</kbd> чтобы открыть _контекстное меню_, с помощью которого можно добавлять, удалять выделенные элементы и т.д.
 
 Панель *Properties*
-: Это представление отображает свойства (такие как Position, Rotation, Animation и т. д.), ассоциированные с текущим выбранным элементом.
+: Это представление отображает свойства (такие как Position, Rotation, Animation и т.д.), ассоциированные с текущим выбранным элементом.
 
 Панель *Tools*
 : В этом представлении есть несколько вкладок. Вкладка *Console* отображает вывод какой-либо ошибки или целенаправленный вывод, осуществляемый вами во время выполнения игры. Рядом с консолью находятся вкладки *Build Errors*, *Search Results*, а также *Curve Editor*, используемый при редактировании кривых в редакторе частиц. Панель Tools также используется для взаимодействия со встроенным отладчиком.
 
 Панель *Changed Files*
-: Если проект использует распределённую систему контроля версий Git, это представление отображает список файлов проекта, которые были изменены, добавлены или удалены. Регулярно выполняя синхронизацию проекта, вы можете синхронизировать свою локальную копию с тем, что хранится в Git-репозитории проекта, что позволяет сотрудничать с командой без риска потери своей работы в случае сбоя. Подробнее о Git можно узнать в нашем [руководстве по контролю версий] (/manuals/version-control/). В этом представлении можно выполнять некоторые файловые операции:
+: Если проект использует распределённую систему контроля версий Git, это представление отображает список файлов проекта, которые были изменены, добавлены или удалены. Регулярно выполняя синхронизацию проекта, вы можете синхронизировать свою локальную копию с тем, что хранится в Git-репозитории проекта, что позволяет сотрудничать с командой без риска потери своей работы в случае сбоя. Подробнее о Git можно узнать в нашем [руководстве по контролю версий](/manuals/version-control/). В этом представлении можно выполнять некоторые файловые операции:
 
    - Выполните <kbd>двойной клик</kbd> по файлу чтобы открыть представление отличий. Defold открывает файл в подходящем редакторе, так же, как и в представлении ассетов.
    - Выполните <kbd>клик ПКМ</kbd> по файлу, чтобы открыть всплывающее меню, с помощью которого можно открыть представление отличий, отменить все изменения, сделанные в файле, найти файл в файловой системе и многое другое.
@@ -112,7 +112,7 @@ New Project
 
   ![Scale object](images/editor/scale.jpg)
 
-  Этот инструмент состоит из набора квадратных маркеров. Из них центральный равномерно масштабирует объект по всем осям (включая Z). Также имеется по одному маркеру для масштабирования вдоль каждой из осей X, Y и Z и по одному - для масштабирования в плоскостях X-Y, X-Z и Y-Z.
+  Этот инструмент состоит из набора квадратных маркеров. Из них центральный равномерно масштабирует объект по всем осям (включая Z). Также имеется по одному маркеру для масштабирования вдоль каждой из осей X, Y и Z и по одному --- для масштабирования в плоскостях X-Y, X-Z и Y-Z.
 
 ## Создание новых файлов проекта
 
@@ -128,7 +128,7 @@ New Project
 
 ## Импортирование файлов в проект
 
-Добавление в проект файлов ассетов (изображений, звуков, моделей и т. д.) осуществляется простым перетаскиванием их в нужную позицию в браузер *ассетов*. При этом создаются _копии_ файлов в выбранном расположении файловой структуры проекта. За подробностями обращайтесь к [нашему руководству по импортированию ассетов](/manuals/importing-assets/).
+Добавление в проект файлов ассетов (изображений, звуков, моделей и т.д.) осуществляется простым перетаскиванием их в нужную позицию в браузер *ассетов*. При этом создаются _копии_ файлов в выбранном расположении файловой структуры проекта. За подробностями обращайтесь к [нашему руководству по импортированию ассетов](/manuals/importing-assets/).
 
 ![Import files](images/editor/import.png){srcset="images/editor/[email protected] 2x"}
 
@@ -265,4 +265,4 @@ $ > ./path/to/Defold.app/Contents/MacOS/Defold
 
 
 ## FAQ
-:[Editor FAQ](../shared/editor-faq.md)
+:[Editor FAQ](../shared/editor-faq.md)

+ 249 - 0
docs/ru/manuals/factory.md

@@ -0,0 +1,249 @@
+---
+title: Компонент Factory
+brief: Это руководство объясняет, как использовать компоненты Factory для динамического порождения игровых объектов во время выполнения.
+---
+
+# Компонент Factory
+
+Компонент Factory используется для динамического порождения игровых объектов из пула объектов в запущенной игре.
+
+При добавлении фабрики к игровому объекту в свойстве *Prototype* указывается, какой файл игрового объекта должна использовать фабрика в качестве прототипа для всех новых создаваемых ею игровых объектов.
+
+![Factory component](images/factory/factory_collection.png)
+
+![Factory component](images/factory/factory_component.png)
+
+Чтобы инициировать создание игрового объекта, вызовите `factory.create()`:
+
+```lua
+-- factory.script
+local p = go.get_position()
+p.y = vmath.lerp(math.random(), min_y, max_y)
+local component = "#star_factory"
+factory.create(component, p)
+```
+
+![Spawned game object](images/factory/factory_spawned.png)
+
+`factory.create()` принимает 5 параметров:
+
+`url`
+: Идентификатор фабрики, которая должна породить новый игровой объект.
+
+`[position]`
+: (Опционально) Мировая позиция нового игрового объекта. Это должен быть `vector3`. Если позицию не указать, игровой объект будет порожден в позиции фабрики.
+
+`[rotation]`
+: (optional) Мировое значение вращения нового игрового объекта. Это должно быть `quat`.
+
+`[properties]`
+: (Опционально) Lua-таблица с любыми значениями свойств скрипта для инициирования игрового объекта. За подробностями обращайтесь к [руководству по свойствам скрипта](/manuals/script-properties).
+
+`[scale]`
+: (Опционально) Масштаб порожденного игрового объекта. Масштаб может быть выражен в виде `number` (больше 0), задающего равномерное масштабирование по всем осям. Кроме того, можно указать `vector3`, где каждый компонент задает масштабирование по соответствующей оси.
+
+Например:
+
+```lua
+-- factory.script
+local p = go.get_position()
+p.y = vmath.lerp(math.random(), min_y, max_y)
+local component = "#star_factory"
+-- Порождение без вращения, но с двукратным масштабом.
+-- Установите стоимость звезды в 10.
+factory.create(component, p, nil, { score = 10 }, 2.0) -- <1>
+```
+1. Устанавливает свойство "score" игрового объекта-звезды.
+
+```lua
+-- star.script
+go.property("score", 1) -- <1>
+
+local speed = -240
+
+function update(self, dt)
+    local p = go.get_position()
+    p.x = p.x + speed * dt
+    if p.x < -32 then
+        go.delete()
+    end
+    go.set_position(p)
+end
+
+function on_message(self, message_id, message, sender)
+    if message_id == hash("collision_response") then
+        msg.post("main#gui", "add_score", {amount = self.score}) -- <2>
+        go.delete()
+    end
+end
+```
+1. Свойства скрипта "score" определено со значением по умолчанию.
+2. Ссылается на свойство скрипта "score" как на значение, хранящееся в "self".
+
+![Spawned game object with property and scaling](images/factory/factory_spawned2.png)
+
+::: sidenote
+В настоящее время Defold не поддерживает неравномерное масштабирование форм столкновений. Если задать неравномерное значение масштаба, например, `vmath.vector3(1.0, 2.0, 1.0)`, спрайт будет масштабироваться правильно, но формы столкновений --- нет.
+:::
+
+
+## Адресация объектов, созданных фабрикой
+
+Механизм адресации Defold позволяет получить доступ к каждому объекту и компоненту в запущенной игре. В [руководстве по адрессации](/manuals/addressing/) подробно описано, как работает эта система. Можно использовать тот же механизм адресации для порожденных игровых объектов и их компонентов. Зачастую достаточно использовать идентификатор порожденного объекта, например, при отправке сообщения:
+
+```lua
+local function create_hunter(target_id)
+    local id = factory.create("#hunterfactory")
+    msg.post(id, "hunt", { target = target_id })
+    return id
+end
+```
+
+::: sidenote
+Передача сообщения самому игровому объекту вместо конкретного компонента фактически отправит сообщение всем компонентам. Обычно это не является проблемой, но об этом следует помнить, если объект имеет много компонентов.
+:::
+
+Но что, если необходимо получить доступ к определенному компоненту в порожденном игровом объекте, например, чтобы отключить объект столкновения или изменить изображение спрайта? Решение заключается в построении URL из идентификатора игрового объекта и идентификатора компонента.
+
+```lua
+local function create_guard(unarmed)
+    local id = factory.create("#guardfactory")
+    if unarmed then
+        local weapon_sprite_url = msg.url(nil, id, "weapon")
+        msg.post(weapon_sprite_url, "disable")
+
+        local body_sprite_url = msg.url(nil, id, "body")
+        sprite.play_flipbook(body_sprite_url, hash("red_guard"))
+    end
+end
+```
+
+
+## Отслеживание порожденных и родительских объектов
+
+При вызове `factory.create()` возвращается id нового игрового объекта, что позволяет сохранить его для дальнейшего использования. Одно из распространенных применений --- порождать объекты и добавлять их идентификаторы в таблицу, чтобы потом удалить их все, например, при сбросе компоновки уровня:
+
+```lua
+-- spawner.script
+self.spawned_coins = {}
+
+...
+
+-- Spawn a coin and store it in the "coins" table.
+local id = factory.create("#coinfactory", coin_position)
+table.insert(self.spawned_coins, id)
+```
+
+А затем:
+
+```lua
+-- coin.script
+-- Удалить все порожденные монеты.
+for _, coin_id = ipairs(self.spawned_coins) do
+    go.delete(coin_id)
+end
+
+-- или, как вариант
+go.delete_all(self.spawned_coins)
+```
+
+Также часто бывает необходимо, чтобы порожденный объект знал об объекте, породившем его. В качестве примера можно привести какой-нибудь автономный объект, который может быть порожден только по одному за раз. Тогда порожденный объект должен сообщить породителю, когда он будет удален или деактивирован, чтобы можно было породить другой:
+
+```lua
+-- spawner.script
+-- Spawn a drone and set its parent to the url of this script component
+self.spawned_drone = factory.create("#dronefactory", drone_position, nil, { parent = msg.url() })
+
+...
+
+function on_message(self, message_id, message, sender)
+    if message_id == hash("drone_dead") then
+        self.spawed_drone = nil
+    end
+end
+```
+
+Логика порожденного объекта:
+
+```lua
+-- drone.script
+go.property("parent", msg.url())
+
+...
+
+function final(self)
+    -- I'm dead.
+    msg.post(self.parent, "drone_dead")
+end
+```
+
+## Динамическая загрузка ресурсов фабрики
+
+Отметив в свойствах фабрики *Load Dynamically*, движок откладывает загрузку ресурсов, связанных с фабрикой.
+
+![Load dynamically](images/factory/load_dynamically.png)
+
+Если эта опция не отмечена, движок загружает ресурсы прототипа при загрузке компонента Factory, чтобы они были сразу готовы к порождению.
+
+Если опция отмечена, есть два варианта использования:
+
+Синхронная загрузка
+: Вызовите [`factory.create()`](/ref/factory/#factory.create), когда нужно породить объекты. При этом ресурсы будут загружены синхронно, что может вызвать заминку, а затем будут порождены новые экземпляры.
+
+  ```lua
+  function init(self)
+      -- No factory resources are loaded when the factory’s parent
+      -- collection is loaded. Calling create without having called
+      -- load will create the resources synchronously.
+      self.go_id = factory.create("#factory")
+  end
+
+  function final(self)
+      -- Delete game objects. Will decref resources.
+      -- In this case resources are deleted since the factory component
+      -- holds no reference.
+      go.delete(self.go_id)
+
+      -- Calling unload will do nothing since factory holds no references
+      factory.unload("#factory")
+  end
+  ```
+
+Асинхронная загрузка
+: Вызовите [`factory.load()`](/ref/factory/#factory.load) для явной асинхронной загрузки ресурсов. Когда ресурсы будут готовы к порождению, будет получен обратный вызов.
+
+  ```lua
+  function load_complete(self, url, result)
+      -- Loading is complete, resources are ready to spawn
+      self.go_id = factory.create(url)
+  end
+
+  function init(self)
+      -- No factory resources are loaded when the factory’s parent
+      -- collection is loaded. Calling load will load the resources.
+      factory.load("#factory", load_complete)
+  end
+
+  function final(self)
+      -- Delete game object. Will decref resources.
+      -- In this case resources aren’t deleted since the factory component
+      -- still holds a reference.
+      go.delete(self.go_id)
+
+      -- Calling unload will decref resources held by the factory component,
+      -- resulting in resources being destroyed.
+      factory.unload("#factory")
+  end
+  ```
+
+## Ограничения инстанцирования
+
+Настройка проекта *Max Instances* в разделе *настроек, связанных с коллекциями* ограничивает общее количество экземпляров игровых объектов, которые могут существовать в игровом пространстве (main.collection, загружаемая при запуске, или любое пространство, загруженное через прокси-коллекцию). Все игровые объекты, существующие в пространстве, подсчитываются с учетом этого ограничения, и не имеет значения, размещены ли они вручную в редакторе или порождены во время выполнения скрипта.
+
+![Max instances](images/factory/factory_max_instances.png)
+
+Так, если значение *Max Instances* равно 1024 и в основной коллекции имеется 24 вручную размещенных игровых объекта, можно породить еще 1000 игровых объектов. Как только игровой объект удаляется, можно породить еще один экземпляр.
+
+## Объединение игровых объектов в пул
+
+Может показаться хорошей идеей сохранять порожденные игровые объекты в пуле и использовать их повторно. Однако движок уже выполняет объединение объектов в пул под капотом, поэтому дополнительные операции лишь замедлят работу. Быстрее и чище удалять игровые объекты и порождать новые.

+ 107 - 0
docs/ru/manuals/flipbook-animation.md

@@ -0,0 +1,107 @@
+---
+title: Руководство по мултьипликации в Defold
+brief: Данное руководство объясняет как использовать покадровую анимацию в Defold
+---
+
+# Покадровая анимация
+
+Покадровая анимация состоит из серии неподвижных изображений, которые отображаются одно за другим. Данная техника весьма схожа с традиционной рисованной мультипликацией (см. https://ru.wikipedia.org/wiki/%D0%A0%D0%B8%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F). Эта техника предлагает безграничные возможности, т.к. каждым кадром можно управлять отдельно. Однако, так как каждый кадр хранится в отдельном изображении, расходование памяти может быть ощутимым. Смягчение анимации также зависит от числа изображений на секунду времени, но увеличение числа изображений как правило увеличивает и количество работы. Покадровая анимация в Defold ъранится либо как отдельные изображения, добавленные в Атлас * (/manuals/atlas) либо как Tile Source (/manuals/tilesource) в виде кадров выстроенных в горизонтальную последовательность.
+
+  ![Animation sheet](images/animation/animsheet.png){.inline}
+  ![Run loop](images/animation/runloop.gif){.inline}
+
+## Проигрывание покадровой анимации
+
+Спрайты и GUI-ноды Box могут отображать покадровые анимации и вы можете достаточно гибко управлять ими прямо во время выполнения игры
+
+Спрайты
+: Чтобы запустить анимацию во время выполнения игры используйте функцию [`sprite.play_flipbook()`](/ref/sprite/?q=play_flipbook#sprite.play_flipbook:url-id-[complete_function]-[play_properties]). Смотрите пример ниже.
+
+GUI-ноды Box
+: Чтобы запустить анимацию во время выполнения игры используйте функцию [`gui.play_flipbook()`](/ref/gui/?q=play_flipbook#gui.play_flipbook:node-animation-[complete_function]-[play_properties]). Смотрите пример ниже.
+
+::: Примечание
+Метод проигрывания "однократный, пинг-понг" проиграет анимацию до последнего кадра, затем в обратном порядке до **второго** кадра анимации, а не до самого первого. Это сделано, чтобы облегчить процесс склеивания цепочек анимаций.
+:::
+
+### Примеры со спрайтами
+
+Предположим, что в вашей игре есть фича "уклониться", которая позволяет игроку уклоняться по нажатию специальной кнопки. Для визуального эффекта такой фичи, вы реализовали 4 анимации:
+
+"idle"
+: Зацикленная анимация игрового персонажа в состоянии покоя.
+
+"dodge_idle"
+: Зацикленная анимация игрового персонажа в состоянии покоя, находясь в позиции уклонения.
+
+"start_dodge"
+: Однократная анимация-переход переводящая игрового персонажа из обычной стойки в уклонение.
+
+"stop_dodge"
+: Однократная анимация-переход переводящая игрового персонажа из уклонения в обычную стойку.
+
+Следующий скрипт реализует такую логику:
+
+```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" - это наше приходящее на вход действие
+    if action_id == hash("dodge") then
+        if action.pressed then
+            sprite.play_flipbook("#sprite", hash("start_dodge"), play_idle_animation)
+            -- запоминаем, что мы уклоняемся
+            self.dodge = true
+        elseif action.released then
+            sprite.play_flipbook("#sprite", hash("stop_dodge"), play_idle_animation)
+            -- больше не уклоняемся
+            self.dodge = false
+        end
+    end
+end
+```
+
+### Примеры с GUI-нодами Box
+
+Выбирая анимацию или изображение для ноды, вы фактически назначаете источник изображения (атлас или Tile source) и анимацию по-умолчанию. Источник изображения статически устанавливается для ноды, но текущая анимация для проигрывания может быть изменена во время работы игры. Обычные изображения трактуются движком как однокадровые анимации, так что, изменение изображения во время работы игры есть эквивалент покадровой анимации для ноды:
+
+```lua
+function init(self)
+    local character_node = gui.get_node("character")
+    -- Требуется, чтобы нода имела анимацию по-умолчанию в том же атласе или источнике тайлов 
+    -- как и новая анимация/изображение, которые мы проигрываем. 
+    gui.play_flipbook(character_node, "jump_left")
+end
+```
+
+
+## Функции обратного вызова по завершению
+
+Функции `sprite.play_flipbook()` и `gui.play_flipbook()` поддерживают опциональные функции обратного вызова в качестве последнего переданного аргумента. Такие переданные функции будут вызваны когда анимация проиграется до конца. Функции никогда не будут вызваны для зацикленных анимаций. Функция обратного вызова может быть использована для активации других событий по завершению анимации или для склеивания нескольких анимаций в одну цепочку. Примеры:
+
+```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
+```

+ 164 - 0
docs/ru/manuals/font.md

@@ -0,0 +1,164 @@
+---
+title: Шрифты в Defold
+brief: В этом руководстве описаны особенности работы со шрифтами и способ их вывода на экран в играх.
+---
+
+# Файлы шрифтов
+
+Шрифты используются для визуализации текста в компонентах Label и GUI-нодах Text. Defold поддерживает несколько форматов файлов шрифтов:
+
+- TrueType
+- OpenType
+- BMFont
+
+Шрифты, добавленные в проект, автоматически конвертируются в текстуру, которую Defold может визуализировать. Доступны два метода визуализации шрифтов, каждый из которых имеет свои преимущества и недостатки:
+
+- Bitmap
+- Distance field
+
+## Создание шрифта
+
+Чтобы создать шрифт для использования в Defold, создайте новый файл Font, выбрав в меню <kbd>File ▸ New...</kbd>, затем <kbd>Font</kbd>. Можно также <kbd>кликнуть ПКМ</kbd> в нужном расположении в браузере ассетов и выбрать <kbd>New... ▸ Font</kbd>.
+
+![New font name](images/font/new_font_name.png){srcset="images/font/[email protected] 2x"}
+
+Присвойте новому файлу шрифта имя и кликните <kbd>Ok</kbd>. Новый файл шрифта откроется в редакторе.
+
+![New font](images/font/new_font.png){srcset="images/font/[email protected] 2x"}
+
+Перетащите необходимый шрифт в браузер *Assets* в подходящее для него расположение.
+
+В свойстве *Font* укажите файл шрифта и, при необходимости, настройте остальные свойства.
+
+## Свойства
+
+*Font*
+: Файл TTF, OTF или *.fnt*, используемый для генерирования данных о шрифте.
+
+*Material*
+: Материал, используемый при рендеринге этого шрифта. Обязательно измените этот параметр в соответствии с выбранным типом шрифта --- Distance Field или Bitmap (подробнее см. ниже).
+
+*Output Format*
+: Тип генерируемых данных о шрифте.
+
+  - `TYPE_BITMAP` --- конвертирует импортированный файл OTF или TTF в текстуру, представляющую собой изображение шрифта, растровые данные которой используются для визуализации текстовых нод. Цветовые каналы используются для кодирования формы граней, контура и отбрасываемой тени. Для файлов *.fnt* исходная растровая текстура используется как есть.
+  - `TYPE_DISTANCE_FIELD` --- импортированный шрифт конвертируется в текстуру, данные о пикселях которой представляют не экранные пиксели, а расстояния до границы шрифта. Подробности см. ниже.
+
+*Render Mode*
+: Режим рендеринга глифов.
+
+  - `MODE_SINGLE_LAYER` --- создает по одному четырехугольнику для каждого символа.
+  - `MODE_MULTI_LAYER` --- создает отдельные четырехугольные формы для глифа, контура и теней соответственно. Слои отображаются в обратном порядке (back-to-front), что исключает вероятность загораживания одного символа другим, ранее отображенным, в случае когда контур шире, чем расстояние между глифами. Этот режим рендеринга также обеспечивает правильное смещение теней, задаваемое свойствами Shadow X/Y в ресурсе шрифта.
+
+*Size*
+: Целевой размер глифов в пикселях.
+
+*Antialias*
+: Сглаживание шрифта при запекании в целевое растровое изображение. Установите значение 0, если хотите получить чисто пиксельный (pixel perfect) рендеринг шрифта.
+
+*Alpha*
+: Прозрачность глифа. 0.0--1.0, где 0.0 означает прозрачность, а 1.0 --- непрозрачность.
+
+*Outline Alpha*
+: Прозрачность сгенерированного контура. 0.0--1.0.
+
+*Outline Width*
+: Ширина сгенерированного контура в пикселях. Установите значение 0 чтобы убрать контур.
+
+*Shadow Alpha*
+: Прозрачность сгенерированной тени. 0.0--1.0.
+
+::: sidenote
+Поддержка теней обеспечивается встроенными шейдерами материала шрифта и работает как в однослойном, так и в многослойном режиме рендеринга. Если многослойный рендеринг шрифта или поддержка теней не нужны, лучше использовать более простой шейдер, такой как builtins/font-singlelayer.fp.
+:::
+
+*Shadow Blur*
+: Для растровых шрифтов эта настройка указывает на то, сколько раз небольшое зерно размытия будет применено к каждому глифу шрифта. Для шрифтов типа Distance Field эта настройка эквивалентна фактической ширине размытия в пикселях.
+
+*Shadow X/Y*
+: Горизонтальное и вертикальное смещение сгенерированной тени в пикселях. Этот параметр влияет на тень глифа, только если свойство Output Format установлено в значение `MODE_MULTI_LAYER`.
+
+*Extra Characters*
+: По умолчанию шрифт включает печатные ASCII символы (коды символов 32-126). Чтобы вручную включить дополнительные символы, перечислите их в этом поле свойства.
+
+::: sidenote
+Печатные ASCII символы:
+space ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ \` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
+:::
+
+*All Chars*
+: Если отметить это свойство, все глифы, имеющиеся в исходном файле, будут включены в вывод.
+
+*Cache Width/Height*
+: Ограничивает размер кэша растра глифов. Когда движок рендерит текст, он ищет глиф в кэше растра. Если его там нет, он будет добавлен в кэш перед рендерингом. Если кэш растра слишком мал, чтобы вместить все глифы, которые движок пытается отрендерить, возникает ошибка (`ERROR:RENDER: Out of available cache cells! Consider increasing cache_width or cache_height for the font.`).
+
+  При значении 0 размер кэша устанавливается автоматически.
+
+## Шрифты Distance Field
+
+Шрифты Distance Field (карта расстояний) вместо растровых данных хранят расстояние до границы глифа в текстуре. Когда движок рендерит шрифт, требуется специальный шейдер, чтобы интерпретировать данные о расстоянии и использовать их для отрисовки глифа. Шрифты Distance Field более ресурсоемки, чем растровые, но обеспечивают большую гибкость в выборе размера.
+
+![Distance field font](images/font/df_font.png){srcset="images/font/[email protected] 2x"}
+
+Обязательно измените свойство *Material* шрифта на *builtins/fonts/font-df.material* (или любой другой материал, который может обрабатывать данные карты расстояния) при создании шрифта, иначе при выводе шрифта на экран будет использоваться неподходящий шейдер.
+
+## Растровые шрифты BMFont
+
+В дополнение к генерируемым растровым картам Defold поддерживает предварительно запеченные растровые шрифты формата "BMFont". Эти шрифты представляют собой PNG-изображение в виде страницы с глифами. Кроме того, файл *.fnt* содержит информацию о том, где на странице находится каждый глиф, а также информацию о размере и кернинге. (Следует учесть, что Defold не поддерживает XML-версию формата *.fnt*, который используется в Phaser и в некоторых других инструментах).
+
+Эти типы шрифтов не обеспечивают повышения производительности по сравнению с растровыми шрифтами, генерируемыми из файлов TrueType или OpenType, но могут включать произвольную графику, расцветку и тени непосредственно в изображении.
+
+Добавьте сгенерированные файлы *.fnt* и *.png* в проект Defold. Эти файлы должны находиться в одной папке. Создайте новый файл шрифта и задайте свойству Font файл типа *.fnt*. Убедитесь, что Output Format установлен в значение `TYPE_BITMAP`. Defold не будет генерировать растровое изображение, а будет использовать то, которое содержится в PNG.
+
+::: sidenote
+Для создания BMFont следует воспользоваться инструментом для генерирования соответствующих файлов. Существует несколько вариантов:
+
+* [Bitmap Font Generator](http://www.angelcode.com/products/bmfont/) --- только для Windows, предоставляется AngelCode.
+* [Shoebox](http://renderhjs.net/shoebox/) --- бесплатное приложение на базе Adobe Air для Windows и macOS.
+* [Hiero](https://github.com/libgdx/libgdx/wiki/Hiero) --- инструмент с открытым исходным кодом на языке Java.
+* [Glyph Designer](https://71squared.com/glyphdesigner) --- коммерческий инструмент для macOS от 71 Squared.
+* [bmGlyph](https://www.bmglyph.com) --- коммерческий инструмент для macOS от Sovapps.
+:::
+
+![BMfont](images/font/bm_font.png){srcset="images/font/[email protected] 2x"}
+
+Чтобы шрифт отображался корректно, не забудьте установить его свойство Material в *builtins/fonts/font-fnt.material*.
+
+## Артефакты и рекомендации
+
+Как правило, растровые шрифты лучше всего подходят для рендеринга без масштабирования. Они быстрее выводятся на экран, чем шрифты с картой расстояний.
+
+Шрифты Distance Field очень хорошо реагируют на масштабирование. С другой стороны, растровые шрифты, будучи просто пиксельными изображениями, будут увеличиваться в размере, поэтому пиксели будут расти при масштабировании шрифта, что приведет к появлению блочных артефактов, то есть угловатости. Ниже приведен образец шрифта размером 48 пикселей, увеличенный в 4 раза.
+
+![Fonts scaled up](images/font/scale_up.png){srcset="images/font/[email protected] 2x"}
+
+При уменьшении масштаба растровые текстуры могут качественно и эффективно масштабироваться и сглаживаться средствами GPU. Растровый шрифт лучше сохраняет свой цвет, чем шрифт с картой расстояний. Вот масштаб того же образца шрифта размером 48 пикселей, уменьшенный до 1/5 размера:
+
+![Fonts scaled down](images/font/scale_down.png){srcset="images/font/[email protected] 2x"}
+
+Шрифты Distance Field должны быть отрендерены до целевого размера, достаточно большого для хранения информации о расстояниях и возможности описать кривые глифов шрифта. Это тот же шрифт, что и выше, но размером 18 пикселей и увеличенный в 10 раз. Разумеется, этого слишком мало для кодирования форм этого шрифта:
+
+![Distance field artifacts](images/font/df_artifacts.png){srcset="images/font/[email protected] 2x"}
+
+Если поддержка теней и контуров не требуется, установите соответствующие им значения альфа в 0. В противном случае данные о тенях и контурах все равно будут генерироваться, что приведет к излишнему потреблению памяти.
+
+## Кэш шрифта
+Ресурс шрифта в Defold приводит к появлению двух вещей во время выполнения: текстуры и данных шрифта.
+
+* Данные о шрифте состоят из списка вхождений глифов, каждое из которых содержит некоторую базовую информацию о кернинге и растровые данные для этого глифа.
+* Текстура --- это внутреннее название "кэша текстуры глифа", используемого при рендеринге текста для определенного шрифта.
+
+Во время выполнения, при рендеринге текста, движок сначала обходит глифы подлежащие рендерингу, чтобы проверить, какие глифы доступны в кэше текстур. Для каждого глифа, отсутствующего в кэше текстур глифов, будет произведена загрузка текстуры из растровых данных, хранящихся в данных шрифта.
+
+Каждый глиф размещается внутри кэша в соответствии с базовой линией шрифта, что позволяет шейдеру вычислять локальные текстурные координаты глифа в соответствующей ячейке кэша. Это означает, что вы можете добиться определенных текстовых эффектов, таких как градиенты или наложение текстуры, динамически. Движок передает показатели кэша шейдеру через специальную шейдерную константу `texture_size_recip`, которая содержит следующую информацию как векторные компоненты:
+
+* `texture_size_recip.x` --- обратная ширина кэша
+* `texture_size_recip.y` --- обратная высота кэша
+* `texture_size_recip.z` --- отношение ширины ячейки кэша к ширине кэша
+* `texture_size_recip.w` --- отношение высоты ячейки кэша к высоте кэша
+
+Например, чтобы сгенерировать градиент в фрагментном шейдере, достаточно написать:
+
+`float horizontal_gradient = fract(var_texcoord0.y / texture_size_recip.w);`
+
+Подробнее об унифицированных шейдерных переменных см. В [руководстве по шейдерам](/manuals/shader).

+ 27 - 27
docs/ru/manuals/glossary.md

@@ -9,23 +9,23 @@ brief: В этом руководстве с кратким описанием 
 
 ## Набор анимации (Animation Set)
 
-![Animation Set](images/icons/animationset.png){.left} Набор анимации - это ресурс, содержащий список ``.dae``-файлов или других ``.animationset``-файлов, из которых можно считывать анимацию. Вложение одного ``.animationset``-файла в другой удобно при использовании частичных наборов анимации совместно между несколькими моделями. За подробностями обращайтесь к [руководству по 3D-графике](/manuals/graphics/).
+![Animation Set](images/icons/animationset.png){.left} Набор анимации --- это ресурс, содержащий список ``.dae``-файлов или других ``.animationset``-файлов, из которых можно считывать анимацию. Вложение одного ``.animationset``-файла в другой удобно при использовании частичных наборов анимации совместно между несколькими моделями. За подробностями обращайтесь к [руководству по 3D-графике](/manuals/graphics/).
 
 ## Атлас (Atlas)
 
-![Atlas](images/icons/atlas.png){.left} Атлас - это ресурс, представляющий собой набор отдельных изображений, которые по причинам производительности и эффективности использования памяти формируются на одном большом холсте. Может содержать неподвижные изображения или мультипликации. В качестве общих графических ресурсов атласы используются компонентами GUI, спрайтами, Spine-моделями и частицами. За подробностями обращайтесь к [руководству по атласам](/manuals/atlas).
+![Atlas](images/icons/atlas.png){.left} Атлас --- это ресурс, представляющий собой набор отдельных изображений, которые по причинам производительности и эффективности использования памяти формируются на одном большом холсте. Может содержать неподвижные изображения или мультипликации. В качестве общих графических ресурсов атласы используются компонентами GUI, спрайтами, Spine-моделями и частицами. За подробностями обращайтесь к [руководству по атласам](/manuals/atlas).
 
 ## Встроенные ресурсы (папка ``builtins``)
 
-![Builtins](images/icons/builtins.png){.left} Проектная папка ``builtins`` - это папка с атрибутом "только для чтения", содержащая полезные ресурсы, доступные по умолчанию. Здесь можно найти стандартныу рендер, рендер-скрипт, материалы и многое другое. Если требуются пользовательские изменения в любом из этих ресурсов, просто скопируйте их в свой проект и отредактируйте на свое усмотрение.
+![Builtins](images/icons/builtins.png){.left} Проектная папка ``builtins`` --- это папка с атрибутом "только для чтения", содержащая полезные ресурсы, доступные по умолчанию. Здесь можно найти стандартный рендер, рендер-скрипт, материалы и многое другое. Если требуются пользовательские изменения в любом из этих ресурсов, просто скопируйте их в свой проект и отредактируйте на свое усмотрение.
 
 ## Камера (Camera)
 
-![Camera](images/icons/camera.png){.left} Камера - это компонент, помогающий определить, какая часть игрового пространства должна быть видимой и как она должна быть спроецирована. Обычно используется для прикрепления камеры к объекту игрового персонажа или для создания отдельного игрового объекта с камерой, который следует за игроком с каким-либо алгоритмом стабилизации движения. За подробностями обращайтесь к [руководству по камерам](/manuals/camera).
+![Camera](images/icons/camera.png){.left} Камера --- это компонент, помогающий определить, какая часть игрового пространства должна быть видимой и как она должна быть спроецирована. Обычно используется для прикрепления камеры к объекту игрового персонажа или для создания отдельного игрового объекта с камерой, который следует за игроком с каким-либо алгоритмом стабилизации движения. За подробностями обращайтесь к [руководству по камерам](/manuals/camera).
 
 ## Объект столкновения (Collision Object)
 
-![Collision Object](images/icons/collision-object.png){.left} Объекты столкновения - это компоненты, расширяющие игровые объекты физическими свойствами (такими как пространственная форма, вес, трение и реституция). Эти свойства определяют, как объект столкновения должен сталкиваться с другими объектами столкновения. Наиболее распространенными типами объектов столкновения являются кинематические объекты, динамические объекты и триггеры. Кинематический объект предоставляет подробную информацию о столкновении, на которое необходимо ответить вручную. Динамический объект автоматически моделируется физическим движком, подчиняясь ньютоновским законам физики. Триггеры - это простые формы, которые определяют, вошли ли другие формы в триггер или вышли из него. За подробностями обращайтесь к [руководству по физике](/manuals/physics).
+![Collision Object](images/icons/collision-object.png){.left} Объекты столкновения --- это компоненты, расширяющие игровые объекты физическими свойствами (такими как пространственная форма, вес, трение и реституция). Эти свойства определяют, как объект столкновения должен сталкиваться с другими объектами столкновения. Наиболее распространенными типами объектов столкновения являются кинематические объекты, динамические объекты и триггеры. Кинематический объект предоставляет подробную информацию о столкновении, на которое необходимо ответить вручную. Динамический объект автоматически моделируется физическим движком, подчиняясь ньютоновским законам физики. Триггеры --- это простые формы, которые определяют, вошли ли другие формы в триггер или вышли из него. За подробностями обращайтесь к [руководству по физике](/manuals/physics).
 
 ## Компоненты
 
@@ -33,7 +33,7 @@ brief: В этом руководстве с кратким описанием 
 
 ## Коллекция (Collection)
 
-![Collection](images/icons/collection.png){.left} Коллекция - это механизм Defold для создания шаблонов (что в других движках называется "префабами"), в которых иерархии игровых объектов могут быть использованы повторно. Коллекции - это древовидные структуры, в которых хранятся игровые объекты и другие коллекции. Коллекция всегда хранится в файле и вносится в игру либо статически, вручную средствами редактора, либо динамически, посредством порождения. Описание коллекций см. в  [руководстве по структурным элементам](/manuals/building-blocks).
+![Collection](images/icons/collection.png){.left} Коллекция --- это механизм Defold для создания шаблонов (что в других движках называется "префабами"), в которых иерархии игровых объектов могут быть использованы повторно. Коллекции --- это древовидные структуры, в которых хранятся игровые объекты и другие коллекции. Коллекция всегда хранится в файле и вносится в игру либо статически, вручную средствами редактора, либо динамически, посредством порождения. Описание коллекций см. в  [руководстве по структурным элементам](/manuals/building-blocks).
 
 ## Фабрика коллекций (Collection Factory)
 
@@ -41,19 +41,19 @@ brief: В этом руководстве с кратким описанием 
 
 ## Прокси-коллекция (Collection Proxy)
 
-![Collection](images/icons/collection.png){.left} Прокси-коллекция - это компонент, используемый для загрузки и включения коллекций на лету во время работы приложения или игры. Наиболее распространенным вариантом использования прокси-коллекции является загрузка уровней по мере их воспроизведения. За подробностями обращайтесь к [руководству по прокси-коллекциям](/manuals/collection-proxy).
+![Collection](images/icons/collection.png){.left} Прокси-коллекция --- это компонент, используемый для загрузки и включения коллекций на лету во время работы приложения или игры. Наиболее распространенным вариантом использования прокси-коллекции является загрузка уровней по мере их воспроизведения. За подробностями обращайтесь к [руководству по прокси-коллекциям](/manuals/collection-proxy).
 
 ## Кубическая карта (Cubemap)
 
-![Cubemap](images/icons/cubemap.png){.left} Кубическая карта - это ресурс, представляющий собой особый тип текстуры, состоящий из 6 отдельных частей, отображаемых по аналогии со сторонами куба. Часто используется при рендеринге скайбоксов и различных видов карт отражения и освещения.
+![Cubemap](images/icons/cubemap.png){.left} Кубическая карта --- это ресурс, представляющий собой особый тип текстуры, состоящий из 6 отдельных частей, отображаемых по аналогии со сторонами куба. Часто используется при рендеринге скайбоксов и различных видов карт отражения и освещения.
 
 ## Отладка (Debugging)
 
-В какой-то момент ваша игра будет вести себя непредсказуемо, и придется выяснять, в чем заключается проблема. Научиться отлаживать - это искусство, и, к счастью, Defold поставляется со встроенным отладчиком, который поможет вам в этом. За подробностями обращайтесь к [руководству по отладке](/manuals/debugging).
+В какой-то момент ваша игра будет вести себя непредсказуемо, и придется выяснять, в чем заключается проблема. Научиться отлаживать --- это искусство, и, к счастью, Defold поставляется со встроенным отладчиком, который поможет вам в этом. За подробностями обращайтесь к [руководству по отладке](/manuals/debugging).
 
 ## Профили отображения (Display Profiles)
 
-![Display profiles](images/icons/display-profiles.png){.left} Профили отображения - это ресурс, используемый для определения компоновки графического интерфейса в зависимости от ориентации, соотношения сторон или модели устройства. Он помогает адаптировать пользовательский интерфейс для любого типа устройств. За подробностями обращайтесь к [руководству по компоновкам](/manuals/gui-layouts).
+![Display profiles](images/icons/display-profiles.png){.left} Профили отображения --- это ресурс, используемый для определения компоновки графического интерфейса в зависимости от ориентации, соотношения сторон или модели устройства. Он помогает адаптировать пользовательский интерфейс для любого типа устройств. За подробностями обращайтесь к [руководству по компоновкам](/manuals/gui-layouts).
 
 ## Фабрика (Factory)
 
@@ -61,7 +61,7 @@ brief: В этом руководстве с кратким описанием 
 
 ## Шрифт (Font)
 
-![Font file](images/icons/font.png){.left} Шрифт - это ресурс, который создается из файла шрифтов TrueType или OpenType. Шрифт определяет, какой размер и какой тип оформления (контур и тень) должен быть у визуализируемого шрифта. Шрифт используется компонентами GUI и Label. За подробностями обращайтесь к [руководству по файлам шрифтов](/manuals/font/).
+![Font file](images/icons/font.png){.left} Шрифт --- это ресурс, который создается из файла шрифтов TrueType или OpenType. Шрифт определяет, какой размер и какой тип оформления (контур и тень) должен быть у визуализируемого шрифта. Шрифт используется компонентами GUI и Label. За подробностями обращайтесь к [руководству по файлам шрифтов](/manuals/font/).
 
 ## Фрагментный шейдер (Fragment Program)
 
@@ -69,15 +69,15 @@ brief: В этом руководстве с кратким описанием 
 
 ## Геймпады (Gamepads)
 
-![Gamepads](images/icons/gamepad.png){.left} Геймпады - это файл ресурса, определяющий, как конкретный ввод устройства геймпада соотносится с триггерами ввода геймпада на определенной платформе. За подробностями обращайтесь к [руководству по вводу](/manuals/input).
+![Gamepads](images/icons/gamepad.png){.left} Геймпады --- это файл ресурса, определяющий, как конкретный ввод устройства геймпада соотносится с триггерами ввода геймпада на определенной платформе. За подробностями обращайтесь к [руководству по вводу](/manuals/input).
 
 ## Игровой объект (Game Object)
 
-![Game object](images/icons/game-object.png){.left} Игровые объекты - это простые объекты, которые имеют свою отдельную продолжительность жизни во время выполнения игры. Игровые объекты - это контейнеры, которые обычно оснащены визуальными или звуковыми компонентами, такими как звук или спрайт. Они также могут быть оснащены поведением через компоненты Script. Игровые объекты создаются и помещаются в коллекции средствами редактора, либо динамически порождаются во время выполнения приложения посредством фабрик. Описание игровых объектов см. в [руководстве по блокам построения](/manuals/building-blocks).
+![Game object](images/icons/game-object.png){.left} Игровые объекты --- это простые объекты, которые имеют свою отдельную продолжительность жизни во время выполнения игры. Игровые объекты --- это контейнеры, которые обычно оснащены визуальными или звуковыми компонентами, такими как звук или спрайт. Они также могут быть оснащены поведением через компоненты Script. Игровые объекты создаются и помещаются в коллекции средствами редактора, либо динамически порождаются во время выполнения приложения посредством фабрик. Описание игровых объектов см. в [руководстве по блокам построения](/manuals/building-blocks).
 
 ## Графический пользовательский интерфейс (GUI)
 
-![GUI component](images/icons/gui.png){.left} GUI - это компонент, содержащий элементы, используемые для построения пользовательских интерфейсов: текстовые и закрашенные и/или текстурированные блоки. Элементы могут быть организованы в иерархические структуры, заскриптованы и анимированны. Компоненты GUI обычно используются для создания HUD, систем меню и экранных уведомлений. Управляются с помощью GUI-скриптов, которые определяют поведение графического интерфейса и контролируют взаимодействие с пользователем. За подробностями обращайтесь к [руководству по GUI](/manuals/gui).
+![GUI component](images/icons/gui.png){.left} GUI --- это компонент, содержащий элементы, используемые для построения пользовательских интерфейсов: текстовые и закрашенные и/или текстурированные блоки. Элементы могут быть организованы в иерархические структуры, заскриптованы и анимированны. Компоненты GUI обычно используются для создания HUD, систем меню и экранных уведомлений. Управляются с помощью GUI-скриптов, которые определяют поведение графического интерфейса и контролируют взаимодействие с пользователем. За подробностями обращайтесь к [руководству по GUI](/manuals/gui).
 
 ## GUI-скрипт (GUI Script)
 
@@ -93,7 +93,7 @@ brief: В этом руководстве с кратким описанием 
 
 ## Текстовая метка (Label)
 
-![Label](images/icons/label.png){.left} Текстовая метка - это компонент, позволяющий прикрепить текстовое содержимое к любому игровому объекту. Он отображает фрагмент текста с определенным шрифтом на экране в пространстве игры. За подробностями обращайтесь к [руководству по меткам](/manuals/label).
+![Label](images/icons/label.png){.left} Текстовая метка --- это компонент, позволяющий прикрепить текстовое содержимое к любому игровому объекту. Он отображает фрагмент текста с определенным шрифтом на экране в пространстве игры. За подробностями обращайтесь к [руководству по меткам](/manuals/label).
 
 ## Библиотека
 
@@ -101,7 +101,7 @@ brief: В этом руководстве с кратким описанием 
 
 ## Язык Lua
 
-Язык программирования Lua используется в Defold для создания логики игры. Lua - это мощный, эффективный и компактный скриптовый язык. Он поддерживает процедурное, объектно-ориентированное, функциональное программирование, программирование на основе данных и описание данных. Подробнее о языке можно прочитать на официальной домашней странице Lua по адресу https://www.lua.org/ и в [руководстве Lua в Defold](/manuals/lua).
+Язык программирования Lua используется в Defold для создания логики игры. Lua --- это мощный, эффективный и компактный скриптовый язык. Он поддерживает процедурное, объектно-ориентированное, функциональное программирование, программирование на основе данных и описание данных. Подробнее о языке можно прочитать на официальной домашней странице Lua по адресу https://www.lua.org/ и в [руководстве Lua в Defold](/manuals/lua).
 
 ## Lua-модуль
 
@@ -121,7 +121,7 @@ brief: В этом руководстве с кратким описанием 
 msg.post("#weapon", "disable")
 ```
 
-Здесь `"#weapon"` - это адрес компонента спрайта текущего объекта. `"disable"` - это сообщение, на которое реагируют компоненты спрайта. См. [руководство по передачи сообщений](/manuals/message-passing) чтобы подробнее узнать как это работает.
+Здесь `"#weapon"` --- это адрес компонента спрайта текущего объекта. `"disable"` --- это сообщение, на которое реагируют компоненты спрайта. См. [руководство по передачи сообщений](/manuals/message-passing) чтобы подробнее узнать как это работает.
 
 ## Модель (Model)
 
@@ -141,40 +141,40 @@ msg.post("#weapon", "disable")
 
 ## Рендер-скрипт (Render Script)
 
-![Render script](images/icons/script.png){.left} Рендер-скрипт - это Lua-скрипт, который управляет выводом игры или приложения на экран. Существует рендер-скрипт по умолчанию, который охватывает большинство распространенных случаев, но также можно написать свой собственный, если требуются пользовательские модели освещения и других эффектов. За подробностями о процессе рендеринга обращайтесь к [руководству по рендеру](/manuals/render/), о том, как Lua-скрипты используются в Defold - к [руководству Lua в Defold](/manuals/lua).
+![Render script](images/icons/script.png){.left} Рендер-скрипт --- это Lua-скрипт, который управляет выводом игры или приложения на экран. Существует рендер-скрипт по умолчанию, который охватывает большинство распространенных случаев, но также можно написать свой собственный, если требуются пользовательские модели освещения и других эффектов. За подробностями о процессе рендеринга обращайтесь к [руководству по рендеру](/manuals/render/), о том, как Lua-скрипты используются в Defold --- к [руководству Lua в Defold](/manuals/lua).
 
 ## Скрипт (Script)
 
-![Script](images/icons/script.png){.left} Скрипт - это компонент, который содержит программу, определяющую поведение игрового объекта. С помощью скриптов можно указать правила игры, реакцию объекта на различные взаимодействия (как с игроком, так и с другими объектами). Все сценарии написаны на языке программирования Lua. Чтобы иметь возможность работать с Defold, вы или кто-то из вашей команды должны научиться программировать на Lua. Для обзора Lua и подробностей о том, как Lua-скрипты используются в Defold обращайтесь к [руководству Lua в Defold](/manuals/lua).
+![Script](images/icons/script.png){.left} Скрипт --- это компонент, который содержит программу, определяющую поведение игрового объекта. С помощью скриптов можно указать правила игры, реакцию объекта на различные взаимодействия (как с игроком, так и с другими объектами). Все сценарии написаны на языке программирования Lua. Чтобы иметь возможность работать с Defold, вы или кто-то из вашей команды должны научиться программировать на Lua. Для обзора Lua и подробностей о том, как Lua-скрипты используются в Defold обращайтесь к [руководству Lua в Defold](/manuals/lua).
 
 ## Звук (Sound)
 
-![Sound](images/icons/sound.png){.left} Звук - это компонент, отвечающий за воспроизведение определенного звука. В настоящее время Defold поддерживает звуковые файлы в форматах WAV и Ogg Vorbis. За подробностями обращайтесь к [руководству по звукам](/manuals/sound).
+![Sound](images/icons/sound.png){.left} Звук --- это компонент, отвечающий за воспроизведение определенного звука. В настоящее время Defold поддерживает звуковые файлы в форматах WAV и Ogg Vorbis. За подробностями обращайтесь к [руководству по звукам](/manuals/sound).
 
 ## Spine-модель (Spine Model)
 
-![Spine model](images/icons/spine-model.png){.left} Spine-модель - это компонент, используемый для оживления скелетной Spine-анимации в Defold. За информацией о том, как его использовать, обращайтесь к [руководству по Spine-моделям](/manuals/spinemodel).
+![Spine model](images/icons/spine-model.png){.left} Spine-модель --- это компонент, используемый для оживления скелетной Spine-анимации в Defold. За информацией о том, как его использовать, обращайтесь к [руководству по Spine-моделям](/manuals/spinemodel).
 
 ## Spine-сцена (Spine Scene)
 
-![Spine scene](images/icons/spine-scene.png){.left} Spine-сцена - это ресурс, связывающий файл данных Spine JSON и файл атласа изображения Defold, используемого для заполнения графикой слотов костей. [Руководство по Spine-анимации](/manuals/spine) содержит более подробную информацию.
+![Spine scene](images/icons/spine-scene.png){.left} Spine-сцена --- это ресурс, связывающий файл данных Spine JSON и файл атласа изображения Defold, используемого для заполнения графикой слотов костей. [Руководство по Spine-анимации](/manuals/spine) содержит более подробную информацию.
 
 ## Спрайт (Sprite)
 
-![Sprite](images/icons/sprite.png){.left} Спрайт - это компонент, расширяющий игровые объекты графикой. Он отображает изображение либо из тайлового источника, либо из атласа. Спрайты имеют встроенную поддержку флипбук и костевой анимации. Обычно используются для персонажей и предметов.
+![Sprite](images/icons/sprite.png){.left} Спрайт --- это компонент, расширяющий игровые объекты графикой. Он отображает изображение либо из тайлового источника, либо из атласа. Спрайты имеют встроенную поддержку мультипликаций и костевой анимации. Обычно используются для персонажей и предметов.
 
 ## Текстурные профили (Texture Profiles)
 
-![Texture profiles](images/icons/texture-profiles.png){.left} Текстурные профили - это ресурс, используемый в процессе пакетирования для автоматической обработки и сжатия данных изображения (в атласах, тайловых источниках, кубических картах и автономных текстурах, используемых для моделей, GUI и т. д.). За подробностями обращайтесь к [руководству по текстурным профилям](/manuals/texture-profiles).
+![Texture profiles](images/icons/texture-profiles.png){.left} Текстурные профили --- это ресурс, используемый в процессе пакетирования для автоматической обработки и сжатия данных изображения (в атласах, тайловых источниках, кубических картах и автономных текстурах, используемых для моделей, GUI и т.д.). За подробностями обращайтесь к [руководству по текстурным профилям](/manuals/texture-profiles).
 
 ## Тайловая карта (Tile Map)
 
-![Tile map](images/icons/tilemap.png){.left} Тайловые карты - это компонены, отображающие изображения из тайловых источников на одной или нескольких перекрывающихся сетках. Они чаще всего используются для создания игровых сред: земли, стен, зданий и препятствий. Тайловая карта может отображать несколько слоев, выровненных друг над другом с заданным режимом смешивания. Это полезно, например, для нанесения листьев поверх травяных фоновых тайлов. Также можно динамически изменять отображаемое изображение в тайле. Это позволяет, например, разрушить мост и сделать его непроходимым, просто заменив один тайл на другой, изображающий разрушенный мост и содержащий соответствующую физическую форму. За подробностями обращайтесь к [руководству по тайловым картам](/manuals/tilemap).
+![Tile map](images/icons/tilemap.png){.left} Тайловые карты --- это компоненты, отображающие изображения из тайловых источников на одной или нескольких перекрывающихся сетках. Они чаще всего используются для создания игровых сред: земли, стен, зданий и препятствий. Тайловая карта может отображать несколько слоев, выровненных друг над другом с заданным режимом смешивания. Это полезно, например, для нанесения листьев поверх травяных фоновых тайлов. Также можно динамически изменять отображаемое изображение в тайле. Это позволяет, например, разрушить мост и сделать его непроходимым, просто заменив один тайл на другой, изображающий разрушенный мост и содержащий соответствующую физическую форму. За подробностями обращайтесь к [руководству по тайловым картам](/manuals/tilemap).
 
 ## Тайловый источник (Tile Source)
 
-![Tile source](images/icons/tilesource.png){.left} Тайловый источник описывает текстуру, состоящую из нескольких уменьшенных изображений, каждое из которых имеет одинаковый размер. Можно определить флипбук-анимацию из последовательности изображений в тайловом источнике. Тайловые источники также могут автоматически вычислять формы столкновений из данных изображений. Это очень полезно при создания плиточных уровней, с которыми могут сталкиваться и взаимодействовать объекты. Тайловые источники используются тайловыми картами (а также спрайтами и частицами) для совместного использования графических ресурсов. Стоит заметить, что атлас часто подходит лучше, чем тайловый источник. За подробностями обращайтесь к [руководству по тайловым источникам](/manuals/tilemap).
+![Tile source](images/icons/tilesource.png){.left} Тайловый источник описывает текстуру, состоящую из нескольких уменьшенных изображений, каждое из которых имеет одинаковый размер. Можно определить мультипликацию из последовательности изображений в тайловом источнике. Тайловые источники также могут автоматически вычислять формы столкновений из данных изображений. Это очень полезно при создания плиточных уровней, с которыми могут сталкиваться и взаимодействовать объекты. Тайловые источники используются тайловыми картами (а также спрайтами и частицами) для совместного использования графических ресурсов. Стоит заметить, что атлас часто подходит лучше, чем тайловый источник. За подробностями обращайтесь к [руководству по тайловым источникам](/manuals/tilemap).
 
 ## Вертексный шейдер (Vertex Program)
 
-![Vertex shader](images/icons/vertex-shader.png){.left} Вертексный шейдер вычисляет экранную геометрию примитивных полигональных форм компонента. Для любого типа визуального компонента, будь то спрайт, Spine-модель или модель, форма представлена набором позиций полигональных вершин. Вертексный шейдер обрабатывает каждую вершину (в мировом пространстве) и вычисляет результирующую координату, которую должна иметь каждая вершина примитива. За подробностями обращайтесь к [руководству по шейдерам](/manuals/shader).
+![Vertex shader](images/icons/vertex-shader.png){.left} Вертексный шейдер вычисляет экранную геометрию примитивных полигональных форм компонента. Для любого типа визуального компонента, будь то спрайт, Spine-модель или модель, форма представлена набором позиций полигональных вершин. Вертексный шейдер обрабатывает каждую вершину (в мировом пространстве) и вычисляет результирующую координату, которую должна иметь каждая вершина примитива. За подробностями обращайтесь к [руководству по шейдерам](/manuals/shader).

BIN
docs/ru/manuals/images/animation/animsheet.png


BIN
docs/ru/manuals/images/animation/blender_animation.png


BIN
docs/ru/manuals/images/animation/[email protected]


BIN
docs/ru/manuals/images/animation/bounce.gif


BIN
docs/ru/manuals/images/animation/custom_curve.png


BIN
docs/ru/manuals/images/animation/frog_runloop.gif


BIN
docs/ru/manuals/images/animation/model_hierarchy.png


BIN
docs/ru/manuals/images/animation/property_animation.png


BIN
docs/ru/manuals/images/animation/[email protected]


BIN
docs/ru/manuals/images/animation/runloop.gif


BIN
docs/ru/manuals/images/animation/spine_animation.png


BIN
docs/ru/manuals/images/animation/spine_bones.png


BIN
docs/ru/manuals/images/animation/[email protected]


BIN
docs/ru/manuals/images/animation/spine_events.png


BIN
docs/ru/manuals/images/animation/spine_ingame.png


BIN
docs/ru/manuals/images/animation/[email protected]


BIN
docs/ru/manuals/images/animation/square_curve.png


BIN
docs/ru/manuals/images/animation/suzanne.gif


BIN
docs/ru/manuals/images/animation/wiggle.gif


BIN
docs/ru/manuals/images/camera/create.png


BIN
docs/ru/manuals/images/camera/[email protected]


BIN
docs/ru/manuals/images/camera/follow.png


BIN
docs/ru/manuals/images/camera/projections.png


BIN
docs/ru/manuals/images/camera/[email protected]


BIN
docs/ru/manuals/images/camera/settings.png


BIN
docs/ru/manuals/images/camera/[email protected]


BIN
docs/ru/manuals/images/collection-proxy/bootstrap.png


BIN
docs/ru/manuals/images/collection-proxy/[email protected]


BIN
docs/ru/manuals/images/collection-proxy/collection_id.png


BIN
docs/ru/manuals/images/collection-proxy/[email protected]


BIN
docs/ru/manuals/images/collection-proxy/create_proxy.png


BIN
docs/ru/manuals/images/collection-proxy/[email protected]


BIN
docs/ru/manuals/images/collection-proxy/message_passing.png


BIN
docs/ru/manuals/images/collection-proxy/[email protected]


BIN
docs/ru/manuals/images/collection-proxy/proxy_load.png


BIN
docs/ru/manuals/images/collection-proxy/[email protected]


BIN
docs/ru/manuals/images/collection_factory/collection.png


BIN
docs/ru/manuals/images/collection_factory/collection_factory_collection.png


BIN
docs/ru/manuals/images/collection_factory/collection_factory_factory.png


BIN
docs/ru/manuals/images/collection_factory/collection_factory_game.png


BIN
docs/ru/manuals/images/collection_factory/factory.png


BIN
docs/ru/manuals/images/collection_factory/load_dynamically.png


BIN
docs/ru/manuals/images/factory/factory_collection.png


BIN
docs/ru/manuals/images/factory/factory_component.png


BIN
docs/ru/manuals/images/factory/factory_max_instances.png


BIN
docs/ru/manuals/images/factory/factory_spawned.png


BIN
docs/ru/manuals/images/factory/factory_spawned2.png


BIN
docs/ru/manuals/images/factory/factory_uniform_scaling.png


BIN
docs/ru/manuals/images/factory/load_dynamically.png


BIN
docs/ru/manuals/images/font/bm_font.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/df_artifacts.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/df_font.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/new_font.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/new_font_name.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/scale_down.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/font/scale_up.png


BIN
docs/ru/manuals/images/font/[email protected]


BIN
docs/ru/manuals/images/label/add_label.png


BIN
docs/ru/manuals/images/label/[email protected]


BIN
docs/ru/manuals/images/label/align.png


BIN
docs/ru/manuals/images/label/[email protected]


BIN
docs/ru/manuals/images/label/font_material.png


BIN
docs/ru/manuals/images/label/[email protected]


BIN
docs/ru/manuals/images/label/label.png


BIN
docs/ru/manuals/images/label/[email protected]


BIN
docs/ru/manuals/images/mesh/mesh.png


BIN
docs/ru/manuals/images/mesh/[email protected]


BIN
docs/ru/manuals/images/particlefx/acceleration.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/add_modifier.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/add_modifier_select.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/curve_editor.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/default.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/drag.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


BIN
docs/ru/manuals/images/particlefx/editor.png


BIN
docs/ru/manuals/images/particlefx/[email protected]


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio