MTT, сделал термоядерный триггер, каждые 0.01 секунд выделить всех в зоне игровой карты, и еще в пару областях пустых, и добавить всех в группу. игра виснет, теперь сделал триггер 2 который выключает этот триггер где все выделяются и очищает переменную отсюда и всё, перестает глючить, всё чисто.
Добавлено (28-12-2009, 17:41) --------------------------------------------- Не отсюда а отряда, с телефона сижу...
Arius, Игра перестает виснуть изза отключения триггера и, соответственно если ты его включил опять, будет лагать с тойже интенсивностью, что и до этого
function MoveRocketGroupActions takes nothing returns nothing local integer i = 1 if(udg_a > 0) then call UnitDamageTarget(udg_Rocket[udg_a],GetEnumUnit(),100.00,true,false,ATTACK_TYPE_MELEE,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS) call RemoveUnit(udg_Rocket[udg_a]) call TriggerExecute(gg_trg_VzrivRocket) set udg_b = udg_a + 1 loop exitwhen i > udg_NumberOfRockets - udg_a set udg_Rocket[udg_b - 1] = udg_Rocket[udg_b] set udg_Target[udg_b - 1] = udg_Target[udg_b] set udg_b = udg_b + 1 set i = i + 1 endloop endif endfunction
function Trig_Move_Rocket_Actions takes nothing returns nothing local real x1 = GetUnitX(udg_Rocket[udg_a]) local real y1 = GetUnitY(udg_Rocket[udg_a]) local real x2 = GetUnitX(udg_Target[udg_a]) local real y2 = GetUnitY(udg_Target[udg_a]) local real dist = SquareRoot((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) local real pa = 57.295827 * Atan2(y2-y1,x2-x1) local real px = x1 + udg_RocketSpeed[GetPlayerId(GetOwningPlayer(udg_Rocket[udg_a])) + 1] * Cos(pa * .0174532) local real py = y1 + udg_RocketSpeed[GetPlayerId(GetOwningPlayer(udg_Rocket[udg_a])) + 1] * Sin(pa * .0174532) local integer i = 1 local integer i2 = 1 local group g = CreateGroup() loop exitwhen i > udg_NumberOfRockets call SetUnitX(udg_Rocket[udg_a],px) call SetUnitY(udg_Rocket[udg_a],py) call GroupEnumUnitsInRange(g,x1,y1,100.,Condition(function MoveRocketGroupCondition)) call ForGroup(g,function MoveRocketGroupActions) call GroupClear(g) call DestroyGroup(g) if(dist <= 50.) then call RemoveUnit(udg_Rocket[udg_a]) set udg_b = udg_a + 1 loop exitwhen i2 > udg_NumberOfRockets - udg_a set udg_Rocket[udg_b - 1] = udg_Rocket[udg_b] set udg_Target[udg_b - 1] = udg_Target[udg_b] set udg_b = udg_b + 1 set i2 = i2 + 1 endloop set udg_NumberOfRockets = udg_NumberOfRockets - 1 endif set udg_a = udg_a + 1 if(udg_a > udg_NumberOfRockets) then set udg_a = 0 endif set i = i + 1 endloop set g = null endfunction
//=========================================================================== function InitTrig_Move_Rocket takes nothing returns nothing set gg_trg_Move_Rocket = CreateTrigger() call TriggerRegisterTimerEventPeriodic(gg_trg_Move_Rocket,0.01) call TriggerAddAction(gg_trg_Move_Rocket,function Trig_Move_Rocket_Actions) endfunction
MTT, когда я использую способность у меня включается триггер на 10 секунд где каждые 0.01 секунд пикаются отряды и смещаются, в это время у меня не тормозит, триггер выключается через 10 секунд, переменная очищается, память не забита. И дальше всё нормально.
А тот термоядерный триггер тормозил скорее всего из-за того что всё юниты на карте пикались, а карта немаленькая, и юнитов много.
Добавлено (28-12-2009, 18:17) --------------------------------------------- Так вот я не понимаю, триггер где юниты пикаются не постоянно ведь работает, когда он выключается очищай переменную. Это про один подобный триггер говорю, не про все.
MTT, Откуда же я знал, что это точка Стой... тогда триггер будет немножечко другой.
Добавлено (28-12-2009, 18:49) --------------------------------------------- Р.S. Скинь мне первый триггер, где отлавливается применение способности. Я сделаю тебе таймером и избавлю тебя от назойливой точки.
[DUОS], Ошибка пропала, но теперь функция действуем совсем нетак. Все ракеты мгновенно перемещаются к какойта точкеи там дергаются. Но если подойти к ней, то будет происходить действие, которое и должно быть
Добавлено (29-12-2009, 14:03) --------------------------------------------- Эта точка - центр карты....
MTT, Тебе в голову приходило, что нужно полярку разворачивать? Вот смотри. Сейчас тебя научу. Открываем любой редактор JASS-кода. Вбиваем туда в поиск функции "PolarProjectionBJ". Нам выдаст такую начинку:
Здесь можно увидеть серьёзную утечку - не обнуляется точка (location). В данном случае отлично бы подошли координаты. Ты двигаешь udg_Rocket к udg_Target. udg_Rocket у тебя равна GetLastCreatedUnit() . P.S.: Если хочешь создать юнитов методом CreateNUnitsAtLoc(), то лучше откажись от этой затеи. Всегда возвращается группа юнитов, для одного юнита уместна функция CreateUnit(). Получаем, что CreateNUnitsAtLoc() надо заменить на CreateUnit(). Чтобы это сделать, можно часто используемые элементы или большие фрагменты кода занести в локальные переменные. Распишу по шагам, что и к чему:
1. Тут очень часто используется GetAttacker(). Занесём его в локальную переменную следующим образом:
localunitattacker = GetAttacker()
Смысл этого шага состоит в том, что мы уменьшаем вызовы функций, что серьёзно влияет на производительность карты. 2. GetAttackedUnitBJ() лучше также занести в локальную переменную. Тут есть один нюанс - GetAttackedUnitBJ() ничего не делает, кроме вызова native-функции GetTriggerUnit(). Поэтому я считаю будет разумно заменить её. Получим:
localunitattacked = GetTriggerUnit()
3. У тебя используется AngleBetweenPoints(). Лучше развернуть эту функцию до native-примитивов. Посмотрим её начинку:
Довольно большая формула. Важный факт о подобных математических функциях - native выдают результат в радинах, а BJ - в градусах. Итак, угол между точками мы заносим в локальную переменную. Есть одно НО - нужно построить эту формулу на координатах. bj_RADTODEG - число конвертационное и равно оно 57.295827. Запомни это. Итак, вносим в локальную переменную нашу безутечную формулу угла между точками:
4. Перед тем, как объявлять эту локальную переменную, возникает необходимость задать выше неё ещё 4 локальные переменные, которые получат координаты атакующего и атакованного воина. Вносим:
5. Теперь у нас 6 локальных переменных - атакующий воин, атакованный воин, 4 следующих - получение их координат, а последняя - это угол между ними. Их очень удобно регулировать, согласись. У тебя в теле CreateNUnitsAtLoc() есть также полярная проекция. Разворачиваем её по начинке. В качестве угла используем нашу локальную переменную angle, а в качестве координат источника используем координаты атакующего воина. Получается, нам нужно добавить ещё две локальные переменные - полярные координаты X и Y. Кстати, в данном случае можно вообще убрать умножение на конвертационное число в переменной угла, т.к. Sin() и Cos() - это native-функции, требующие радианы. Добавляем такие переменные:
localrealpolarx = xa + 150 * Cos(angle) localrealpolary = ya + 150 * Sin(angle)
6. Теперь, собственно, заменяем CreateNUnitsAtLoc() на нативку CreateUnit(), в которой всё просто и понятно:
set udg_Rocket[udg_NumberOfRockets] = CreateUnit(GetOwningPlayer(attacked),'e000',polarx,polary,angle * 57.295827)
7. Т.к. тип unit наследуется от handle, нужно обнулить переменные attacker и attacked. Делается это следующим образом:
set attacker = null set attacked = null
Вот, в принципе, я рассказал, как убрать локации по начинке функции. Кажись, что статью накатал О_о.
Какими только ленивыми не становятся современные кодеры...
Это не лень, а удобство. Что лучше, постоянно лазить в список функций, потом думать как оптимизировать функцию, или не тратя времени инклуднуть 1 библиотеку, которая это всё сделает за тебя? Это далеко не лень. Лень, это когда у кодера один раз что-то не получилось и он приходит на форум, говоря "Сделайте мне то-то то-то", а не пробует это всё сам сделать. И раз уш тема на то зашла, то удачно тебе посидеть на JASS2 в то время когда выйдут уже dJass, c++Jass и т.п. Тоже самое с твоими координатами. Вместо простейших операций с векторами, ты решаешь делать муторную работу с координатами. Это, случаем, не для понта? Чтобы сказать "видите какой я крутой кодер, без ваших быдлоДжассов всё сделал, все прогибайтесь под меня" и так далее.
Сорнемус, Лол. Понимаешь, не у всех нубов какие кодят тупые карты, юзая быдлотригги типа тебя есть JNGP, обычный World Editor не поддерживает ваши быдлов и быдос Jass'ы. А скажи, зачем вообще юзать жалкие пародии на JASS? Кодь на C++! Бери оригинал! Или ты свыкся с быдлосJass'oм? Учи DGUI, иди дальше. Не все здесь понимают быдлоcJass. И никто мне не запретит называть быдлоcJass ИМЕННО ТАК! Вскрой парсер этого быдлоудобства и обрати свой взор на эту антибыдлобж. -_-
И c/vJass созданы не для "быдлокодеров" как ты считаешь, а для других целей: vJass - разширение возможностей Jass'а, например, структурами, так как они действуют быстрей кеша. cJass - для упрощения написания кода, так как JASS2 синтаксически походит на Turing и не отличается лаконичностью. Кроме того, благодаря дефайнам можно делать очень интересные вещи, например, сделать из одного integer 3 коротких числа, в которых можно хранить цвет, или ещё что-то. Оу, нервишки пошаливают.
Quote (|DUОS|)
И никто мне не запретит называть быдлоcJass ИМЕННО ТАК!
А я и не запрещаю тебе называть его так. Твоё право.
Quote (|DUОS|)
какие кодят тупые карты, юзая быдлотригги типа тебя
Да? А ты хоть видел что я делал, кроме того что я кидал в школе?
Quote (|DUОS|)
А скажи, зачем вообще юзать жалкие пародии на JASS?
Читай выше.
Quote (|DUОS|)
Учи DGUI, иди дальше.
Что я и делаю. А тебе удачно посидеть, пое попарить себе мозги с JASS2.
Quote (|DUОS|)
Кодь на C++! Бери оригинал!
Дай мне исходник Вара.
Quote (|DUОS|)
Не все здесь понимают быдлоcJass.
Да тут вобще нормальных людей нет. Такие тупейшие вопросы задают, что ужас.
Quote (|DUОS|)
Вскрой парсер этого быдлоудобства
Нарушаю авторское право, и изза уважения к его создателям не хочу.
Quote (|DUОS|)
и обрати свой взор на эту антибыдлобж
Ну и? Обратил. Что дальше?
Добавлено (30-12-2009, 18:20) --------------------------------------------- Кстати, я практически уверен, что тебе это всё не нравится так как ты просто не можешь это освоить. У меня так-же было. Не осваивал - не нравилось. А теперь понял насколько это всё удобно.
Добавлено (30-12-2009, 18:36) --------------------------------------------- Эх, видели бы это Векс и Адольф с ВД.
Кстати, я практически уверен, что тебе это всё не нравится так как ты просто не можешь это освоить
Лол. Я уважаю работу по парсеру, проделанную Вексом. Да знаю я, что векторы быстрее коордов. Знаю, что такое #include. Но я НЕ БУДУ и НЕ СОБИРАЮСЬ юзать это извращение.