Анимации — различия между версиями

Строка 1: Строка 1:
 +
<div class="mw-parser-output">
 +
InnerCore, в отличии от его предшественника CoreEngine, имеет встроенную поддержку анимаций. Это значит, что для того, чтобы в мире появилась какая-то моделька, не нужно создавать моба. Достаточно создать лишь простейшую анимацию. Всего существует три вида анимаций - базовые анимации, анимации предметов и анимации текста. Давайте рассмотрим их возможности подробнее:
  
В Core Engine возможно создавать анимации текста, моделей, предметов в мире.
+
= Базовые анимации =
  
&nbsp;
+
== Статичные анимации ==
  
=== Базовая анимация ===
+
Для создания базовой анимации используется класс Animation.Base, который создает новую анимацию на координатах x, y, z:
 +
<syntaxhighlight lang="Javascript">var animation = new Animation.Base(x, y, z);</syntaxhighlight>
  
&nbsp;
+
Чтобы отобразить нашу модельку без анимации в мире, достаточно задать рендер анимации и загрузить её:
 +
<syntaxhighlight lang="Javascript">animation.describe({render: render.getId()});
 +
animation.load();</syntaxhighlight>
  
Рассмотрим базовый тип анимации.
+
Стоит отметить, что render может принимать любое значение нативного рендера, как кастомного (''render.getId()''), так и [[InnerCore/Список_ванильных_рендеров|ванильного]].
  
&nbsp;
+
== Динамичные анимации ==
  
Создать ее можно так:
+
Для создания динамичных анимаций используется функция&nbsp;''loadCustom(callable)''. В качестве параметра эта функция принимает лишь функцию, в которой мы и будем производить наши изменения в модели. Чтобы изменить рендер, достаточно лишь изменить его объект ''Render ''и вызвать метод ''refresh()''. Для изменения расположения будем использовать функцию ''setPos(x, y, z)'', которая устанавливает новые координаты объекта в мире. Поскольку часто возникает необходимость изменить координаты относительно текущих, текущие будем получать из объекта ''coords''. '''Внимание!''' Не изменяйте объект ''coords'', это не изменит реальное расположение анимации в мире!
  
&nbsp;
+
И, конечно же, пример:
<pre>var ani = new Animation.Base(x, y, z);
+
<syntaxhighlight lang="Javascript">animation.loadCustom(function(){
 +
    this.setPos(this.coords.x + 0.5, this.coords.y, this.coords.z - 0.5);
 +
    this.refresh();  
 +
});</syntaxhighlight>
  
//x, y, z - координаты</pre>
+
Замечу, что '''''this'''''внутри функции обновления анимации будет указывать на саму анимацию, что и используется в этом примере.&nbsp;
  
&nbsp;
+
== Прочие переменные и методы объекта Animation.Base ==
  
Однако просто анимация без настроек просто бессмыслена. Да и менять анимацию потом очень проблематично.
+
*''load()'' - создает анимацию в игре
 +
*''loadCustom(callable)'' - создает динамичную анимацию в игре, используя функцию callable для изменения рендера и положения.&nbsp;
 +
*''setPos(x, y, z)'' - устанавливает положение анимации в мире.
 +
*''coords ''- получает координаты анимации в мире.
 +
*''getAge()'' - возвращает 0. Вдруг кому пригодится.&nbsp;
 +
*''refresh() ''- обновляет объект рендера анимации.
 +
*''destroy()'' - уничтожает анимацию в мире.  
 +
*''describe(description)'' - задает настройки для анимации в следующем формате:
 +
<syntaxhighlight lang="Javascript">{
 +
    render: render,
 +
   skin: skin,
 +
   scale: scale
 +
}</syntaxhighlight>
  
&nbsp;
+
При этом параметры skin и scale считаются устаревшими, поскольку являются частью объекта рендера, а не самой анимации. Их использовать не следует.&nbsp;
  
Создадим обновляемый обьект и анимацию внутри него:
+
= Анимации предметов =
<pre>//Создаем обьект
 
 
 
var ani_upd = {
 
 
 
    //Задаем его координаты
 
 
 
    x: 0,
 
 
 
    y: 0,
 
 
 
    z: 0,
 
 
 
    //Обьект анимации
 
 
 
    ani: {},
 
 
 
    //Флажок инициализации
 
 
 
    init: false,
 
 
 
    //Функция инициализации анимации
 
 
 
    init_animation: function(){
 
 
 
          //Создаем анимацию
 
 
 
          this.ani = new Animation.Base(this.x, this.y, this.z);
 
 
 
       
 
 
 
    },
 
 
 
    //Функция обновления анимации
 
 
 
    update_animation: function(){
 
 
 
          //Устанавливаем позицию анимации
 
 
 
          this.ani.setPos(this.x, this.y, this.z);
 
 
 
    },
 
 
 
    //Обновление
 
 
 
    update: function(){
 
 
 
          //Если анимация не инициализирована
 
 
 
          if (!this.init){
 
 
 
              //Инициализировать
 
 
 
              this.init_animation();
 
 
 
              //Поднять флажок инициализации
 
 
 
              this.init = true;
 
 
 
          }
 
 
 
          //Иначе
 
 
 
          else{
 
 
 
              //Обновляем анимацию
 
 
 
              this.update_animation();
 
 
 
          }
 
 
 
          //Обновляем позицию анимации
 
 
 
          this.x = Player.getPosition().x;
 
 
 
          this.y = Player.getPosition().y+4;
 
 
 
          this.z = Player.getPosition().z;
 
 
 
    }
 
 
 
};
 
 
 
 
 
//При запуске в мир запускаем анимацию
 
 
 
Callback.addCallback("LevelLoaded", function(){
 
 
 
    Updatable.addUpdatable(ani_upd)
 
 
 
});</pre>
 
 
 
&nbsp;
 
 
 
Но в таком случае над вашей головой будет висеть кролик.
 
 
 
Чтобы настроить анимацию, нужно применить ее метод describe.
 
<pre>
 
 
 
{
 
 
 
 
 
 
init_animation: function(){
 
 
 
          //Создаем анимацию
 
 
 
          this.ani = new Animation.Base(this.x, this.y, this.z);
 
 
 
          //Настраиваем ее
 
 
 
          this.ani.describe({
 
 
 
              //Здесь могут находиться настройки анимации
 
 
 
              //Можно установить существующий рендер
 
 
 
              // (i) Перед тем, как написать этот код, запишите где-нибудь: var NativeEntityRenderType = ModAPI.requireGlobal("EntityRenderType"); Это позволит использовать рендеры из ModPE
 
 
 
              render: NativeEntityRenderType.pig,
 
 
 
              //А можно установить и свой собственный
 
 
 
              renderAPI: ваш обьект рендера,
 
 
 
              //Текстура анимации
 
 
 
              skin: "/mob/pig.png",
 
 
 
              //Остальные свойства ненужны
 
 
 
          });
 
 
 
          //Загружаем анимацию в мир
 
 
 
          this.ani.load();
 
 
 
    }
 
 
 
 
 
 
}</pre>
 
 
 
&nbsp;
 
 
 
Теперь мы можем использовать нашу анимацию и отображать ее в мире.
 
 
 
&nbsp;
 
 
 
=== Предметы ===
 
 
 
&nbsp;
 
  
 
Также можно создать изображение в мире предмета.
 
Также можно создать изображение в мире предмета.
 
+
<pre>var ani_item = new Animation.Item(x, y, z);
&nbsp;
+
</pre>
<pre>var ani_item = new Animation.Item(x, y, z);</pre>
 
 
 
&nbsp;
 
  
 
В остальном эта анимация похожа на обычную, только настраивается она методом animation.describeItem
 
В остальном эта анимация похожа на обычную, только настраивается она методом animation.describeItem
<pre>
+
<pre>ani_item.describeItem({
 
 
ani_item.describeItem({
 
  
 
     //Настраиваем характеристики отоюражаемого предмета
 
     //Настраиваем характеристики отоюражаемого предмета
Строка 212: Строка 76:
 
     notRandomize: true
 
     notRandomize: true
  
});</pre>
+
});
 +
</pre>
  
&nbsp;
+
= Текстовые анимации =
 
 
=== Текст ===
 
 
 
&nbsp;
 
  
 
Также в мире можно отображать в мире текст:
 
Также в мире можно отображать в мире текст:
 
&nbsp;
 
 
<pre>var ani_txt = new Animation.Text(x, y, z);
 
<pre>var ani_txt = new Animation.Text(x, y, z);
  
Строка 228: Строка 87:
  
 
ani_txt.setText(text);</pre>
 
ani_txt.setText(text);</pre>
 +
</div>

Версия 01:18, 25 сентября 2018

InnerCore, в отличии от его предшественника CoreEngine, имеет встроенную поддержку анимаций. Это значит, что для того, чтобы в мире появилась какая-то моделька, не нужно создавать моба. Достаточно создать лишь простейшую анимацию. Всего существует три вида анимаций - базовые анимации, анимации предметов и анимации текста. Давайте рассмотрим их возможности подробнее:

Базовые анимации

Статичные анимации

Для создания базовой анимации используется класс Animation.Base, который создает новую анимацию на координатах x, y, z:

var animation = new Animation.Base(x, y, z);

Чтобы отобразить нашу модельку без анимации в мире, достаточно задать рендер анимации и загрузить её:

animation.describe({render: render.getId()});
animation.load();

Стоит отметить, что render может принимать любое значение нативного рендера, как кастомного (render.getId()), так и ванильного.

Динамичные анимации

Для создания динамичных анимаций используется функция loadCustom(callable). В качестве параметра эта функция принимает лишь функцию, в которой мы и будем производить наши изменения в модели. Чтобы изменить рендер, достаточно лишь изменить его объект Render и вызвать метод refresh(). Для изменения расположения будем использовать функцию setPos(x, y, z), которая устанавливает новые координаты объекта в мире. Поскольку часто возникает необходимость изменить координаты относительно текущих, текущие будем получать из объекта coords. Внимание! Не изменяйте объект coords, это не изменит реальное расположение анимации в мире!

И, конечно же, пример:

animation.loadCustom(function(){ 
    this.setPos(this.coords.x + 0.5, this.coords.y, this.coords.z - 0.5); 
    this.refresh(); 
});

Замечу, что thisвнутри функции обновления анимации будет указывать на саму анимацию, что и используется в этом примере. 

Прочие переменные и методы объекта Animation.Base

  • load() - создает анимацию в игре
  • loadCustom(callable) - создает динамичную анимацию в игре, используя функцию callable для изменения рендера и положения. 
  • setPos(x, y, z) - устанавливает положение анимации в мире.
  • coords - получает координаты анимации в мире.
  • getAge() - возвращает 0. Вдруг кому пригодится. 
  • refresh() - обновляет объект рендера анимации.
  • destroy() - уничтожает анимацию в мире.
  • describe(description) - задает настройки для анимации в следующем формате:
{
    render: render,
    skin: skin,
    scale: scale
}

При этом параметры skin и scale считаются устаревшими, поскольку являются частью объекта рендера, а не самой анимации. Их использовать не следует. 

Анимации предметов

Также можно создать изображение в мире предмета.

var ani_item = new Animation.Item(x, y, z);

В остальном эта анимация похожа на обычную, только настраивается она методом animation.describeItem

ani_item.describeItem({

     //Настраиваем характеристики отоюражаемого предмета

     id: 280,

     count: 1,

     data: 0,

     //Рендерим палку

     //Устанавливаем размер

     size: 1,

     //Устанавливаем выравнивание по оси x/y/z

     rotation: "x\y\z",

     //Убираем неровности, если отрисовывается несколько анимаций

     notRandomize: true

});

Текстовые анимации

Также в мире можно отображать в мире текст:

var ani_txt = new Animation.Text(x, y, z);

//Настроим отображаемый текст

ani_txt.setText(text);