Лучшие проекты:

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

  • Страница 1 из 1
  • 1
Модератор форума: farfacer, SaMuRa][  
[Статья] Координаты вместо точек
SanninДата: Воскресенье, 24.03.2013, 13:55 | Сообщение # 1
Лучший спеллмейкер
Группа: Супер творец
Сообщений: 124
Награды: 7
Репутация: 1190
Статус: Offline
загрузка наград ...
Всем доброго времени суток.
Что-то вот я заскучал, и решил написать статью для тех, кто до сих пор в ГУИ/jass использует точки (для перемещения юнитов и создания спецэффектов, в основном)
Постараюсь изложить всё кратко и понятно. Мы не будем вдаваться в прелести математического движения, чтобы не загружать вас лишней информацией.

Предлагать примеры буду на ГУИ, т.к. подозреваю, что джассеры в принципе точки не используют (я в их числе).

============================================================================================

КООРДИНАТЫ

Итак, давайте возьмём какой-нибудь спел за пример:
Пусть, при касте какой-либо способности (допустим, на цель) создаётся и сразу же удаляется спецэффект на кастере и на цели. Думаю, все знают, как это сделать.


Целых 4 действия.

Теперь окунёмся немного (совсем немного) в теорию. Что же такое точка? Точка - это место в пространстве, содержащая в себе координаты X, Y, Z.

Итак, чтобы создать спецэффект на цели, мы используем точку. А ведь это те же координаты X и Y (Z в данном случае не нужна, т.к. отвечает за высоту).
Т.е. точка - это и есть координаты, так зачем нам использовать точку, если можно использовать координаты?
Ну и логичный вопрос: а нафига координаты, если есть точка? :)

А теперь поясню плюсы координат
В отличии от точек, они:
1) Не утечны (ни как игровой объект, ни как ссылка на него)!
2) Быстрее работают
Следовательно,
1) С ними код (или количество действий на ГУИ) станет меньше, и всё будет работать быстрее
2) Не засоряется память

Единственный, пожалуй, минус (но только для гуишников) - это то, что на ГУИ их можно реализовывать только с помощью Custom Script

Теперь, ближе к делу. Я расскажу вам, как правильно использовать координаты и НАВСЕГДА забыть о точках.
На ГУИ тяжеловато это объяснять, но я постараюсь.


Итак, давайте разберём действие
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetWidgetX(GetTriggerUnit()), GetWidgetY(GetTriggerUnit())))

DestroyEffect() - функция, удаляющая наш спецэффект
AddSpecialEffect() - функция, создающая наш спецэффект по заданным координатам
"Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" - это модель нашего спецэффекта
GetWidgetX(GetTriggerUnit()) - это координата X нашего кастера
GetWidgetY(GetTriggerUnit()) - это координата Y нашего кастера

В общем, всё достаточно просто. Вместо udg_Point[0] мы используем GetWidgetX() и GetWidgetY()

Если вам нужно создать более 2-3 раз спецэффект в одной позиции, то GetWidgetX() и GetWidgetY() стоит заносить в переменную. Вот так:


Что ж, на этом можно закончить первую часть статьи и перейти ко второй

============================================================================================


ДВИЖЕНИЕ


Итак, вот и 2-ая часть. Здесь будет рассмотрено движение юнитов.

Мы с вами сделаем триггер, который будет двигать кастера в указанную позицию на определённое расстояние, при этом будем создавать ещё и спецэффект в позициях каста и завершения движения, чтобы получше разобраться в этом.
Создаём триггер:
ВНИМАНИЕ! Я показываю очень примитивные и непроизводительные примеры, лучше не использовать их в своих триггерах. Вы должны разобраться в использовании координат, так что, на всё остальное лучше не смотрите положительно (дам 2 совета: 1)никогда, НИКОГДА не используйте действие на ГУИ ждать Х секунд, оно багнутое в хлам; 2) вместо динамических триггеров переходите на jass и используйте таймеры)

Что ж, вот что у нас вышло

- это триггер самого каста

Давайте разберёмся, что у нас тут есть:)

============================================================================================
local real x - объявляем локальную переменную типа "реальная" и присваиваем ей имя "x"
local real y - объявляем локальную переменную типа "реальная" и присваиваем ей имя "y"
local real x1 = GetSpellTargetX() - объявляем локальную переменную типа "реальная", присваиваем ей имя "x1" и задаём значение - координата X указанной точки каста
local real y1 = GetSpellTargetY() - объявляем локальную переменную типа "реальная", присваиваем ей имя "y1" и задаём значение - координата Y указанной точки каста

set Caster = GetTriggerUnit() - объявляем кастера

set x = GetWidgetX(udg_Caster) - узнаём координату X кастера
set y = GetWidgetX(udg_Caster) - узнаём координату Y кастера

set udg_Angle = 57.295*Atan2(y1-y, x1-x) - здесь мы задаём угол, под которым мы будем двигать юнита. Просто запомните это:)

call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", x, y)) - создаём спецэффект в позиции кастера

Триггер - Turn on Example Move - включаем триггер движения
Wait 1.00 seconds - ждём 1 секунду
Триггер - Turn off Example Move - выключаем триггер движения

call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetWidgetX(udg_Caster), GetWidgetY(udg_Caster))) - создаём спецэффект в позиции кастера
============================================================================================


- это триггер движения

Каждые 0.04 секунды мы двигаем юнита вперёд на 40 единиц.
Разберём действие:
call SetUnitPosition(udg_Caster, GetWidgetX(udg_Caster)+40.*Cos(udg_Angle*.017), GetWidgetY(udg_Caster)+40.*Sin(udg_Angle*.017))

SetUnitPosition() - функция, которая двигает кастера в указанные координаты
udg_Caster - кастер
GetWidgetX(udg_Caster)+40.*Cos(udg_Angle*.017) - смещение по координате X на 40 единиц под углом udg_Angle
GetWidgetY(udg_Caster)+40.*Sin(udg_Angle*.017) - смещение по координате Y на 40 единиц под углом udg_Angle

Почему именно на мы умножаем угол (udg_Angle) на .017? Я, к сожалению, не шарю в математике, и сказать вам этого не могу. Примите это, как факт:) Если умножить на другое число, то перемещение будет кривым (а если вообще не умножить, то перемещения по таректории вообще не произойдёт)


Что ж, на этом, думаю, можно закончить. Если у вас есть какие-либо замечания или предложения, то пишите:) Спасибо за внимание


Сообщение отредактировал Sannin - Среда, 27.03.2013, 11:22
 
No_oneДата: Понедельник, 25.03.2013, 18:23 | Сообщение # 2
Навеки ваш, Painkonan.
Группа: Старший модератор
Сообщений: 913
Награды: 11
Репутация: 587
Статус: Offline
загрузка наград ...
Спасибо за статью, но замечание - фотографии нельзя увеличить, при нажатии на них открывается главная страница radikal.ru
Почему умножается именно на Cos или Sin (это понятно) от 17 (что будет, при использовании других значений (как измениться траектория движения?)


Автор проекта DotS.
Участник команды animewar.net


Сообщение отредактировал painkonan - Понедельник, 25.03.2013, 18:24
 
GoLdДата: Вторник, 26.03.2013, 18:31 | Сообщение # 3
Легенда сего мира
Группа: Проверенные
Сообщений: 161
Награды: 3
Репутация: 69
Статус: Offline
загрузка наград ...
Для меня это довольно сложно)
Я привык работать  с точками)


2013
Если есть вопросы - обращайтесь!
 
SanninДата: Среда, 27.03.2013, 11:14 | Сообщение # 4
Лучший спеллмейкер
Группа: Супер творец
Сообщений: 124
Награды: 7
Репутация: 1190
Статус: Offline
загрузка наград ...
painkonan, дописал про 0.017. про фотографии учту, если буду писать ещё статьи)

GoLd, на самом деле, всё просто) просто непривычно. сам поначалу не понимал


Сообщение отредактировал Sannin - Среда, 27.03.2013, 11:21
 
farfacerДата: Среда, 27.03.2013, 14:28 | Сообщение # 5
xFyntuk/DOF
Группа: Проверенные
Сообщений: 716
Награды: 15
Репутация: 148
Статус: Offline
загрузка наград ...
Sannin, Если мне не изменяет память, то похожий способ в джазе, что бы юнитов перепортировать
 
SanninДата: Среда, 27.03.2013, 15:56 | Сообщение # 6
Лучший спеллмейкер
Группа: Супер творец
Сообщений: 124
Награды: 7
Репутация: 1190
Статус: Offline
загрузка наград ...
он и есть) если вы раскроете БЖ-функцию движения юнита в точку, то увидите, что там именно такое движение. т.е., по сути, координаты - это раскрытая БЖ точки, если так сказать можно.
 
KuroДата: Вторник, 18.06.2013, 18:40 | Сообщение # 7
Группа: Заблокированные
Награды: 0
Репутация: 17
Статус: Offline
загрузка наград ...
Sannin, на что надо умножать было смещение координат по Z
 
WolfkillДата: Среда, 19.06.2013, 15:26 | Сообщение # 8
Saiyan
Группа: Творец
Сообщений: 792
Награды: 13
Репутация: 206
Статус: Offline
загрузка наград ...
Kuro, по Z не надо смещать, Z - высота полета, если речь идет про юнита.

 
ImbaДата: Четверг, 24.07.2014, 17:09 | Сообщение # 9
=◕◡◕=
Группа: Элита
Сообщений: 1153
Награды: 27
Репутация: 1554
Статус: Offline
загрузка наград ...
UP темы.
Теперь тема закреплена.


Кликни на баннер!
 
DarkDaroДата: Воскресенье, 28.09.2014, 01:08 | Сообщение # 10
BvO Creator
Группа: Творец
Сообщений: 87
Награды: 9
Репутация: 89
Статус: Offline
загрузка наград ...
Лучше объясните в чем разница  GetWidgetX,Y и GetUnitX,Y?
Так же для новичком следует прикрепить карту пример.
 
  • Страница 1 из 1
  • 1
Поиск: