XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Rizen

offline
Опыт: 2,126
Активность:
Picking units в прямоугольнике перед caster
Есть такая нужда. По всей видимости, только на GUI это не сделать, нашлась и функция на JASS:
» code
library PointInRect

    // Returns a boolean that tells whether the point is inside a rectangle.
    // (px , py) = Point to check
    // (cx , cy) = lower left corner of the rect
    // (ax , ay) = upper left corner
    // (bx , by) = lower right corner
    function IsPointInRect takes real px , real py , real cx , real cy , real ax , real ay , real bx , real by returns boolean        
        local real dot1 = (px-cx)*(ax-cx) + (py-cy)*(ay-cy)
        local real dot2 = (ax-cx)*(ax-cx) + (ay-cy)*(ay-cy)
        local real dot3 = (px-cx)*(bx-cx) + (py-cy)*(by-cy)
        local real dot4 = (bx-cx)*(bx-cx) + (by-cy)*(by-cy)
        
        return dot1 >= 0 and dot1 <= dot2 and dot3 >= 0 and dot3 <= dot4
    endfunction
    
endlibrary
И вызов функции через customscript:
Custom script: set udg_SF_Boolean = IsPointInRect(GetUnitX(GetEnumUnit()) , GetUnitY(GetEnumUnit) , udg_r5 , udg_r6 , udg_r7 , udg_r8 , udg_r3 , udg_r4 )
Кто-нибудь может мне помочь связать это с юнитами в прямоугольнике длиной 800 и шириной 200? Я был бы очень признателен, ибо спелл хочется, а в JASS'e я нуб нубом.

Отредактировано DragonSpirit, 31.10.2012 в 00:24.
Старый 30.10.2012, 21:55
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
Rizen, 1)объясни суть , цель быть может это можно проще реализовать.
И
2)в твоем случае,в гуи эту функцию можно вызвать,если указывать реалки 3,4,5,6,7,8-как центр прямоугольника со смещением.
И еще раз 1) перечитай
Sladkoegka добавил:
Rizen, и судя поп названию темы тебе нужна абсолютно другая функция...
Старый 30.10.2012, 22:01
Rizen

offline
Опыт: 2,126
Активность:
Sladkoegka, да нет, нужна именно эта. Я перед созданием темы перегуглил hiveworkshop и helper, но там в темах спрашивающие люди быстро понимали, что с этой фигней делать и прощались с гуру :) В моем же случае "я нифига не понял".
А нужно просто пикнуть юнитов в прямоугольнике перед кастером, чтобы покарать их эффектом дамми и нанести кастомный урон. Триггерами почему-то пикаются только круги, а тут идет проверка, находится ли юнит в прямоугольнике.
В общем, нужно сделать триггерный shockwave или полет феникса, с прямоугольной областью эффекта. Думаю, так будет понятнее всего :) И чтобы совсем сомнений в надобности не осталось, скрин в аттаче - там спелл точно такой же, как мне нужен. К сожалению, я наткнулся на скрин после того, как он мне понадобился и не знаю, какую карту погуглить, чтобы порыться во внутренностях.
Миниатюры
Кликните на картинку для увеличения
Название:  231.jpg
Просмотров: 58
Размер:  70.1 Кбайт  
Старый 30.10.2012, 22:17
DualShock

offline
Опыт: 5,023
Активность:
конкретней, урон наноситься мгновенно всем вдоль линии, или же принцип как у shockwave??
Старый 30.10.2012, 22:49
Rizen

offline
Опыт: 2,126
Активность:
DualShock, как получится. В идеале, конечно, урон наносится каждую секунду (предположим, секунды 3-5) всем юнитам, что находятся в прямоугольнике. За неимением такого варианта урон наносится сразу.
Старый 30.10.2012, 22:52
DimanTOoBS

offline
Опыт: 5,791
Активность:
могу предложить другой вариант, создаёшь способность на основе волны силы без эффекта с большой скоростью эффекта, при касте способности заставляешь дами кастовать волну и записываешь в хэш дамику все параметры, отслеживаешь получение урона от дамика и делаешь действия, у волны поставь урон 1
Старый 30.10.2012, 23:12
DualShock

offline
Опыт: 5,023
Активность:
Что бы юзать формулу в 1 посте нужно много массивных математических вычислений ( имхо в ГУИ это делать просто невыносимо). Тут тебе придется заводить переменных штук 10, а то и больше.
Дальше я напишу как найти переменные для использования в функции в 1 посте.
angle - угол между героем и точки ката спелла ( в градусах )
r - от этого зависит ширина прямоугольника (см. скрин)
bj_DEGTORAD= пи/180
Rizen:
в прямоугольнике длиной 800 и шириной 200
в твоем случае r = 100
остальные переменные смотри на скрине
cx = x + r * Cos( (angle - 90.) * bj_DEGTORAD)
cy = y + r * Sin( (angle - 90.) * bj_DEGTORAD)
ax = tx + r * Cos( (angle - 90.) * bj_DEGTORAD)
ay = ty + r * Sin( (angle - 90.) * bj_DEGTORAD)
bx = x + r * Cos( (angle + 90.) * bj_DEGTORAD)
by = y + r * Sin( (angle + 90.) * bj_DEGTORAD)
Дальше осталось подставить в функцию и пользоваться ею
====
Есть ещё один способ, попроще предыдущего, но он, мягко говоря, голимый.
Делить линию точками, которые находятся на равном расстоянии и возле каждой такой точке пикать юнитов в радиусе, наносить урон, заносить в группу, если есть в группе, то недомажить и т. д.
Миниатюры
Кликните на картинку для увеличения
Название:  screen.jpg
Просмотров: 25
Размер:  34.3 Кбайт  
Старый 31.10.2012, 00:05
HolyMoon
Hly shit!
offline
Опыт: 6,986
Активность:
шоквейв с большой скоростью не дамажит часть юнитов на своем пути.
я всегда подобные вещи делал через круги.
грубо говоря:
for each A from 1 to 10 do:
set point = (Position of TriggeringUnit) offset by (50*IntegerA), (facing of triggering unit)
pick every unit in units within 100 of point and damage picked unit.
подчеркиваю, что это грубый пример, но суть, я думаю, ясна
[вырезано цензурой]
[+] 3 пункта от Кет: 2.1 (оскорбление)

Отредактировано Кет, 31.10.2012 в 06:38.
Старый 31.10.2012, 00:10
Rizen

offline
Опыт: 2,126
Активность:
DualShock, ух-ох, сложноватость. А если посмотреть на оригинал, как делал сам автор функции, может там проще?)
Прикрепленные файлы
Тип файла: w3x Maker - StaticFence.w3x (39.7 Кбайт, 2 просмотров )
Старый 31.10.2012, 00:26
DualShock

offline
Опыт: 5,023
Активность:
Rizen:
DualShock, ух-ох, сложноватость. А если посмотреть на оригинал, как делал сам автор функции, может там проще?)
да нет, посмотрев код, он находит cx cy ax ay bx by также как и я
DualShock добавил:
ня если с математикой так туго -.-
Прикрепленные файлы
Тип файла: w3x testing.w3x (31.3 Кбайт, 9 просмотров )

Отредактировано DualShock, 31.10.2012 в 01:35.
Старый 31.10.2012, 01:19
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
Rizen, тебе надо урон нанести мгновенно,или чтобы он как волна пробегал по юнитам?
если 1-ое то у DualShock, самый адекватный вариант.Хотя я б на гуи по-другому сделал..
И да какой дамаг наносит???он статов героя и т.д. либо просто урон?
Старый 31.10.2012, 05:50
Rizen

offline
Опыт: 2,126
Активность:
Sladkoegka, мгновенно :) С дамагом разобраться тоже проблем нет, это в последнюю очередь.
DualShock, с геометрией же, не с математикой. Я по-прежнему смотрю в книгу вижу готовый скрипт, а как он работает понять не могу. Можно сам принцип типа "берем точку х, вычисляем координаты y"? Я не тупой, просто для гуманитария такие вещи сложновато даются. Самое главное - как в этом готовом скрипте настроить длину прямоугольника и его ширину? Если я правильно понимаю, r-это радиус от точки каста? Сейчас конец прямоугольника находится в точке каста, мне же нужна фиксированная длина, предположим, в 1200 (луч эффекта длинный) и ширина в 200 (как сейчас) независимо от того, в какую точку я начал кастовать.
Старый 02.11.2012, 20:44
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
Rizen,
формула DualShock, абсолютно готовая,что тебе нужно подставлять
что тебе нужно указать чтобы настроить.
x,y - позиция юнита кастера
tx,ty -позиция проверяемого юнита
angle - угол между героем и точки ката спелла ( в градусах )
r - от этого зависит ширина прямоугольника (см. скрин)
angle = 90 - это и будет нужная тебе фигура-прямоугольник-угол между сторонами-90
r-ширина прямоугольника,то есть если тебе нужна длинна 800 и ширина 200 то r должно быть=200/2=100
затем вставляешь это :
cx = x + r * Cos( (angle - 90.) * bj_DEGTORAD)
cy = y + r * Sin( (angle - 90.) * bj_DEGTORAD)
ax = tx + r * Cos( (angle - 90.) * bj_DEGTORAD)
ay = ty + r * Sin( (angle - 90.) * bj_DEGTORAD)
bx = x + r * Cos( (angle + 90.) * bj_DEGTORAD)
by = y + r * Sin( (angle + 90.) * bj_DEGTORAD)
и вызываешь функцию
В итоге ты можешь менять angle(нежелательно),(x,y)-позиция кастера,(tx,ty)-позиция проверяемого юнита,r = ширина твоего прямоугольника/2
Если тебе нужно конкретно фиксированное расстояние то ставишь tx,ty = смещение на 800 по отношению к...(например поворот кастера)
Старый 02.11.2012, 23:42
Rizen

offline
Опыт: 2,126
Активность:
Sladkoegka, то есть мне нужно только создать даммика на расстоянии 1200 от моего кастера с углом точки каста и установить tx и ty как точки его позиции?
Старый 03.11.2012, 14:19
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
омг зачем?
полярные координаты для слабых?
Старый 03.11.2012, 14:42
Rizen

offline
Опыт: 2,126
Активность:
Спасибо всем, кто помогал, что-то получилось :) Оставляю триггер здесь для проверки на ошибки и для тех, кто столкнется с такой же проблемой.
Миниатюры
Кликните на картинку для увеличения
Название:  HolyBeam.png
Просмотров: 28
Размер:  89.2 Кбайт  
Старый 03.11.2012, 15:19
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:15.