Сейчас 01:31:18 Вторник, 5 ноября, 2024 год
Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я

Меню сайта

Категории

Наш опрос
Какой тип карт вам нравится больше всего?
Проголосовало: 145113

Сейчас на сайте
На сайте всего: 51
Гостей: 51
Пользователей: 0

Реклама

Главная » Статьи по WarCraft 3 » Создание карт » Триггеры
Динамические эффекты в GUI
Содержание
1. Введение
2. Таймеры
3. Первый динамический эффект - вращение
4. Отталкивание
5. Превращение статических эффектов в динамические
6. Полезные приёмы

1. Введение

Эта статья является логическим продолжением другой статьи, опубликованной ранее. Перед тем, как читать эту статью, прочтите сначала предыдущую. Я не хочу снова пересказывать её, так как это будет бессмысленно.
Итак, в этой статье мы продолжим изучение уже рассмотренных фигур (круг, линия и т.п.) и создадим несколько эффектов, но на сей раз уже динамических, то есть эффект не просто будет создаваться - мы изучим то, как перемещать юнитов по определённой траектории.

2. Таймеры

Перед тем, как мы перейдём к непосредственному изучению движения, я остановлю ваше внимание на одной важной детали: таймеры. Таймеры работают приблизительно как хронометры. У них есть "время истечения" (значение, задаваемое пользователем при создании таймера). Когда таймер запускается, то у него появляется "оставшееся время", которое является значением, начинающимся со значения "времени истечения", которое понижается, пока не достигнет нуля (значение времени типа Реальная). Самое используемое связанное с этим событие - Timer Expires. Оно выполняется, когда у определённого таймера "время истечения" достигает нуля.
Почему мы бы хотели использовать таймеры? Потому как когда мы двигаем боевую единицу мы должны иметь период ожидания между двумя сменами позиции. Этот период может быть несколько причудлив, всё зависит от глаз человека и их восприятия изображения на экране. Мы будем имитировать движение, относительно ненамного меняя позицию элемента (в данном случае, боевой единицы) каждый раз. Если период будет очень большой. то глаз заметит паузы и будет не очень красиво. А если ставить очень маленький период, то это дополнительная нагрузка на процессор. Именно поэтому важно найти компромиссный период.
Представляю ниже 5 анимаций при различном периоде таймера (0; 0.04; 0.07; 0.15; 0.27 - слева направо). Сами выбирайте, какой лучше, по вашему мнению.

Отсюда можно сразу вычленить негодные варианты. Период 0 выглядит настолько скачкообразно, что не стоит даже упоминать его. 0.15 уже медленно, а 0.27 уж вообще ни в какие ворота не лезет. Вы будете согласны, если значение где-то между 0.04 и 0.07 самое оптимальное. Ещё точнее говоря, я бы предпочёл 0.035 или даже 0.05. Всё зависит от типа эффекта, насколько быстро ваши войска двигаются и пр.
Так зачем всё же нам нужны таймеры? Как мы думаем, функция Wait может работать с периодами до 0.01. На самом деле это НЕ так. Я не случайно выбрал значение 0.27. Дело в том, что с функцией Wait проблема заключается именно в нём. Если это действие применить со значением менее, чем 0.27, оно поведёт себя так, как будто задан период 0.27. Blizzard задали этот лимит, что ж, возможно, у них были свои причины. Правда, нам эти причины сейчас неинтересны.
Из-за вышеуказанного лимита выход один - использовать таймеры. Триггерщикам можно использовать даже лучшее решение, которое заключается в прикреплении таймера к триггеру через событие Time - Every x seconds of game time. Можно ставить любой период, руководствуясь вышесказанным. С этим событием можно вызывать серию действий несколько раз. Встаёт вопрос - как же регулировать, когда действия выполнять, а когда нет? Всё очень просто - включать и выключать сам триггер с таким событием. Когда нужно выполнять действия, включайте триггер. Когда нужно насовсем его прекратить - уничтожьте.
Но и здесь свои лимиты. Используя этот метод, вы не получите MUI так просто. Вы не можете использовать одновременно тот или иной триггер сразу, разве что будете использовать систему индексации, но это отдельная тема и требует отдельной статьи.
3. Первый динамический эффект - вращение

Как я уже сказал ранее, простейшее движение - это вращение, если быть более точным, вращение объекта вокруг точки (или другого объекта). Я думаю, что вы уже достаточно знакомы с процессом создания статического эффекта, так что опущу объяснения на этот счёт. Я сфокусирую всё объяснение на процессе движения объекта. Я просто помещу его в переменную под названием Orbiting_Projectile. Теперь его движение всё равно, что создание круга, но в таймере. Давайте ознакомимся с процессом.

Очевидно, что если не объяснить, можно запутаться. На рисунке нет множества объектов. Есть один вращающийся вокруг точки Р объект. Все точки иллюстрируют разделённые позиции. Оранжевая линия показывает путь. Предельно ясно, что расстояния между центром и этими точками равные, всё, что меняется - угол. Красные точки идентичны оранжевым.

Примечание: В WarCraft III нет разницы между углами 390 и 30 градусов. Они представляются как один и тот же угол, поэтому о вычитании угла, который достиг больше 360 градусов, можно не беспокоиться. И ещё интересное примечание - функция Angle between points не возвращает значений, которые больше или равны 360.

Я напишу весь триггер, так как в нём несомненно есть кое-что новое и оно вполне имеет шанс показаться трудным для вас. Понадобится больше переменных (CENTER для центральной точки и Effe_Unit, куда мы с радостью отправим юнита, которого будем передвигать. Ниже даны два триггера, которые нужны для работоспособного движения. Обратите внимание - я не особо акцентировался на создании объекта и переменных. Это может меняться в различных ситуациях.

Code
Initial Trigger  
//Этот триггер начинает и заканчивает вращение
Actions - Turn On Movement Trigger  
  Wait for 5.00 seconds
  Turn Off Movement Trigger  

Movement Trigger (изначально выключен)  
//Этот триггер непосредственно двигает юнита, пока не выключится.
Events  
  Time - Every 0.04 seconds of game time  
Actions  
  Unit - Move Effe_Unit instantly to (CENTER offset by (Distance between CENTER and (Position of (Effe_Unit))) towards ((Angle from CENTER to (Position of (Effe_Unit))) + 5.00) degrees)


Можете изменять время ожидания в зависимости от того, сколько хотите вращать объект. Хотите прекратить вращение когда, к примеру, спелл заканчивает действие - выключите триггер.

Примечание 1: Понятно, что если нужно вращать объект вокруг другого объекта, то значение переменной CENTER надо поменять на (Position of (цель))/
Примечание 2: В зависимости от того, добавляете или вычитаете вы значение угла, вы можете задавать направление движение. Увеличение угла будет двигать объект против часовой стрелки (тригонометрически), а уменьшение - по часовой стрелке (анти-тригонометрически).

4. Отталкивание

Такой эффект не требует дополнительных объектов, но может быть использован для некоторых способностей (даже для эффектов, например, shockwave-типа). Это похоже на создание линии, но вместо создания нескольких юнитов нужно по таким же меркам изменять дистанцию между двумя боевыми единицами, оставляя угол постоянным. Чтобы изменить эффект, надо поступить так:
Code
Movement Trigger (изначально выключен)  
//Этот триггер непосредственно двигает юнита, пока не выключится.
Events  
  Time - Every 0.04 seconds of game time  
Actions
  Unit - Move Effe_Unit instantly to (CENTER offset by (Distance between CENTER and (Position of (Effe_Unit))+5.00) towards ((Angle from CENTER to (Position of (Effe_Unit)))) degrees)

Существует два способа его отключить. Первый - отключить, спустя время. В таком случае, надо подумать и математически вычислить финальное расстояние в зависимости от периода ожидания и увеличивать расстояние с каждым циклом таймера. Формула такая:
Период ожидания = Периодичность таймера * Конечная дистанция / Диапазон дистанции
Например, чтобы получить расстояние 800, применим формулу так:
Период ожидания = 800*0,04/5=6,4
Хмм, 6.4 несколько долго для расстояния 800. Понятно, что расстояние придётся увеличивать. Экспериментируйте со значениями и смотрите, что получится.
Другой способ - просто отключить триггер после достижения нужной дистанции.В этом случае результат всегда будет тот, который нужен.

5. Превращение статических эффектов в динамические

Возможно заставить статические объекты из первой части статьи двигаться. Но как только мы хотим это сделать, нам придётся изучить два типа динамических эффектов:

1. Channeling - эффекты, которые должны повторяться. Это могут быть эффекты, которые повторяются снова и снова пока, например, не закончится действие способности.
2. One-shot - эффекты, которые появляются и исчезают (пример - shockwave).

Важно понять, как оба типа эффектов работают. Тогда вы сможете выбрать и запрограммировать именно то, что хотите. Проблема только в планировании.

Кардинальное различие между этими типами эффектов - их путь. Channeling-эффекты будут иметь циклический путь, поэтому придётся поразмыслить над формулой. Точка старта должна стать и конечной точкой, неважно, насколько сложна сама траектория. Здесь всё то же самое. Допустим, наш эффект - это машина, которая двигается по определённому пути, пока способность не прекратит действовать. Главное в циклическом движении - центр. Любые эффекты такого типа его требуют, вне зависимости, опять же, от сложности их траектории.
Наглядный пример хорошего циклического эффекта - круг. Плохой пример - полулинейный путь (к примеру, виток спирали). Также можно превратить и путь линии в цикл, но тогда нужно двигать эффект вперёд и назад. Такое очень мало где используется.

Всё же, это не значит, что эффекты типа One-shot не имеют своего предназначения и поэтому бесполезны. Есть способности с мгновенным эффектом, который может быть один или же их может быть несколько. В некоторых случаях, юниты-ракеты могут быть созданы из множества эффектов возле применяющего. Иначе просто нужно двигать юнита-ракету от применяющего к цели. Эти эффекты важно знать.
Теперь мы вернёмся к эффекту спирали, который был представлен в предыдущей статье. Где-то есть способность, в которой создаётся динамическая спираль. Она должна создаваться из молний вокруг центра (применяющего) и распространяться вокруг него. Если вздумаете создать такой эффект множеством юнитов - одумайтесь сразу и используйте спецэффекты, которые вы создадите и уничтожите сразу. Большинство эффектов заканчивают свою анимацию перед исчезновением, поэтому ваша команда уничтожения объекта лишь даст сигнал, что ему больше не нужно будет отображаться.
Весь трюк здесь заключается в том, чтобы использовать таймер длительностью, равной интервалу между появлением двумя элементов спирали. Напоминаю, что спираль состоит из нескольких концентрических окружностей, которые различаются параметром, носящим название угол отклонения. Сложность в том, чтобы создать эти окружности одну после другой спустя короткие промежутки времени. Тогда будет выглядеть, что спираль создаётся изнутри наружу. Можете использовать и боевых единиц, но всегда убеждайтесь в том, что расстояние не слишком велико, что создаст секционную спираль и не слишком мало, чтобы не превратить её создание в статический эффект. Я не буду разжёвывать код - ваша задача состоит в том, чтобы его написать самим, руководствуясь вышесказанным. Скажем так, этим подтвердятся ваши умения.

1. Нужно записывать в переменную номер текущей концентрической окружности. Иначе вы не сможете вычислить в таймере, какой шаг является текущим. Не забывайте увеличивать его на 1 с каждым запуском таймера.
2. Используйте формулу из первой статьи для того, чтобы создать спираль. Но вместо цикла используется вышеизложенная переменная.
3. Не забудьте отключить таймер, когда надо.



Также хотелось бы вам посоветовать отличный сайт по тематике читы к играм. Если вам когда-нибудь понадобятся читы для игр, то можете смело заходить на этот сайт и искать то, что вам нужно. Я уверен, необходимый чит вы себе найдете :)



6. Полезные приёмы

1. Отряды очень полезны для динамических эффектов. Массивы менее хороши, когда речь о манипуляции многими боевыми единицами, чтобы изменять их позиции. Отряды созданы специально для этой цели.
2. MUI. Эта проблема больше не может быть решена локальными переменными, так как группу и значения надо переносить в другой триггер, а локальные переменные действуют в пределах одного триггера. Но имейте в виду, что имеете дело именно с таймером.

На этом статья окончена. Спасибо за то, что прочли её.
Просмотров: 4692 Добавил: Duosora Добавлено: 23 Января 2012 в 23:28:27
Комментариев: 7 |

Всего комментариев: 7
06 Апреля 2013
формула на фигуру в изображении: http://img.photobucket.com/albums/v507/Daelin17/CyclicShapes.gif
x = x + (R-R(CosASinA))CosA
y = y + (R-R(CosASinA))SinA
ничего тут заумного

25 Января 2013
6. mr. Аноним (Facering) [Материал]
Норм, но нужно по больше статейку сделать)

23 Ноября 2012
5. Дмитрий (k0t1x) [Материал]
Класс! + в репу :) :) ;)

16 Августа 2012
4. Сергей Кузнецов (Nerobrine) [Материал]
Круто, всегда хотел научиться делать подобное

03 Апреля 2012
3. Евгений (Евгений95) [Материал]
Полезно

28 Февраля 2012
2. Артем (Zzepish) [Материал]
Круто! И полезно

30 Января 2012
1. вася (loginoff) [Материал]
плиз скинь нароботку 2 статьи прочитал что то не получается

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Форма входа

Поиск

Случайная картинка

Случайный файл
[03 Июля 2008]
[Карты · Dota]
DotA Allstars 6.52.e -
Новая версия доты.

Новые карты
[07 Февраля 2016]
Переезжаем на другой сайт, господа![Dota]
[18 Октября 2015]
Duel of Gods PreV[Другое]
[18 Октября 2015]
Hero of The Empire v1.18g[RPG]
[17 Октября 2015]
Servant War v1.05[Другое]
[17 Октября 2015]
Age of Vikings Edited v1.6[Другое]
[17 Октября 2015]
Strife of the Champions Beta v1.2[Arena]
[17 Октября 2015]
VirusBoll (rus)[Другое]
[17 Октября 2015]
Exterminators v1[AoS]
[17 Октября 2015]
The Lord Heroes v1.2[Другое]
[17 Октября 2015]
Versus heroe Arena 1.0 AI[Arena]

5 лучших по кол-ву добавленных статей
[ Duosora ] [ 58 ]
[ Messenger ] [ 52 ]
[ Bru ] [ 39 ]
[ Pand@ ] [ 35 ]
[ OrcRider ] [ 27 ]

Наша кнопка
Warcraft3FT.info - Всё для Warcraft 3 и DotA

Другие варианты

Статистика

Материалы:
Новости: 1010
Файлы: 8668
Статьи: 680
Картинки: 8256
Форум: 30520/954989
Комментарии: 58094
Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz