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

Меню сайта

Категории

Наш опрос
Ваша любимая раса?
Проголосовало: 177951

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

Реклама

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

1. Введение

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

Внимание! Эта статья не убирает утечки памяти в результате выполнения функций!
2. Основные функции

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

а) Дистанция между точками
Эту функцию легко понять. Две точки - параметры, расстояние между ними - результат. Особо объяснять не надо. Для того, чтобы вы немного поняли, что такое дистанция, я скажу, что экран в WarCraft III имеет размер 1900 х 1250.

Пример: на изображении ниже есть 3 точки - a, b и c. Вот, какие получатся значения расстояния:
dist(a,b) = 25
dist(b,c)=√149 = 12,2065
dist(c,a) = √52 = 7,211



Примечание: функция коммутативная, т.е. dist(a,b) = dist(b,a).

б) Угол между точками.
Более сложная функция, но знакомая, особенно для тех, кто имеет базовые знания в геометрии. Угол между точками вернёт угол, на котором находится вторая точка от первой. Чтобы легче её запомнить, поставьте две боевые единицы и заставьте их повернуться лицом друг к другу.

Примечание: Функция не коммутативная. angle(a,b) и angle(b,a) - разные вещи. angle(a,b) = angle(b,a)-180.00.

Пример: На изображении ниже вы видите 3 точки: m,n и p. Вот, какие значения функция вернёт для каждой из них:
angle(m,n) = 0
angle(n,m) = 180
angle(m,p) = 270
angle(p,m) = 90
angle(n,p) = 225
angle(p,n) = 45

с) Полярная проекция на точку. Специальная функция, которую мы будем использовать больше всего. написав в параметрах точку р, дистанцию d и угол а, получим точку p' по след. условиям:
dist( p,p’ )=d
angle( p,p’ )=a

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

Пример: Допустим, у нас есть некая точка а(3;3). Требуется создать точки b = PolarOffset(a,100,60), c=PolarOffset(a,200,225),
d=PolarOffset(c,150,90), e=PolarOffset(b,170, 270). Ниже можно найти решение.


Примечание: Дистанции выделены синим, углы - красным.
3. Первая графика - круг

После того, как мы обсудили важные функции, можно приступить к созданию простой графической фигуры - круга. Я предупрежу вас, что здесь мы не будем работать со сложными координатами и подобными вещами. Мы используем изученные функции.

Первый вопрос возникнет у многих из вас: "Как же создать эту фигуру? Спецэффектами?". Ответ - нет, я полностью против спецэффектов, т.к. ими трудно управлять и можно получить неожиданный результат. Я использую боевых единиц, в частности потому, что их можно объединять в группы, да и у них есть тени, а также потому, что они являются интерактивными объектами со множеством возможных событий.

Итак, как же создать такую боевую единицу? На самом деле, очень просто. Если вы уже работали с нестандартными способностями, то наверняка слышали о боевых единицах-дамми. Наша боевая единица очень на них похожа. Она будет стоить 0 золота и 0 дерева, требовать 0 пищи, невыделяемой и неуязвимой. Называется такая боевая единица ракетой. Единственной отличие ракеты от дамми заключается в том, что у них (ракет) всегда есть прикреплённая модель, соответственно ракеты видны и имеют тип "Летающий" с некоторой высотой над поверхностью.

Для нашего круга я использовал ракету с классическим огненным эффектом. Перед тем, как начать создавать круг, мы должны подумать, как мы его создадим. Естественно, что он будет состоять из ракет. Обычно при работе с графикой важно знать, сколько ракет мы будем использовать. Для радиуса 400, думаю, 36 будет вполне достаточно. Соответственно, больше радиус - больше ракет.

Какое у круга определение? Это геометрическая фигура, состоящая из множества точек, равноудалённых от центра. Мы не можем использовать множеств в программировании, но зато можем использовать факт - равноудалённые от центра. Другой важный факт - расстояние между ракетами должно быть равно. Получим такую окружность:



Теперь давайте изучим этот график, чтобы его понять. Жёлтые линии - это расстояния от центра до точек, является константой. Чилса на лучах представляют собой номер элемента круга. Угол между точками центра и элемента зависит от его номера.

Угол между поледним элементом и центром равен 360 градусов. Поэтому a*n=360 => a = 360/n, n!=0. Ещё одна важная часть - точка "k", так как из неё можно вывести формулу любого угла.

Это выглядит похожим на несколько полярных проекций на точку. Исходя из этого, можно реализовать такой круг.

For each (Integer A) from 1 to 36, do (Actions)
  Loop - Actions
  Unit - Create 1 Missile for Player 1 (Red) at (Circle_Center offset by 400.00 towards ((Real((Integer A))) x (360.00 / 36.00)) degrees) facing Circle_Center)
4. Создание линий

Теперь научимся рисовать ещё одну важную фигуру - линию между двумя точками. Звучит так, что это очень сложно, но на самом деле всё просто. Как всегда, сначала я покажу формулу, потом будем действовать по ней.



Угол здесь является константой. Он равен g. "Движущимся" элементом здесь является дистанция. Можно заметить, что она равна k*d, где k - индекс. Получим формулу dist(k) = k*(total_dist/n).
Теперь давайте применим это. StartPoint и EndPoint - переменные-точки. Вот, как это будет выглядеть:

For each (Integer A) from 1 to 36, do (Actions)
  Loop - Actions
  Unit - Create 1 Missile for Player 1 (Red) at (StartPoint offset by ((Real((Integer A))) x ((Distance between StartPoint and EndPoint) / 36.00)) towards (Angle from StartPoint to EndPoint) degrees facing EndPoint)

Прежде, чем идти дальше, убедитесь, что освоили всё, что говорилось в этом и в предыдущих пунктах.
5. Колёса и спирали

Давайте пойдём дальше и сделаем что-то в комплексе. Одна из таких комбинаций в итоге даст нам круг с несколькими радиусами. Это будет несложно создать.

Вам на заметку - Никогда не пытайтесь выводить общую формулу для всей фигуры. Лучше рисовать её по элементам.

И снова я покажу изображение, на этот раз для колеса.



Для начала создадим круг с радиусом r из центральной точки, используя метод в части 3. Затем нужно прибавить все радиусы.
Полярные координаты, на которых построены диаметры:
Center = center of the circle.
Distance = radius of the circle.
Angle = k*a and 180+k*a.
a=360/2n.; k=1,(n-1); n=total number of diameters.

Очень просто создать данную фигуру в wacraft. Смотрите:

//first create the circle
For each (Integer A) from 1 to 36, do (Actions)
  Loop - Actions
  Unit - Create 1 Missile for Player 1 (Red) at (Circle_Center offset by 400.00 towards ((Real((Integer A))) x (360.00 / 36.00)) degrees) facing Circle_Center)

//and now the diameters
For each (Integer A) from 1 to 8, do (Actions)
  Loop - Actions
  Set StartPoint = (StartPoint offset by 400.00 towards ((Real((Integer A))) x (360.00 / 20.00)) degrees)
  Set StartPoint = (StartPoint offset by 400.00 towards ((Real((Integer A))) x (180.00 + (360.00 / 20.00))) degrees)
  //ofcourse we need to create multiple lines
  For each (Integer B) from 1 to 36, do (Actions)
  Loop - Actions
  Unit - Create 1 Missile for Player 1 (Red) at (StartPoint offset by ((Real((Integer B))) x ((Distance between StartPoint and EndPoint) / 36.00)) towards (Angle from StartPoint to EndPoint) degrees facing EndPoint)

Спираль будет состоять из нескольких окружностей, примерно так, как на рисунке:


Начинает выглядеть логично. Существуют две важные вещи: количество ракет, создающих круг, должно быть маленьким. Угол возрастает вместе с добавлением новой окружности.
Вот, как будет выглядеть нужная нам формула:

Angle = e*n+(a*k). a=360/number_of_spires. e = constant real value (deviation angle). k=1,number_of_spires. n = index of current element of the spire.
Distance = r+(c*n). r = radius of circle at the center of the spiral. c = constant real value. n = same as above.

Теперь просто применим формулу.

For each (Integer A) from 1 to 20, do (Actions)
  Loop - Actions
  For each (Integer B) from 1 to 7, do (Actions)
  Loop - Actions
  Unit - Create 1 Missile for Player 1 (Red) at (CENTER offset by (100.00 + (8.00 x (Real((Integer A))))) towards (((360.00 / 7.00) x (Real((Integer B)))) + (6.00 x (Real((Integer A))))) degrees) facing CENTER
6. Несколько советов

1) Запишите ракеты в группу. Это лучше, чем перебирать их в массиве, да и удалять их проще.
2) Удалите утечки. Обязательно записывайте их в переменную! Если вы сделаете что-то наподобие “RemoveLocation(PolarProjection([…]))”, это будет абсолютно неправильно. Получается, что вы создаёте точку и тут же её удаляете.
3) Работайте с координатами. Это можно сделать и без Custom Script-кода путём использования функции “Преобразование – Convert Coordinates to point”. Тогда вы, хоть и получая точку, сможете управлять отдельной координатой.
4) Если потребуется использование более двух циклов, не пугайтесь. Просто создайте свои переменные типа "Целочисленная" и используйте их в циклах.
Просмотров: 5388 Добавил: Duosora Добавлено: 14 Апреля 2010 в 00:12:09
Комментариев: 14 |

Всего комментариев: 141 2 »
17 Марта 2013
14. Роман (ZeroDeath2) [Материал]
В 3 разделе что такое Circle_Center

27 Июня 2012
Нечего не понятно,но это круто =)

24 Сентября 2011
Получилось.
Set StartPoint = (Circle_Center offset by 400.00 towards ((Real((Integer A))) x (360.00 / 20.00)) degrees)
Set EndPoint = (Circle_Center offset by 400.00 towards ((Real((Integer A))) x (180.00 + (360.00 / 20.00))) degrees)
И еще пришлось добавить условие, чтобы шаг дальше выполнялся только нечетный, т.к. 2,4,6и8 шаги почему то делали не диаметр, а кучковались на окружности. Не смог понять почему так.

24 Сентября 2011
Хотя нет, не так. У меня не получается никак сделать, чтобы были эти диаметры внутри. Или 4 радиуса и скопление ракет на дугах между радиусами. Или линии пересекаются не в центре. Что не так

24 Сентября 2011
В 5 части, когда мы делаем окружность с диаметрами помоему перепутаны названия переменных
"Set StartPoint = (StartPoint offset by 400.00 towards ((Real((Integer A))) x (360.00 / 20.00)) degrees)
Set StartPoint = (StartPoint offset by 400.00 towards ((Real((Integer A))) x (180.00 + (360.00 / 20.00))) degrees) "
В скобках Circle_Center, а второе назначение EndPoint. Разве нет?

24 Сентября 2011
Самое начало
"dist(a,b) = 25"
Судя по всему корень из 25, т.е. 5

18 Мая 2011
8. Виталий (MrakinBlack) [Материал]
Суге!!! очень полезная статья!

09 Мая 2011
7. Алексей (wardenrok) [Материал]
Спасибо ) Если вспомнить геометрию то даже очень просто и понятно всё ^_^

05 Мая 2011
6. Владимир (Keeper_of_the_Life) [Материал]
Суперская статья. Помогла!

23 Декабря 2010
5. Алексей (EdiTTORR) [Материал]
4. Oleg (Nnoitora)
Заноси в переменную с массивом а потом циклом обнуляй

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

Форма входа

Поиск

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

Случайный файл
[13 Мая 2008]
[Карты · Arena]
FateAnother -
Прикольная мапа с моделями героев из аниме, нестандартная магия, возможность выбора типа игры, огорчает то-что нет AI.

Новые карты
[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 ]
[ РеКсАр ] [ 27 ]

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

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

Статистика

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