Hares
полупротосс
offline
Опыт:
6,966Активность: |
Ошибка с глобальными переменными
Делал спелл из темы "Заклинания на заказ". Сам спелл в принципе готов, однако при написании графики (а на неё я имел наполеоновские планы), я столкнулся со странной проблемой: Вар сбрасывает переменные, да ещё и пляс ко всему, делает это как ему вздумается.
» Заявка:
Dartek:
» Код спелла
((код
define
{ int = integer; bool = boolean; void = nothing; } define
{ MDX = ".mdl"; PI = 3.1415926; ABIL = 'MgWl'; COUNT = 100; BLOCK = 'Blck'; RANGE = 300; COUNTRUNES = 30; RUNE = "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes"; RUNEVARIATIONS = 3; PERIODICRUNE = 0.5; FIRE = "Doodads\\Cinematic\\FrostTrapUp\\FrostTrapUp"; FIREVARIATIONS = 1; COUNTFIRES = 2; PERIODICFIRE = 3; } globals
int Bound = -1; int EBound = -1; timer array Timers; int array Index; destructable array Block; effect array Rune; effect array Fire; endglobals void CreateRune()
{ BJDebugMsg("I want to create rune effect..."); string s = RUNE + I2S(GetRandomInt(1, RUNEVARIATIONS) - 1) + MDX; string s = "Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl"; real Range = RANGE; BJDebugMsg("Finding the timer..."); integer i = 0; timer t = GetExpiredTimer(); BJDebugMsg(I2S(GetHandleId(t))); BJDebugMsg(I2S(EBound)); whilenot(t == Timers[i] or i > EBound) {BJDebugMsg(I2S(i) + ": " + I2S(GetHandleId(Timers[i]))); i++} BJDebugMsg(I2S(i) + ": " + I2S(GetHandleId(Timers[i]))); BJDebugMsg("The timer is found."); BJDebugMsg("Finding coordinates..."); location Loc = GetSpellTargetLoc(); real x = GetLocationX(Loc); real y = GetLocationY(Loc); RemoveLocation(Loc); Loc = null; BJDebugMsg("Calculating coordinates..."); real Angle = 2*PI / COUNTRUNES * Index[i]; real x1 = x + Range * Cos(Angle); real y1 = y + Range * Sin(Angle); BJDebugMsg("Creating rune..."); Rune[COUNTRUNES * i + Index[i]] = AddSpecialEffect(s, x1, y1); BJDebugMsg("Rune created."); BJDebugMsg(I2S(i) + ": " + I2S(Index[i])); Index[i]++ BJDebugMsg(I2S(i) + ": " + I2S(Index[i])); BJDebugMsg(I2S(COUNTRUNES)); if Index[i] >= COUNTRUNES {DestroyTimer(t)} t = null; } void CreateFire()
{ string s = FIRE + I2S(GetRandomInt(1, FIREVARIATIONS) - 1) + MDX; real Range = RANGE; integer i = 0; timer t = GetExpiredTimer(); whilenot(t == Timers[i]) {i++} location Loc = GetSpellTargetLoc(); real x = GetLocationX(Loc); real y = GetLocationY(Loc); RemoveLocation(Loc); Loc = null; real Angle = 2*PI / COUNTFIRES * Index[i]; real x1 = x + Range * Cos(Angle); real y1 = y + Range * Sin(Angle); Fire[COUNTFIRES * i + Index[i]] = AddSpecialEffect(s, x1, y1); Index[i]++ if Index[i] >= COUNTRUNES {DestroyTimer(t)} t = null; } void CreateEffects()
{ BJDebugMsg("I want to create effects..."); EBound ++
int i = EBound; timer t = CreateTimer(); Timers[i] = t; BJDebugMsg(I2S(GetHandleId(t))); BJDebugMsg(I2S(i) + ": " + I2S(GetHandleId(Timers[i]))); Index[i] = 0; BJDebugMsg(I2S(Index[i])); TimerStart(t, PERIODICRUNE, true, function CreateRune); t = CreateTimer(); Timers[i] = t; Index[i] = 0; TimerStart(t, (PERIODICFIRE/COUNTRUNES*COUNTFIRES), true, function CreateFire); EBound -- t = null; } bool Trig_Magic_Wall_Basic_cJass_Conditions()
{return GetSpellAbilityId() == ABIL} void Trig_Magic_Wall_Basic_cJass_Actions()
{ Bound ++ integer b = Bound; real Range = RANGE; location Loc = GetSpellTargetLoc(); real x = GetLocationX(Loc); real y = GetLocationY(Loc); RemoveLocation(Loc); Loc = null; real x1, y1; real Angle; integer i = 0; integer a; whilenot (i > COUNT - 1) { a = b * COUNT + i; Angle = 2*PI / COUNT * i; x1 = x + Range * Cos(Angle); y1 = y + Range * Sin(Angle); Block[a] = CreateDestructable(BLOCK, x1, y1, 2*PI - Angle, 1, 0); i++ } ExecuteFunc("CreateEffects"); CreateEffects(); TriggerSleepAction(20.00)
i = 0 whilenot (i > COUNT - 1) { a = b * COUNT + i; KillDestructable(Block[a]) RemoveDestructable(Block[a]) i++ } Bound-- } =========================================================================== void InitTrig_Magic_Wall_cJass() { int i = 0; whilenot(i == RUNEVARIATIONS) { Preload(RUNE + I2S(i) + MDX); i++ } i = 0; whilenot(i == FIREVARIATIONS) { Preload(FIRE + I2S(i) + MDX); i++ } Preload("Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl"); trigger t = CreateTrigger(); TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT); TriggerAddCondition(t, Condition(function Trig_Magic_Wall_Basic_cJass_Conditions)); TriggerAddAction(t, function Trig_Magic_Wall_Basic_cJass_Actions); gg_trg_Magic_Wall_cJass = t; t = null; } )) Барьеры создаются, удаляются, но со спецэффектами полнейший АДЪ. (Да, я знаю, что они не удаляются, до этого ещё не дошло). Также тут можно найти кучу тестовых фич (типа спецэффекта "Abilities\\Spells\\Items\\AIem\\AIemTarget.mdl", который выбран от балды).
А теперь о сути проблемы.
Как видно в коде, на экран регулярно выводятся хендлы. Вот что было установлено:
Если надо, могу выложить карту. Скрины прилагаются.
Hares добавил:
Да, я знаю, что в заявке написано на GUI, я параллельно и так, и так делаю. Просто ведь надо разобраться, как ето реализовывается. Hares добавил: Более того, я знаю, все эти переменные можно было не брать в массив, ибо mui не обязательно. Более того, я легко бы и хеш-таблицами обошёлся. Но это просто не по Кодексу Истинного Программиста, а именно не является конечной продукцией. |
09.01.2012, 21:41 | #1
+2/−6
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,258Активность: |
код не смотрю@ответ пишу используй хеш таблицу или, если совсем жмет кое-где, структуры, ибо так, как ты делаешь, слишком легко ошибиться. Хеш спасает мир! |
09.01.2012, 23:04 | #2
+2/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
Clamp, Это не ответ на вопрос, а уход от него. Проблема остаётся проблемой, И ЕЁ РЕШЕНИЕ НЕОБХОДИМО. Поэтому решаем, друзья мои, решаем. Хотя если решение не найдётся, придётся хешать проблему. |
09.01.2012, 23:23 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,258Активность: |
а ну да, ты же "истинный программист", есть проблема - делай так, чтобы не было видно, а что за ней куча других возникает и вообще подход наихреновейший - проблемы заказчика.
Тебе сказали самое верное решение проблемы - не создавать её. |
09.01.2012, 23:33 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Faion
Noblesse Oblige
offline
Опыт:
30,395Активность: |
Цитата:
И нафиг этот индийский код? Нафиг создаешь лишние переменные x1, y1? Нафиг переменная range, юзай значение напрямую. 2*PI мог бы на калькуляторе просчитать и записать значение ._. В общем ужс. |
|
09.01.2012, 23:39 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
Faion:
Я не нашёл ф-ий, возвращающий координаты каста, но помню, что они были... Локации я не люблю, вот и ухожу к координатам. Faion:
Предыдущие могут использоваться ещё. Faion:
В конечной версии значение этой переменной будет изменено на ф-ию, и это сделано благоразумно вперёд. Faion:
В некоторых случаях может потребоваться использование простого пи или его частей. |
09.01.2012, 23:52 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Clamp
Lost in space
offline
Опыт:
71,258Активность: |
GetSpellTargetX например...
И как же они могут использоваться?
И куда же в заказе влезает функция? Дефайн значения не катит?
Ну считай каждое, 2 кнопки, не сломаешься, а машине легче. |
09.01.2012, 23:56 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hares
полупротосс
offline
Опыт:
6,966Активность: |
Clamp:
Конечный результат подразумевает, что у абилки может быть несколько лвлов, и тогда я использую загрузку пара из эффектов этой абилки, чтоб мододел мог использовать только РО, не залезать в РТ. Угу? Clamp:
Арифметика практически не замедляет процесс. Я маразматик-фанатик-энтузиаст. Чего ты от меня хочешь? |
10.01.2012, 00:00 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Doc
offline
Опыт:
63,163Активность: |
хеш тоже. |
10.01.2012, 03:27 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|