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

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

Закрытая тема
 
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
Спелл мува.
Помогите разрешить проблему! При запуске этого спелла варик вылетает с критом. Как это исправить?
» Сам код
function CheckCastingSpellId takes nothing returns boolean
    return GetSpellAbilityId() == 0x41303234
endfunction

function lightningarrow takes nothing returns nothing
    local unit dummy = CreateUnit(GetOwningPlayer(GetSpellAbilityUnit()),0x6E303054,GetUnitX(GetSpellAbilityUnit()) + 30.,GetUnitY(GetSpellAbilityUnit()) + 30.,GetUnitFacing(GetSpellAbilityUnit()))
    local location loc1 = GetUnitLoc(dummy)
    local location loc2 = GetUnitLoc(GetSpellTargetUnit())
    local real a = AngleBetweenPoints(loc1,loc2)
    call UnitAddAbility(dummy,0x414F636C)
    loop
        exitwhen DistanceBetweenPoints(loc1,loc2) <= 50.
        call SetUnitX(dummy,GetUnitX(dummy) + 50 * Cos(a * .0174532))
        call SetUnitY(dummy,GetUnitY(dummy) + 50 * Sin(a * .0174532))
    endloop
    if(DistanceBetweenPoints(loc1,loc2) <= 50.) then
        call IssueTargetOrderById(dummy,852119,GetSpellTargetUnit())
        call TriggerSleepAction(.3)
        call RemoveUnit(dummy)
        call RemoveLocation(loc1)
        call RemoveLocation(loc2)
        set dummy = null
        set loc1 = null
        set loc2 = null
    endif
endfunction

//============================================================
function InitTrig_Lightning takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(trig,ConvertPlayerUnitEvent(273))
    call TriggerAddCondition(trig,Condition(function CheckCastingSpellId))
    call TriggerAddAction(trig,function lightningarrow)
    set trig = null
endfunction
Старый 05.11.2009, 01:20
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
  1. Иф не нужен, т.к. у тебя в любом случае меньше 50 после цикла.
  2. Закомментируй все строчки, потом по одной раскомментируй, найдешь причину вылета.
  3. Возможно у тебя элементарно бесконечный цикл.
Старый 05.11.2009, 01:23
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
локации сами по себе двигатся не будут) добавь в цикл call movelocation(loc1,getunitx(dummy),getunity(dummy))
ну вобщем у тебя
бесконечный цикл
Старый 05.11.2009, 01:30
Arty3ooo
...
offline
Опыт: 3,125
Активность:
з.ы: "0x414F636C" смысл этих понтов, если ты юзаешь бж и локации Оо
Старый 05.11.2009, 08:35
Chester
Best for you!
offline
Опыт: 5,702
Активность:
Arty3ooo:
з.ы: "0x414F636C" смысл этих понтов, если ты юзаешь бж и локации Оо
Все он правильно делает, только ему ещё нужно избавится от использования точек.
Старый 05.11.2009, 10:51
tgonta
Pixelated Sora Coder
offline
Опыт: 3,160
Активность:
function CheckCastingSpellId takes nothing returns boolean
    //Проверяем, та ли способность.
    return GetSpellAbilityId() == 0x41303234
endfunction

function lightningarrow takes nothing returns nothing
    //Дамми.
    local unit dummy = CreateUnit(GetOwningPlayer(GetSpellAbilityUnit()),0x6E303054,GetUnitX(GetSpellAbilityUnit()) + 30.,GetUnitY(GetSpellAbilityUnit()) + 30.,GetUnitFacing(GetSpellAbilityUnit()))
    //Получаем точки,угол и дистанцию.
    local real x1 = GetUnitX(dummy)
    local real y1 = GetUnitY(dummy)
    local real x2 = GetUnitX(GetSpellTargetUnit())
    local real y2 = GetUnitY(GetSpellTargetUnit())    
    local real a = AngleBetweenPoints(Location(x1,y1),Location(x2,y2))
    //Даём дамми способность "Цепь молний".
    call UnitAddAbility(dummy,0x414F636C)
    loop
        //Дамми бежит за целью до тех пор, пока расстояние не станет >= 50.
        exitwhen SquareRoot((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)) <= 50.
        //Двигаем даммика.
        call SetUnitX(dummy,x1 + 50 * Cos(a * .0174532))
        call SetUnitY(dummy,y1 + 50 * Sin(a * .0174532))
    endloop
    //Расстояние >= 50 - применяем "Цепь молний" на цель.
    call IssueTargetOrderById(dummy,852119,GetSpellTargetUnit())
    call TriggerSleepAction(.3)
    //Удаляем и обнуляем юнита.
    call RemoveUnit(dummy)
    set dummy = null
endfunction

//============================================================
function InitTrig_Lightning takes nothing returns nothing
    local trigger trig = CreateTrigger()
    local integer i = 0
    loop
        exitwhen i == 12
        call TriggerRegisterPlayerUnitEvent(trig,Player(i),ConvertPlayerUnitEvent(273),null)
        set i = i + 1
    endloop
    call TriggerAddCondition(trig,Condition(function CheckCastingSpellId))
    call TriggerAddAction(trig,function lightningarrow)
    set trig = null
endfunction
Пораскрывал всё и закомментировал. Посмотрите.
Один вопрос из другого: Я нюхом чую, что boolexpr filter в описании TriggerRegisterPlayerUnitEvent служит для отбора игроков. Но как её использовать - я без понятия. Просьба пояснить, тогда я избавлюсь от цикла.
Старый 05.11.2009, 12:31
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Дамми бежит за целью до тех пор, пока расстояние не станет >= 50.
ололо, он не будет бежать. он почти мгновенно переместится в нужную точку. юз таймер.
AngleBetweenPoints(Location(x1,y1),Location(x2,y2))
утечка, напиши свою функцию AngleBetweenCoords
GetTriggerUnit (т.е. GetSpellAbilityUnit()) лучше занести в локалку
Старый 05.11.2009, 13:27
Sebra

offline
Опыт: 5,603
Активность:
AngleBetweenPoints(Location(x1,y1),Location(x2,y2))
Atan2(x2-x1,y2-y1)
Старый 05.11.2009, 18:37
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Sebra, а помойму вот так:
Код:
function GetAngleBetweenCoords takes real xa, real xb, real ya, real yb returns real
 return 57.295827*Atan2(yb-ya, xb-xa)
endfunction
Старый 05.11.2009, 20:07
adic3x

offline
Опыт: 108,439
Активность:
а помойму вот так
возможно по вашему и так, но мы не считаем необходимым переводить градусы в радианы и назад по поводу и без
однако есть и доля правды, атан2 принимает первым аргументов у, а только потом х
Старый 05.11.2009, 20:19
Sebra

offline
Опыт: 5,603
Активность:
Bee:
Sebra, а помойму вот так:
Оно может и так, но делать из этого функцию...
ADOLF:
однако есть и доля правды, атан2 принимает первым аргументов у, а только потом х
Ваша правда, писал по памяти, извиняйте. :)
Я для расстояний использую вот такое: (тоже по памяти)
function Hypot takes real dx, real dy returns real
    return sqrt(dx*dx+dy*dy)
endfunction
...
set rasst = Hypot(x1-x2,y1-y2)
Старый 05.11.2009, 21:15
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
Старый 05.11.2009, 22:03
Sebra

offline
Опыт: 5,603
Активность:
Ха. Bee, я эту тему читаю регулярно, просто хотел сказать, что координаты вычитаю ещё в аргументах функции.
Но ещё смешнее, что вторым постом там не кто иной, как ADOLF, упоминает не какую нибудь функцию, а именно эту, и переводит в градусы.
Это так, к слову.
я тогда был маленький и нешарил - прим. адик

Отредактировано ADOLF, 06.11.2009 в 21:57.
Старый 06.11.2009, 21:51
Закрытая тема

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

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

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

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



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