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

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

Закрытая тема
 
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Объясните как сделать скилл MUI?
Как сделать скилл MUI?
Я так думаю
Когда применяет способность игрок то к нему число присваивается, а потом когда для него сделалось действие, то число уменьшается и триггер выключается
Так?
Объясните зачем циклы для MUI? Наверное чтобы делать для каждого игрока?)
Вот блин Вот уже сейчас понимаю как делать, но что то вроде упускаю
Объясните плз
Старый 09.05.2012, 17:20
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,245
Активность:
NIKZ, ты что тугой, есть куча примеров + я тебе писал и объяснил как муи делать....
Старый 09.05.2012, 17:32
Extremator

offline
Опыт: 42,451
Активность:
ну могу вот так показать... сгодица?
или ещё вот так...
Прикрепленные файлы
Тип файла: w3x FS test mui.w3x (10.8 Кбайт, 32 просмотров )
Тип файла: w3x Tm - MUI.w3x (22.2 Кбайт, 12 просмотров )
Старый 09.05.2012, 17:37
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
NIKZ, А что ты упускаеш?
Короче говоря каждый юнит юзает скилл, но действия триггера построены таким образом что, неважно сколько юнитов одновременно катсанут скилл, для каждого из них будут свои переменные, и некогда не пересекутся, вот это муи скилл.
Чтобы хранить данные такие ка кастер, в простых скилах, мгновенного деиствия, где юнит применил скилл и сразу нанёс урон окружающим, или создал даммика который кастанул на коружающих врагов Гнев деревьев, достаточно глобалных переменных, так как триггер с начало выполнит все действия для одного юнита, затем для второго, и тд, то тут не будет утечки и неприятного эффекта когда катстул 1 а все действия произошли у другого юнита катсера....
Но есть скилы которые по сути состоят из множества повторяющихся действиz которые происходят длительное время... Для самых простых пойдут локальные переменные и Wait но веты работют криво, да и порой их использование тупо невозможно... Тогда на помощь приходят массивы хаш таблицы и стурктуры (по сути тоже массивы глобальных переменных, тока немного похитрее используются на V/C jass)
Так как мы используем локальный таймер для частых действий, то его ID будет уникальным для каждого катса скилла и не будет 2 одинаковых Ид таймера... дак вот эти ид целые числа, кторые мы можем использовать как номера строки хеш таблицы, а для номера столбца мы используем любое выбранное нами целое число, чтобы сохранить нашего катстера цель и так далее, а потом когда таймер истекает мы посегда получаем ссылку на него через функцию GetHandleId(хендл), те мы узнаём номер строки в хеше для конкретно нащих данных для конкретного случия применения способности...
Надеюсь так понятно, то всё выше написанное есть в статьях, только другими словами...
Старый 09.05.2012, 17:45
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Ок вроде понял)
Блин Хеш учить надо)
еще есть информации?
Старый 09.05.2012, 18:42
goldplay99
(C) iFanat
offline
Опыт: 2,019
Активность:
СТАТЬЯ вот от меня, надеюсь поможет и там будут ссылки в конце на статьи. Надеюсь поможет. И не обязательно использовать хэш. Можно structur :D

Отредактировано goldplay99, 09.05.2012 в 19:10.
Старый 09.05.2012, 18:47
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
NIKZ, есть, как первый том Войны и мир... тебе выложить?
Старый 09.05.2012, 18:51
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
quq_CCCP, Даавай с радостью! Хочу сделать свою карту не виснущей и никогда не подводящей))
Старый 09.05.2012, 18:53
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
NIKZ, Начнём с простого...
У Аос типа доты, 10 героев, и каждый из них может кастануть некий скилл назём Его толчёк (как ф Force staff из доты)
Создаём новый триггер, ну даём ему имя это неважно, каое будет имя у триггера на МИУшность это не влияет...
Даём триггеру новое событие некоторый Юнит приводит способность в деиствие, это гуи событие, на jass его делают как некий юнит игрока катснул скилл, и таких событий делают у триггера столько сколько игроков, скажу от себя это сомнительное прием, навряд ли мы много выиграем в производительности кода... В прочем смотри сам
((код jass
===========================================================================
function InitTrig_Ice_Arrows takes nothing returns nothing
set gg_trg_Ice_Arrows = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Ice_Arrows, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Ice_Arrows, Condition( function Trig_Ice_Arrows_Conditions ) )
call TriggerAddAction( gg_trg_Ice_Arrows, function Trig_Ice_Arrows_Actions )
endfunction
))
и якобы более оптимальный вариант (кому как нравится, Diod и TiadCop на сjass не так извращались с этим казалось бы простым событием, но это позже)
((код jass
===========================================================================
function InitTrig_Ice_Arrows takes nothing returns nothing
local integer index = 0
set gg_trg_Ice_Arrows = CreateTrigger( )
loop
call TriggerRegisterPlayerUnitEvent(gg_trg_Ice_Arrows, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition( gg_trg_Ice_Arrows, Condition( function Trig_Ice_Arrows_Conditions ) )
call TriggerAddAction( gg_trg_Ice_Arrows, function Trig_Ice_Arrows_Actions )
endfunction
))
Далее про события и действия, рекламная пауза 5 мин, не переключайтесь)
Старый 09.05.2012, 19:08
goldplay99
(C) iFanat
offline
Опыт: 2,019
Активность:
СТАТЬ вот ещё.
Старый 09.05.2012, 19:09
quq_CCCP
Я белый и пушистый!
offline
Опыт: 96,068
Активность:
Ну условие типа равкод применённой способности равен некому равкоду
((код jass
function Trig_Ice_Arrows_Conditions takes nothing returns boolean
return ( GetSpellAbilityId() == 'A01U' )
endfunction
))
Условие тоже не влияет на МУИшность триггера, главное после конверта из гуи сделать его таик как указанно выше, надеюсь это ты знаеш...
Такое условие нужно исправлять всегда хотя бы потому что оно занимает больше строк чес оптимизированное, и оптимизация заключается в примитивной операции - удалении всего лишнего, вот как выглядит условие после конверта из гуи...
((код jass
function Trig_Ice_Arrows_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A01U' ) ) then
return false
endif
return true
endfunction
))
Глядя на код выше думаю легко догадаться почему его нужно править...
Теперь самое главное - действие триггера, именно эта функция, а точнее её алгоритм и отвечает за МУИшность...
Начнём с объявления локальных переменных
Почему мы используем локальные переменные а не глобальные, а потому что это проще пареной репы...
Не надо беспокоится что значения этих переменных будут удалены в другой функции использующие такие же переменные..
Глобальные переменные не подходят для таких функций, потому что они для всех одни и не учитывают что одна и та же функция вызывается многократно с разными параметрами...
Ну понабрались, локалки рулят потому что они в функции создаются каждый раз когда они вызываются, и неважно что триггер сработал 50 раз в секунду, значение в каждой локалки будет своё..
вот пример
((код Jass
local unit Caster = GetSpellAbilityUnit()
local timer t = CrateTimer()
local integer TimerId = GetHandleId(t)
....
))
Вот мы обьявили локальыне переменные и присвоили им значения, обрати внимание, что некторые переменные приравнены функции типа CreateTimer(), CreateGroup(), CreateBoolExpr(),и тд
Этим переменным присваивается некий, вновь созданный хендл, в нашем случае это таймер, при кадом запуске триггера и вызова им этой функции будет создаваться новый таймер, и заносится в переменную t которая видна только в той фукнции в которой она объявлена, и только на время её выполнения, те очень очень короткое время...
Вот она муишнось, неважно сколько юнто юзнут скилл, у каждого будет своё таймер, и своя переменная t....
NIKZ, Ну хоть что-то понял?, я чай пить, когда вернусь продолжу если необходимо....
Старый 09.05.2012, 19:31
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Понял)
Кароче Лоаклки это ЯЗЬЬ ЗДОРОВЕннаЯ))
Вобщем понял как условие оптимизировать и действие сделать как нужно)
А вот тебе вопрос)
А если все действия сделать на гуи, а потом это все конвертнуть и сделать на JASS,тоже же не плохо?))
А так писать кучу строк)) времени занимает
Старый 09.05.2012, 20:03
goldplay99
(C) iFanat
offline
Опыт: 2,019
Активность:
Почти все так и делают, на гуй потом в джасс и дополняют
Старый 09.05.2012, 20:04
NIKZ
Изучаю Jass
offline
Опыт: 6,036
Активность:
Extremator, quq_CCCP, пасиб)
quq_CCCP, Да можно дальшее))
Старый 09.05.2012, 20:05
Nerevar
I'll be back!
offline
Опыт: 17,452
Активность:
Дальше либо в лс,либо смотри статьи - ибо там тоже самое пишут
Старый 09.05.2012, 20:06
Закрытая тема

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

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

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

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



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