Раньше я конвертил гуи триггеры с событие каста и условием id спелла. На сколько я знаю, это очень малоэффективно, т.к. каждый такой триггер срабатывает при касте любого спелла.
Потом я понял, что достаточно сделать один триггер с событием каста для каждого игрока, но тут я столкнулся с вопросом. если в функции-обработчике делать так:
if spellId = spell1 then
-- код спелла
elseif spellId = spell2 then
-- код спелла
elseif ...
То если код некоторых способностей слишком велик, то файл будет тянуть на > 2к строк кода, и вся эта каша такое себе.
Как делаете вы? Как делать лучше?

Если на луа, то можно что-то вроде
local id2callback = []
function registerSpell(id, callback){
	id2callback[id] = callback
}
...
function runSpell(id){
	local callback = id2callback[id[
	if (type(callback) == 'function){
		callback()
	}
}
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
29
Если джасс умеет в хеш сохранять функцию - переделать потом стандартные ивенты на хеш будет тривиально.
13
Если на луа, то можно что-то вроде
local id2callback = []
function registerSpell(id, callback){
	id2callback[id] = callback
}
...
function runSpell(id){
	local callback = id2callback[id[
	if (type(callback) == 'function){
		callback()
	}
}
Принятый ответ
8
Примерно к такому я пока и пришел. Просто раньше я делал по принципу "я бы жил по понятиям, но живу как понял", т.е. каша из гуи конвертов, cJASS там же. Сейчас я перебрался на Lua, появилось больше свободы и возможностей, но у меня много вопросов по организации всего этого дела. Хочется сразу применять хорошие практики.

Всем спасибо!
28
Doc, можно сохранить имя функции и вызывать её потом через ExecuteFunc. А можно воспользоваться vJass и сохранить как число.
26
PT153:
Doc, можно сохранить имя функции и вызывать её потом через ExecuteFunc. А можно воспользоваться vJass и сохранить как число.


CodeSendUnitAttr (source,target)
RunCode  (hash,"my_spell")
можно в одну строку, если добавить дефайн
 define CastSpellST   (spellname,source,target)   = {CodeUnitSource = source; CodeUnitTarget = target ;RunCode  (hash,s); }
15
На сколько я знаю, это очень малоэффективно, т.к. каждый такой триггер срабатывает при касте любого спелла.
Обработчики событий каста способностей делаются не для оптимизации, а для удобства программиста, чтобы был единый интерфейс без репетативного повторения кода условий от триггера к триггеру.
С точки зрения именно оптимизации, это пердеж в подушку.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.