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

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

Ответ
 
darkVader

offline
Опыт: 197
Активность:
Помогите разобраться...
Помогите разобраться с кодом пожалуйста.
Работать он должен так: юнит кастует спел, потом создаются 6 дамми вокруг него и начинают вращаться, по прошествии времени дамми удаляются...
Все по идее довольно просто, но при использовании вар начинает лагать очень сильно точнее зависает на минуту а при втором использовании зависает окончательно...

Вот выкладываю код.
Код:
function Trig_orbs_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A006' ) ) then
        return false
    endif
    return true
endfunction


function Trig_orbs_Timer  takes nothing  returns nothing
 local unit array dummy
 local integer i = 1
 local real r = LoadReal( udg_HASH, 3,9)
 local real a
 local unit caster = LoadUnitHandle( udg_HASH, 3, 1 )
 local real X
 local real Y
 local real X1
 local real Y1
 local real Xo = GetUnitX(caster)
 local real Yo = GetUnitY(caster)
 loop
 exitwhen ( i == 7) 
 set dummy = LoadUnitHandle( udg_HASH, 3, (i + 1))
 set X1 = GetUnitX(dummy[i])
 set Y1 = GetUnitY(dummy[i])
 set a = Atan2((Y1 - Yo), (X1 - Xo))
 set X = Xo + ( r * Cos(a - (10*0.0174)))
 set Y = Yo + ( r * Sin(a - (10*0.0174)))
 call SetUnitPosition(dummy[i], X, Y)
 set dummy[i] = null
 endloop
 set caster = null
endfunction

function Trig_orbs_Actions takes nothing returns nothing
local unit caster = GetSpellAbilityUnit()
local unit array dummy
local real a
local timer t = CreateTimer()
local real r = 100
local integer i = 1
local real X
local real Y
local real Xo = GetUnitX(caster)
local real Yo = GetUnitY(caster)
 call SaveUnitHandle( udg_HASH, 3, 1, caster)
 loop
 exitwhen(i == 7)
   set a = (60 * (I2R(i)))
   set X = Xo + ( r * Cos(a * 0.0174))
   set Y = Yo + ( r * Sin(a * 0.0174))
   set dummy[i] = CreateUnit( GetOwningPlayer(caster) , 'h003', X, Y, bj_UNIT_FACING)
   call SaveUnitHandle( udg_HASH, 3, (i + 1), dummy[i])
   set i = i + 1
 endloop
 call SaveReal( udg_HASH, 3, 9, r)
 call TriggerAddAction( gg_trg_orbs, function Trig_orbs_Timer )
 call TimerStart( t, 0.05, true, function Trig_orbs_Timer)
 call PolledWait(7)
 call PauseTimer(t)
 call DestroyTimer(t)
 set t = null
 set i = 1
 loop
 exitwhen ( i == 7)
 call RemoveUnit( dummy[i])
 set dummy[i] = null
 set i = i + 1
 endloop
 call FlushChildHashtable( udg_HASH, 3) 
 set caster = null
endfunction

//===========================================================================
function InitTrig_orbs takes nothing returns nothing
    set gg_trg_orbs = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_orbs, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_orbs, Condition( function Trig_orbs_Conditions ) )
    call TriggerAddAction( gg_trg_orbs, function Trig_orbs_Actions )
endfunction


просьба не судить строго, jass юзаю только первую неделю...

[i]darkVader добавил:

Оо я просто слепой=)))) извине меня пожалуйста лаги убрал=))))) там цикл не завершался...
но появился другой вопрос когда кастер двигается все дамми сбиваются в кучу=( как этого избежать?
Старый 24.10.2010, 19:54
Doc

offline
Опыт: 63,163
Активность:
darkVader, надо для каждого дамми сохранять его угол и и двигать относительно него.
Нууу, если поймешь....

scope Wisps initializer i{

//OPTIONS
//=======
define {
private abilid = 'A000' // Your Ability Id
private cangle = 5. // Rotating Angle
private distance = 90. // Distanse Beetween Wisp And Hero
private dummyid = 'h001' // Id Of Your Wisp Dummy
}
//=======
//END

private bool c() {return GetSpellAbilityId() == abilid}

private int wnumber(unit u){
    return GetUnitAbilityLevel(u, abilid) * 1 + 2
}

private void ont() {
    timer t = GetExpiredTimer()
    int id = GetHandleId(t)
    unit u = LoadUnitHandle(Hash, id, 'cas')
    unit new
    int n = LoadInteger(Hash, id, 'wnum')
    int i = 0
    int tmp = n
    real speed = LoadReal(Hash, id, 'dspd')
    real angle
   
    whilenot(i==n) {
    new = LoadUnitHandle(Hash, id, 'uni' + i)
    angle = LoadReal(Hash, id, 'ang' + i)
    SetUnitX(new, polarx(u, angle + cangle, distance))
    SetUnitY(new, polary(u, angle + cangle, distance))
    SaveReal(Hash, id, 'ang' + i, angle + cangle)
        if GetWidgetLife(u) < 1.{KillUnit(new)}
    
        if GetWidgetLife(new) < 1.{
        tmp--
        }
    i++
    }
    
    SetUnitMoveSpeed(u, speed - (I2R(tmp)/I2R(n)*speed))
    
    if tmp == 0 || GetWidgetLife(u) < 1. {
    FlushChildHashtable(Hash, id)
    DestroyTimer(t)
    }
    
    new = null
    u = null
    t = null
}

private void a(){
    unit u = GetSpellTargetUnit()
    int n = wnumber(GetTriggerUnit())
    unit new
    int i = 0
    timer t = new timer
    int id = GetHandleId(t)
    
    TimerStart(t, 0.025, true, function ont)
    SaveUnitHandle(Hash, id, 'cas', u)
    SaveInteger(Hash, id, 'wnum', n)
    SaveReal(Hash, id, 'dspd', GetUnitMoveSpeed(u))
    
        whilenot(i == n) {
        new = new unit(GetOwningPlayer(GetTriggerUnit()), dummyid, polarx(u, 360./n*i, distance), polary(u, 360./n*i, distance), 0.)
        SaveUnitHandle(Hash, id, 'uni' + i, new)
        SaveReal(Hash, id, 'ang' + i, angleun(u, new))
        i++
        }
    new = null
    u = null
    t = null
}

private void i(){
    trigger t = new trigger
    RegisterSpellEvent(t)
    TriggerAddAction(t, function a)
    TriggerAddCondition(t, Condition(function c))
    t = null
}

}
Старый 24.10.2010, 20:10
darkVader

offline
Опыт: 197
Активность:
Оо это vJass? ну в нем я не шарю, но правда разобрал пару строк и этого хватило=))))
Код теперь работает отлично=))) Спасибо большое=)))
Старый 24.10.2010, 21:19
Doc

offline
Опыт: 63,163
Активность:
darkVader, это cjass, незачто.
Старый 24.10.2010, 21:44
Ответ

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

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

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

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



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