quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
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 | #1
+0/−1
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Sladkoegka
Забыл что хотел...
offline
Опыт:
7,437Активность: |
|
01.11.2012, 10:34 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
Sladkoegka, я сам прекрасно знаю, но без обид, хочу послушать jasseров и прочих, насколько это оправдано, и что лучше по их мнению, что и как ме и без этого известно.... |
01.11.2012, 10:40 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J64_
offline
Опыт:
4,724Активность: |
Это зависит от ситуации.
Вы так вместите, относительно, слишком мало способностей, и они всегда должны будут начинаться с символа A.
Имея ввиду что строки это объекты, которые не удаляются и которых вообще нужно остерегаться, можно использовать boolexpr. А можно ещё перебирать, определённым образом, все возможные варианты способностей с помощью условных операторов, так будет без массивов, ограничений, boolexpr и прочего. Но с помощью boolexpr можно творить много чудес |
01.11.2012, 10:53 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
Judycaster64, перебирать то зачем, у нас есть массив в котором ссылки на функции (эх близзы скотины, code не может быть массивом) по ид скилла главное быстро найти функцию, но вот еще 1 проблема редактирование и добавление скиллов становится несколько неудобным...
quq_CCCP добавил: Judycaster64, кстати а с какого перепуга способности не с "А" начинаются? |
01.11.2012, 10:57 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
callback onSpellCast(`A000`) тебе в помощь. В целом это беготня за байтами, к готовому продукту не приблизит, и даже отдалит. Усложнит архитектуру, ощутимой пользы не будет.
Сам код костыльный, можно сделать все существенно круче. В пару строк. |
01.11.2012, 11:17 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
Faion, ну это я и хочу, только жду дельных предложений а не журавля в небе...
quq_CCCP добавил: Faion, про архитектуру это и так понятно, но все же постараюсь, а про байты это ты загнул, польза будет значительно ощутимее, хотя это зависит от кол-ва скиллов если их будет сотни 4 то ой как зарешает, + загрузка карты будет быстрее.... |
01.11.2012, 11:24 | #7
+0/−2
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
quq_CCCP:
Faion: quq_CCCP: Мечтать не вредно. quq_CCCP: Если их будет хотя бы ~ 1 млн, ага. quq_CCCP: Ага, на долю секунды. |
01.11.2012, 12:06 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
Faion, секунды на 4, но не будем спорить, про callback а не лучше ли ExecuteFunc() ? темболее несколько проще искасть? Сам то что используеш... |
01.11.2012, 12:30 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Темак
jass for everyone
offline
Опыт:
7,200Активность: |
А если ExecuteFunc("Function_" + AbilityId2String(AbilityId2String()))? |
01.11.2012, 13:04 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
Temak1, интересная идея но нельзя ли покороче? да и если я не хочу создавать функции с дебильными именами? |
01.11.2012, 13:42 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
|
01.11.2012, 13:48 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
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 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
quq_CCCP, скорп передает тебе:
скинь туда что он упоротый ему советуют норм способ, он решил выбрать самый тормознутый из всех Sladkoegka:
Нету там никакого vjass'a |
01.11.2012, 14:06 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
колбеки и фабрика событий высраны 9999 лет назад, используйте уже опыт реальных проектов а не придумайте своё УГ |
01.11.2012, 14:12 | #15
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
|
01.11.2012, 14:16 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
|
01.11.2012, 14:16 | #17
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
тебе не нужны ни мета события (ты даже не знаешь что это такое) ни приоритеты ни строгое соблюдения порядка исполнения триггеров, вот с чего тебя начало беспокоить байтосчитание? |
01.11.2012, 17:06 | #18
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
quq_CCCP
Я белый и пушистый!
offline
Опыт:
94,598Активность: |
DioD, да мало ли, хочу сделать скрипт карты мене разборчивым, может быть... Интересно чё это вы с таким негативом, злит что ли? Давайте без негатива и троллинга обсуждать этот вопрос... |
01.11.2012, 17:35 | #19
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
гы лол зачем?
ты что дурак?
okay...
ps плюсуйте меня нэжно |
01.11.2012, 18:11 | #20
+10/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|