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

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

Закрытая тема
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Отталкивание
Вот по этой формуле я отталкиваю всех от себя, но в основном отталкивание какое то кривое иногда даже притягивание....
set udg_Angle= Atan2( GetUnitY( udg_C[0] ) + GetUnitY( GetEnumUnit() ) , GetUnitX( udg_C[0]) + GetUnitX(GetEnumUnit() ) )
call SetUnitX(GetEnumUnit(),GetUnitX(GetEnumUnit())+40.*Cos(udg_Angle))
call SetUnitY(GetEnumUnit(),GetUnitY(GetEnumUnit())+40.*Sin(udg_Angle))
Vadik29 добавил:
Криваость в том, что отталкивает всех юнитов в одну сторону независимо от их положения, а когда выбран 1 юнит он вообще притягивается....
Прикрепленные файлы
Тип файла: w3x Pain.w3x (334.9 Кбайт, 14 просмотров )

Отредактировано Vadik29, 21.02.2012 в 22:09.
Старый 21.02.2012, 21:00
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
нужен весь код и тут вроде всё норм
Старый 21.02.2012, 21:02
ScorpioT1000
Работаем
offline
Опыт: отключен
давай полностью функции
Старый 21.02.2012, 21:02
MpW

offline
Опыт: 49,642
Активность:
Vadik29, может из-за угла криво? не совсем понятно, вроде бы правильно все, но знание формул не дает решить проблему
Старый 21.02.2012, 21:02
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
И полный код не помешал бы
» Описание
Попросту используйте конструкцию вида Atan2(otherPointY-centerPointY, otherPointX-centerPointX), чтобы получить угол (в радианах) между точками centerPoint и otherPoint.
Старый 21.02.2012, 21:07
DimanTOoBS

offline
Опыт: 5,791
Активность:
мне кажется из за угла криво, т.к. у тебя угол находится до 90 градусов поидее (точно не уверен)
можно создавать юнита в точке кастера и чтоб он смотрел в сторону того кого толкать, потом получаем угол и сразу удаляем юнита
Старый 21.02.2012, 21:07
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
» 1 Триггер (старт)
function Trig_ST_part_1_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction

function Trig_ST_part_1_Func008Func001C takes nothing returns boolean
    if ( not ( IsUnitEnemy(GetEnumUnit(), GetOwningPlayer(udg_C[0])) == true ) ) then
        return false
    endif
    if ( not ( IsUnitType(GetEnumUnit(), UNIT_TYPE_STRUCTURE) == false ) ) then
        return false
    endif
    if ( not ( IsUnitAliveBJ(GetEnumUnit()) == true ) ) then
        return false
    endif
    return true
endfunction

function Trig_ST_part_1_Func008A takes nothing returns nothing
    if ( Trig_ST_part_1_Func008Func001C() ) then
        call GroupAddUnitSimple( GetEnumUnit(), udg_G[0] )
    else
        call DoNothing(  )
    endif
endfunction

function Trig_ST_part_1_Actions takes nothing returns nothing
    set udg_C[0] = GetSpellAbilityUnit()
    set udg_P[0] = GetUnitLoc(udg_C[0])
    call PlaySoundOnUnitBJ( gg_snd_Chinra_tensei, 100, udg_C[0] )
    call CreateNUnitsAtLocFacingLocBJ( 1, 'h000', GetOwningPlayer(udg_C[0]), GetUnitLoc(udg_C[0]), GetUnitLoc(udg_C[0]) )
    set udg_D[0] = GetLastCreatedUnit()
    set udg_I[0] = 0
    set udg_G[0] = GetLastCreatedGroup()
    call ForGroupBJ( GetUnitsInRangeOfLocAll(400.00, udg_P[0]), function Trig_ST_part_1_Func008A )
    call EnableTrigger( gg_trg_ST_part_2 )
    call EnableTrigger( gg_trg_ST_part_3 )
    call EnableTrigger( gg_trg_ST_part_4 )
    call TriggerSleepAction( 0.10 )
    call DisableTrigger( gg_trg_ST_part_2 )
    call DisableTrigger( gg_trg_ST_part_3 )
    call DisableTrigger( gg_trg_ST_part_4 )
    call RemoveUnit( udg_D[0] )
    call GroupClear( udg_G[0] )
    set udg_G[0] = null
    set udg_P[0] = null
    set udg_C[0] = null
    set udg_D[0] = null
endfunction

//===========================================================================
function InitTrig_ST_part_1 takes nothing returns nothing
    set gg_trg_ST_part_1 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ST_part_1, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_ST_part_1, Condition( function Trig_ST_part_1_Conditions ) )
    call TriggerAddAction( gg_trg_ST_part_1, function Trig_ST_part_1_Actions )
endfunction
» 2 Триггер (эффект)

function Trig_ST_part_2_Actions takes nothing returns nothing
    set udg_I[0] = ( udg_I[0] + 5 )
    call SetUnitScalePercent( udg_D[0], I2R(udg_I[0]), I2R(udg_I[0]), I2R(udg_I[0]) )
    call SetUnitX(udg_D[0],GetUnitX(udg_C[0]))
    call SetUnitY(udg_D[0],GetUnitY(udg_C[0]))
endfunction

//===========================================================================
function InitTrig_ST_part_2 takes nothing returns nothing
    set gg_trg_ST_part_2 = CreateTrigger(  )
    call DisableTrigger( gg_trg_ST_part_2 )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_2, ( 0.05 / 10.00 ) )
    call TriggerAddAction( gg_trg_ST_part_2, function Trig_ST_part_2_Actions )
endfunction
» 3 Триггер (двигающий)
function Trig_ST_part_3_Func001A takes nothing returns nothing
    set udg_Angle= Atan2( GetUnitY( udg_C[0] ) + GetUnitY( GetEnumUnit() ) , GetUnitX( udg_C[0]) + GetUnitX( GetEnumUnit() ) )
    call SetUnitX(GetEnumUnit(),GetUnitX(GetEnumUnit())+40.*Cos(udg_Angle))
    call SetUnitY(GetEnumUnit(),GetUnitY(GetEnumUnit())+40.*Sin(udg_Angle))
endfunction

function Trig_ST_part_3_Actions takes nothing returns nothing
    call ForGroupBJ( udg_G[0], function Trig_ST_part_3_Func001A )
endfunction

//===========================================================================
function InitTrig_ST_part_3 takes nothing returns nothing
    set gg_trg_ST_part_3 = CreateTrigger(  )
    call DisableTrigger( gg_trg_ST_part_3 )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_3, ( 0.25 / 10.00 ) )
    call TriggerAddAction( gg_trg_ST_part_3, function Trig_ST_part_3_Actions )
endfunction
» 4 Триггер (эффекты)
function Trig_ST_part_4_Func001A takes nothing returns nothing
    call AddSpecialEffectLocBJ( GetUnitLoc(GetEnumUnit()), "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl" )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )
    call AddSpecialEffectTargetUnitBJ( "origin", GetEnumUnit(), "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl" )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )
endfunction

function Trig_ST_part_4_Actions takes nothing returns nothing
    call ForGroupBJ( udg_G[0], function Trig_ST_part_4_Func001A )
endfunction

//===========================================================================
function InitTrig_ST_part_4 takes nothing returns nothing
    set gg_trg_ST_part_4 = CreateTrigger(  )
    call DisableTrigger( gg_trg_ST_part_4 )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_4, 0.10 )
    call TriggerAddAction( gg_trg_ST_part_4, function Trig_ST_part_4_Actions )
endfunction
Старый 21.02.2012, 21:09
Msey
????
offline
Опыт: 67,346
Активность:
DimanTOoBS не неси чушь
это что за бред?
set udg_I[0] = 0
set udg_I[0] = ( udg_I[0] + 5 ) // -_\
хуже бреда я не видел
а это?
call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_3, ( 0.25 / 10.00 ) )

Отредактировано Msey, 21.02.2012 в 21:35.
Старый 21.02.2012, 21:11
MpW

offline
Опыт: 49,642
Активность:
DimanTOoBS, но может быть угол относительно чего-то, по-разному с углами реализовано может быть, можно толкать под углом кастера то есть в сторону куда смотрит кастующий, а можно относительно кастера и цели

Отредактировано Steal nerves, 21.02.2012 в 21:19.
Старый 21.02.2012, 21:11
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Msey,
set udg_I[0] = 0
не пугай меня я устанавливаю пременную типа integrer = 0 что тут такого?
т.к. во втором триггере
set udg_I[0] = ( udg_I[0] + 5 )
call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_3, ( 0.25 / 10.00 ) )
мне так нравится :Р
Старый 21.02.2012, 21:19
Msey
????
offline
Опыт: 67,346
Активность:
Vadik29:
не пугай меня я устанавливаю пременную типа integrer = 0 что тут такого?
впервые вижу, чтобы юнитов использовали, как интежеры facepalm
Старый 21.02.2012, 21:21
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Msey, Второй триггер быстро увеличивает размер юнита используя интегрер в качестве коэффециэнта увеличения....
Старый 21.02.2012, 21:25
Msey
????
offline
Опыт: 67,346
Активность:
function InitTrig_ST_part_2 takes nothing returns nothing
    set gg_trg_ST_part_2 = CreateTrigger(  )
     call DisableTrigger( gg_trg_ST_part_2 )
    call TriggerRegisterTimerEventPeriodic( gg_trg_ST_part_2, ( 0.05 / 10.00 ) )
    call TriggerAddAction( gg_trg_ST_part_2, function Trig_ST_part_2_Actions )
endfunction
call DisableTrigger( gg_trg_ST_part_2 )
зачем ты его отключаешь в таком людном месте?
Старый 21.02.2012, 21:28
ScorpioT1000
Работаем
offline
Опыт: отключен
Atan2( GetUnitY( udg_C[0] ) + GetUnitY( GetEnumUnit() ) , GetUnitX( udg_C[0]) + GetUnitX( GetEnumUnit() ) )
а почему сложение?
Старый 21.02.2012, 21:34
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
ScorpioT1000, потому что отталкивание, если будешь вычитать то будет притягивать...
Vadik29 добавил:
Msey, У меня скил работает только отталкивает криво, в остальном все ок.
Старый 21.02.2012, 21:39
ScorpioT1000
Работаем
offline
Опыт: отключен
Ты пробовал вычитать ? Мне кажется, отражать надо в другом месте, например, где угол.
Старый 21.02.2012, 21:40
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
ScorpioT1000, Вычитает у меня в другом триггере который притягивает указанного юнита, там ничего не багается. могу карту скинуть пустую в которой эти 2 скила.
Старый 21.02.2012, 21:41
ScorpioT1000
Работаем
offline
Опыт: отключен
Ты знаешь, как работает Atan2? Он же берет локальный вектор, значит надо передавать ему разницу между двумя глобальными... ну мб я не шарю, просто откуда такая логика?
Старый 21.02.2012, 21:52
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Vadik29,
set udg_Angle= Atan2( GetUnitY( udg_C[0] ) + GetUnitY( GetEnumUnit() ) , GetUnitX( udg_C[0]) + GetUnitX( GetEnumUnit() ) )
неверно, нужна разница:
set udg_Angle= Atan2( GetUnitY( udg_C[0] ) - GetUnitY( GetEnumUnit() ) , GetUnitX( udg_C[0]) - GetUnitX( GetEnumUnit() ) )
если нужно на 180 градусов повернуть, инвертируй
set udg_Angle= Atan2( GetUnitY( GetEnumUnit() ) - GetUnitY( udg_C[0] ) , GetUnitX( GetEnumUnit() ) - GetUnitX( udg_C[0]) )
Старый 21.02.2012, 21:56
ScorpioT1000
Работаем
offline
Опыт: отключен
ну вот я сложил 2 вектора и точка поучилась гдето слева и смотрит совсем не параллельно отрезку между ними
Старый 21.02.2012, 22:00
Закрытая тема

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

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

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

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



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