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

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

Закрытая тема
 
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
1 триггер или множество
Меня уже давно беспокоит 1 вопрос что лучше 1 триггер или множество, с одним и тем же событием, однотипным условиями и действиями...
Все давным дано научились делать триггерные скиллы в замену варовским, но сколько ко скиллов столько и триггеров, а вот зачем если можно 1 обойтись хотя-бы триггером на 1 героя, или 1 на всех?
Триггер уже создавать во время игры когда будет пикнут герой, таким способом можно немножко повысить скорость загрузки карты, не говоря о памяти вара... но только вот как лучше организовать проверку на то какой скилл какой функции соответствует?
» Пример
((код jass
globals
integer array AbiltysId
string array FunstionsNames
constant integer A = 'A000'
constant integer MaxSpellsCount = 2
endglobals
library A initializer InitSpellsData
private function InitSpellsData takes nothing returns nothing
local integer nIndex = 'A001' - A
set FunstionsNames[nIndex] = "FireBolt"
set nIndex = 'A002' - A
set FunstionsNames[nIndex] = "FlameNova"
и тд.
endfunction
function GetAbityActions takes integer whichAbility returns string так мы получим функцию из массива для нужного скилла
local integer nIndex = whichAbility - A
if ( nIndex > 0 and nIndex <= MaxSpellsCount ) then
return FunstionsNames[nIndex]
endif
return "null"
endfunction
endlibrary
))
Или же стоит использовать хештаблици, и не парится с расчётом номера ячейки?
А может кому либо известны другие, более эффективные методы?
Жду комментариев, и предложений...
Старый 01.11.2012, 09:58
Sladkoegka
Забыл что хотел...
offline
Опыт: 7,477
Активность:
quq_CCCP, Сам хотел заюзать это Но я не vjass'ер.Быть может тебе подойдет
Старый 01.11.2012, 10:34
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Sladkoegka, я сам прекрасно знаю, но без обид, хочу послушать jasseров и прочих, насколько это оправдано, и что лучше по их мнению, что и как ме и без этого известно....
Старый 01.11.2012, 10:40
J64_

offline
Опыт: 4,724
Активность:
Это зависит от ситуации.
Вы так вместите, относительно, слишком мало способностей, и они всегда должны будут начинаться с символа A.
Имея ввиду что строки это объекты, которые не удаляются и которых вообще нужно остерегаться, можно использовать boolexpr.
А можно ещё перебирать, определённым образом, все возможные варианты способностей с помощью условных операторов, так будет без массивов, ограничений, boolexpr и прочего. Но с помощью boolexpr можно творить много чудес
Старый 01.11.2012, 10:53
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Judycaster64, перебирать то зачем, у нас есть массив в котором ссылки на функции (эх близзы скотины, code не может быть массивом) по ид скилла главное быстро найти функцию, но вот еще 1 проблема редактирование и добавление скиллов становится несколько неудобным...
quq_CCCP добавил:
Judycaster64, кстати а с какого перепуга способности не с "А" начинаются?
Старый 01.11.2012, 10:57
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
callback onSpellCast(`A000`) тебе в помощь. В целом это беготня за байтами, к готовому продукту не приблизит, и даже отдалит. Усложнит архитектуру, ощутимой пользы не будет.
Сам код костыльный, можно сделать все существенно круче. В пару строк.
Старый 01.11.2012, 11:17
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Faion, ну это я и хочу, только жду дельных предложений а не журавля в небе...
quq_CCCP добавил:
Faion, про архитектуру это и так понятно, но все же постараюсь, а про байты это ты загнул, польза будет значительно ощутимее, хотя это зависит от кол-ва скиллов если их будет сотни 4 то ой как зарешает, + загрузка карты будет быстрее....
Старый 01.11.2012, 11:24
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
quq_CCCP:
только жду дельных предложений
Faion:
callback onSpellCast(`A000`) тебе в помощь.
quq_CCCP:
польза будет значительно ощутимее
Мечтать не вредно.
quq_CCCP:
хотя это зависит от кол-ва скиллов если их будет сотни 4 то ой как зарешает
Если их будет хотя бы ~ 1 млн, ага.
quq_CCCP:
загрузка карты будет быстрее....
Ага, на долю секунды.
Старый 01.11.2012, 12:06
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Faion, секунды на 4, но не будем спорить, про callback а не лучше ли ExecuteFunc() ? темболее несколько проще искасть?
Сам то что используеш...
Старый 01.11.2012, 12:30
Темак
jass for everyone
offline
Опыт: 7,200
Активность:
А если ExecuteFunc("Function_" + AbilityId2String(AbilityId2String()))?
Старый 01.11.2012, 13:04
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Temak1, интересная идея но нельзя ли покороче? да и если я не хочу создавать функции с дебильными именами?
Старый 01.11.2012, 13:42
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
quq_CCCP, можешь посмотреть это но там далеко не идеальный вариант, как нить напишу лучше.
Старый 01.11.2012, 13:48
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
Faion, точно не лучший, да и сjass...
А как насчёт этого варианта?
» код
((код jass
library InitLichSpells initializer InitData
globals
constant integer DummyId = 'udum'

trigger gg_trg_PickHeroCheck
trigger gg_trg_HeroCastSpell
boolexpr gg_bxp_EnemyGroundUnits
region gg_rtc_TempRect
hashtable gg_htb_GameData
=================================
integer array Abilitys
string array Functions
constant integer MaxAbilityCount = 1
constant integer MinAbilityCount = 'A000'
endglobals
function GetAbilityFunctionName takes integer whichAbility returns string
return Functions[whichAbility - MinAbilityCount]
endfunction
function IsAbilityCustom takes integer whichAbility returns boolean
return whichAbility == Abilitys[whichAbility - MinAbilityCount]
endfunction
private function Trig_HeroCastSpell_Condtions takes nothing returns boolean
local integer nAindex = GetSpellAbilityId( )
return nAindex == Abilitys[nAindex - MinAbilityCount]
endfunction
private function Trig_HeroCastSpell_Actions takes nothing returns nothing
call ExecuteFunc( GetAbilityFunctionName( GetSpellAbilityId( ) ) )
endfunction
private function IsEnemyGroundAlive takes nothing returns boolean
return IsUnitEnemy( GetFilterUnit( ), bj_groupEnumOwningPlayer ) and GetUnitState( GetFilterUnit( ), UNIT_STATE_LIFE ) > 0.44 and IsUnitType( GetFilterUnit( ), UNIT_TYPE_GROUND ) and not( IsUnitType( GetFilterUnit( ), UNIT_TYPE_MECHANICAL ) and IsUnitType( GetFilterUnit( ), UNIT_TYPE_MAGIC_IMMUNE ) )
endfunction
private function Trig_PHC_Conditions takes nothing returns boolean
return IsUnitType( GetTriggerUnit( ), UNIT_TYPE_HERO ) and not ( LoadBoolean( gg_htb_GameData, GetHandleId( GetTriggerUnit( ) ), StringHash( "loaded" ) ) )
endfunction
private function Trig_PHC_Actions takes nothing returns nothing
local unit Hero = GetTriggerUnit( )
local integer HeroId = GetHandleId( Hero )
call SaveBoolean( gg_htb_GameData, HeroId, StringHash( "loaded" ), true )
call TriggerRegisterUnitEvent( gg_trg_HeroCastSpell, Hero, EVENT_UNIT_SPELL_CAST )
set Hero = null
endfunction
private function InitData takes nothing returns nothing
инициализация триггерных способностей
local integer nIndex = 'A000' - MinAbilityCount
set Abilitys[nIndex] = 'A000'
set Functions[nIndex] = "Trig_Frost_Curce_Actions"

set nIndex = 'A001' - MinAbilityCount
инициализация хештаблицы
set gg_htb_GameData = InitHashtable( )
создание триггера ответсвтвенного за отолов события "ЮНИТ ПОЯВИЛСЯ НА КАРТЕ"
set gg_trg_PickHeroCheck = CreateTrigger( )
set gg_rtc_TempRect = CreateRegion( )
call RegionAddRect( gg_rtc_TempRect, bj_mapInitialPlayableArea )
call TriggerRegisterEnterRegion( gg_trg_PickHeroCheck, gg_rtc_TempRect, null )
call TriggerAddCondition( gg_trg_PickHeroCheck, Condition( function Trig_PHC_Conditions ) )
call TriggerAddAction( gg_trg_PickHeroCheck, function Trig_PHC_Actions )
создание триггера ответсвтвенного за отолов события "ЮНИТ ПРИВОДИТ СПОСОБНОСТЬ В ДЕЙСТВИЕ"
set gg_trg_HeroCastSpell = CreateTrigger( )
call TriggerAddCondition( gg_trg_HeroCastSpell, Condition( function Trig_HeroCastSpell_Condtions ) )
call TriggerAddAction( gg_trg_HeroCastSpell, function Trig_HeroCastSpell_Actions )
создание фильтра
set gg_bxp_EnemyGroundUnits = Condition( function IsEnemyGroundAlive )
endfunction
endlibrary
))
Старый 01.11.2012, 14:06
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
quq_CCCP, скорп передает тебе:
скинь туда что он упоротый ему советуют норм способ, он решил выбрать самый тормознутый из всех
Sladkoegka:
quq_CCCP, Сам хотел заюзать это Но я не vjass'ер.Быть может тебе подойдет
Нету там никакого vjass'a
Старый 01.11.2012, 14:06
DioD

offline
Опыт: 45,134
Активность:
колбеки и фабрика событий высраны 9999 лет назад, используйте уже опыт реальных проектов а не придумайте своё УГ
Старый 01.11.2012, 14:12
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
DioD, а не придумываю, ищю поиском, ваше так называемое
DioD:
колбеки и фабрика событий высраны 9999 лет назад, используйте уже опыт реальных проектов а не придумайте своё УГ
Старый 01.11.2012, 14:16
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
quq_CCCP:
А как насчёт этого варианта?
DioD:
используйте уже опыт реальных проектов а не придумайте своё УГ
Faion:
ему советуют норм способ, он решил выбрать самый тормознутый из всех
Faion:
callback onSpellCast(`A000`) тебе в помощь.
:nate:
Старый 01.11.2012, 14:16
DioD

offline
Опыт: 45,134
Активность:
тебе не нужны ни мета события (ты даже не знаешь что это такое) ни приоритеты ни строгое соблюдения порядка исполнения триггеров, вот с чего тебя начало беспокоить байтосчитание?
Старый 01.11.2012, 17:06
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
DioD, да мало ли, хочу сделать скрипт карты мене разборчивым, может быть...
Интересно чё это вы с таким негативом, злит что ли? Давайте без негатива и троллинга обсуждать этот вопрос...
Старый 01.11.2012, 17:35
DioD

offline
Опыт: 45,134
Активность:
  • СЛУШАЙТЕ РЕБЯТА Я ХОЧУ ПЯТОЕ КОЛЕСО НА ВИЦ ПОСТАВИТЬ!
гы лол зачем?
  • ДА ЭТО ЧТОБЫ МАШИНА БЫЛА МЕНЕЕ УПРАВЛЯЕМА
ты что дурак?
  • ДАВАЙ БЕЗ НЕГАТИВА А?
okay...
ps плюсуйте меня нэжно
Старый 01.11.2012, 18:11
Закрытая тема

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

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

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

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



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