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

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

Закрытая тема
 
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
Спелл вызывает фатал №2
фатал вылетает каждый раз в начале применения спелла (не обязательно первого)
» code
Код:
globals
    unit array lbcaster
    unit array lbdummy
    real array lbdist
    real array lbrx
    real array lbry
    lightning array lbln
endglobals

function LBallMove takes nothing returns nothing
    local integer i  = get_object_iparam(GetExpiredTimer(),"LIndex")
    local unit    b  = lbdummy[i]
    local unit    gu
    local group   g
    local real    d
    local real    a
    local real    rx
    local real    ry
    
    set lbdist[i] = lbdist[i] + 1
    call SetUnitX(b, GetUnitX(b) + 3 * Cos(.0174 * GetUnitFacing(b)))
    call SetUnitY(b, GetUnitY(b) + 3 * Sin(.0174 * GetUnitFacing(b)))
    
    if (lbdist[i] - I2R(R2I(lbdist[i] / 30)) * 30) == 0 then
        call DestroyLightning(lbln[i])
        set g = CreateGroup()
        set d = GetRandomReal(0, 500)
        set a = GetRandomReal(0, 359)
        set lbrx[i] = GetUnitX(b)+ d * Cos(a * .0174)
        set lbry[i] = GetUnitY(b)+ d * Sin(a * .0174)
        set lbln[i] = AddLightningEx("CHIM", true, GetUnitX(b), GetUnitY(b), 260, lbrx[i], lbry[i], GetLocationZ(Location(lbrx[i],lbry[i])))
        call DestroyEffect(AddSpecialEffect("Abilities\\Weapons\\Bolt\\BoltImpact.mdl",lbrx[i],lbry[i]))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Items\\AIlb\\AIlbSpecialArt.mdl",lbrx[i],lbry[i]))
        call GroupEnumUnitsInRange(g, lbrx[i], lbry[i], 200, null)
        loop
            set gu = FirstOfGroup(g)
            exitwhen gu == null
            call GroupRemoveUnit(g,gu)
            ...
        endloop
        call DestroyGroup(g)
    endif
    call MoveLightningEx(lbln[i], true, GetUnitX(b), GetUnitY(b), 260, lbrx[i], lbry[i], GetLocationZ(Location(lbrx[i],lbry[i])))
    if lbdist[i] > 500 then
        call DestroyLightning(lbln[i])
        call RemoveUnit(lbdummy[i])
        set lbcaster[i] = null
        set lbdummy[i]  = null
        set lbln[i]     = null
        call flush_object(GetExpiredTimer())
        call DestroyTimer(GetExpiredTimer())
    endif
    set g = null
    set b = null
endfunction

function CreateLightningBall takes nothing returns nothing
    local timer   t = CreateTimer()
    local integer i = 0
    loop
        exitwhen lbdummy[i] == null
        set i = i + 1
    endloop
    call BJDebugMsg(I2S(i))
    set lbcaster[i] = GetTriggerUnit()
    set lbdummy[i] = CreateUnit(GetOwningPlayer(lbcaster[i]), 'e000', GetUnitX(lbcaster[i]), GetUnitY(lbcaster[i]), GetUnitFacing(lbcaster[i]))
    call SetUnitScale(lbdummy[i], 4, 0, 0)
    call AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareTarget.mdl", lbdummy[i], "chest")
    call AddSpecialEffectTarget("Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl", lbdummy[i], "chest")
    set lbdist[i] = 0
    call set_object_iparam(t, "LIndex", i)
    call TimerStart(t, 0.02, true, function LBallMove)
    set t = null
endfunction

заранее спасибо)
Старый 30.05.2009, 14:24
J
expert
offline
Опыт: 48,447
Активность:
http://xgm.guru/forum/showthread.php?t=13118
там мануал прикреплен к первому посту, читай
Старый 30.05.2009, 14:34
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
делал на кеше - не так, начал делать на массивах - опять не так =/ начну делать через структуры, опять что-то непонравится... не, нафик надо, небуду ничего переделывать

Enein добавил:
ладно, ок...
Код:
struct lnball
    unit lbcaster
    unit lbdummy
    real lbdist
    real lbrx
    real lbry
    lightning lbln
endstruct

function LBallMove takes nothing returns nothing
    ...
endfunction

function CreateLightningBall takes nothing returns nothing
    local timer   t = CreateTimer()
    local lnball A = lnball.create()
    set A.lbcaster = GetTriggerUnit()
    ...
    call TimerStart(t, 0.02, true, function LBallMove)
    ...
endfunction

как передать данные A.x в таймер?
Старый 30.05.2009, 15:37
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
типа так:
Код:
struct lnball
    unit lbcaster
    unit lbdummy
    real lbdist
    real lbrx
    real lbry
    lightning lbln
    static lnball array List
    static count
endstruct

И циклом, циклом их..

Артте добавил:
только не забывай при удалении твоего объекта последнюю структуру переносить на место удаленной, чтоб багов не было
Старый 30.05.2009, 15:48
Линкольн
Barg Ent.
offline
Опыт: 4,812
Активность:
Цитата:
как передать данные A.x в таймер?

Код:
globals
    lnball A
    //Если способность MUI, то:
    //lnball array A
endglobals

struct lnball
    unit lbcaster
    unit lbdummy
    real lbdist
    real lbrx
    real lbry
    lightning lbln
endstruct

function LBallMove takes nothing returns nothing
    ...
endfunction

function CreateLightningBall takes nothing returns nothing
    local timer   t = CreateTimer()
    //local lnball A = lnball.create()
    set A = lnball.create()
    set A.lbcaster = GetTriggerUnit()
    ...
    call TimerStart(t, 0.02, true, function LBallMove)
    ...
endfunction


Линкольн добавил:
Артте
Я с таким методом не знаком, можно простейший пример.
Старый 30.05.2009, 18:01
Garret
Недоброе творится
offline
Опыт: 3,893
Активность:
Enein
очень похоже, что ты обращаешься к неинициализированным переменным:
Цитата:
exitwhen lbdummy[i] == null

Аддед:
Хотя оно скорее просто бы не работало, а не вызывало фатал=(

Отредактировано Garret, 30.05.2009 в 18:19.
Старый 30.05.2009, 18:13
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
Код:
struct lnball
    unit lbcaster
    unit lbdummy
    real lbdist
    real lbrx
    real lbry
    lightning lbln
    static lnball array List
    static count
endstruct

function LBallMove takes nothing returns nothing
    local integer i=0
local ball
...
loop
exitwhen i>count
set ball=lnball.List[i ]
...
...
а когда уничтожаем :
call ball.destroy()
set lnball.List[ i]=lnball.List[count]
set count-=1
i+=1
endloop
endfunction



function CreateLightningBall takes nothing returns nothing
    ...
    call TimerStart(t, 0.02, true, function LBallMove)
    ...
endfunction


Артте добавил:
ну я немного с синтаксисом напортачил, лень исправлять
Старый 30.05.2009, 18:37
Закрытая тема

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

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

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

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



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