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

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

Закрытая тема
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Движение дамми
Нужно что бы дамми двигался как на рисунке. Но мои попытки так сделать оказались неудачны снаряд как то дергается вообщем не то
вот карта если кто знает либо переделайте либо дайте формул какую или код
Прикрепленные файлы
Тип файла: w3x Move.w3x (17.3 Кбайт, 20 просмотров )
Старый 15.02.2011, 15:51
DioD

offline
Опыт: 45,134
Активность:
случайный вектор отклонение на случайное время.
Старый 15.02.2011, 15:54
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
любое движение может быть описано формулой я формулу и прошу
Старый 15.02.2011, 15:56
Rampage
Бицепс
offline
Опыт: 9,722
Активность:
Может стоит логическими попробовать, ну типо тру + к углу, фальш - к углу. А надо чтобы плавно или можно рывочками?
Старый 15.02.2011, 15:56
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
ты бы карту поглядел почти так я и делал
Старый 15.02.2011, 15:57
Rampage
Бицепс
offline
Опыт: 9,722
Активность:
А если в реальную запоминать, допустим, на сколько отклонился, и если на 120 (к примеру) то тру ставить и обнулять 120. С каждым прибавлением или отклонением от основного угла он будет двигаться в нужную сторону наискось, с определёнными ограничениями.
Старый 15.02.2011, 16:01
DioD

offline
Опыт: 45,134
Активность:
градус смещай 40-40 градусов каждые х секунд, так чтобы юнит за рамки 40-40 не выходил
Старый 15.02.2011, 16:10
JimALIEN
вдупляет sc2 editor
offline
Опыт: 7,176
Активность:
set d = d + dist
If d > maxd then
set d = 0
set maxd = GetRandomReal(100,200)
If a < 0 then
set a = GetRandomReal(20,40)
else
set a = GetRandomReal(-20,-40)
endif
set MoveAngle = AngleBetweenPoints('позиция снаряда','целевая точка') + a
endif
d-пройденое растояние от последней смены направления
dmax-растояние на которое снаряд будет лететь в сторону
а-отклонение в градусах
Каждый момент времени двигаем снаряд под углом MoveAngle на растояние dist.
Пишу с мобилы поэтому очень ущербно, но надеюсь смысл ясен. Просто задаем растояние и угол отклонения и при достижении этого растояния повторяем. При растоянии до цели менее 200 (в данном случае) ставим а = 0. Ток это всеравно некрасивое движение, с плавным изменением круче имхо
Старый 16.02.2011, 03:13
DioD

offline
Опыт: 45,134
Активность:
вы точно таким же образом можете задать случайный вектор движения и применять его не мгновенно а в течении секунды, тогда юнит будет менять направление плавно, только по задаче синусойдой и не пахнет.
Старый 16.02.2011, 03:30
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
вроде получилось когда кастую влево или вправо то как надо если верх в низ то они слепливаются вместе снаряды
16GB добавил:
хотя бы карту посмотрели :(
Прикрепленные файлы
Тип файла: w3x Move.w3x (17.8 Кбайт, 22 просмотров )
Старый 16.02.2011, 17:13
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
сделал так
function HealRayCon takes nothing returns boolean
return GetSpellAbilityId() == 'A001'
endfunction

function HealRayEffect takes nothing returns nothing
local timer t= GetExpiredTimer()
local integer id = GetHandleId(t)
local unit c = LoadUnitHandle(udg_AssassinHash,id,0)
local unit d = LoadUnitHandle(udg_AssassinHash,id,1)
local unit f = LoadUnitHandle(udg_AssassinHash,id,2)
local real XE = LoadReal(udg_AssassinHash,id,StringHash("XE"))
local real YE = LoadReal(udg_AssassinHash,id,StringHash("YE"))
local real x
local real y
local real X = LoadReal(udg_AssassinHash,id,StringHash("X"))
local real Y = LoadReal(udg_AssassinHash,id,StringHash("Y"))
local real ang = Atan2(YE-Y,XE-X)
local real r = 60.
local integer i = LoadInteger(udg_AssassinHash,id,4)
local real R = LoadReal(udg_AssassinHash,id,5)
local real dist = SQ(X,Y,XE,YE)
local boolean b = LoadBoolean(udg_AssassinHash,id,3)
local real za = LoadReal(udg_AssassinHash,id,StringHash("AngleZ"))
if dist > 35. then
set X = X+30.*Cos(ang)
set Y = Y+30.*Sin(ang)
call SaveReal(udg_AssassinHash,id,StringHash("X"),X)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),Y)
call SetUnitX(d,SafeX(X + r*Cos(za)*Cos(ang-.71)))
call SetUnitY(d,SafeY(Y + r*Cos(za)*Sin(ang-.71)))
call SetUnitX(f,SafeX(X + r*Cos(za)*Cos(ang+.71)))
call SetUnitY(f,SafeY(Y + r*Cos(za)*Sin(ang+.71)))
call SaveReal(udg_AssassinHash,id,StringHash("AngleZ"),za+.4)
else
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED")))
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("ED2")))
call UnitApplyTimedLife(d,'BTLF',1.)
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("EM")))
call DestroyEffect(LoadEffectHandle(udg_AssassinHash,id,StringHash("EM2")))
call UnitApplyTimedLife(f,'BTLF',1.)
call DestroyTimer(t)
call FlushChildHashtable(udg_AssassinHash,id)
endif
set t = null
set c = null
set d = null
set f = null
endfunction

function HealRay takes nothing returns nothing
local timer t = CreateTimer()
local unit c = GetTriggerUnit()
local real X = SafeX(GetSpellTargetX())
local real Y = SafeY(GetSpellTargetY())
local integer id = GetHandleId(t)
local real x = GetUnitX(c)
local real y = GetUnitY(c)
local real r = Atan2(Y-y,X-x)
local unit d = CreateUnit(GetOwningPlayer(c),'e000',x,y,bj_RADTODEG*r)
local unit f = CreateUnit(GetOwningPlayer(c),'e000',x,y,bj_RADTODEG*r)
call SaveUnitHandle(udg_AssassinHash,id,0,c)
call SaveUnitHandle(udg_AssassinHash,id,1,d)
call SaveUnitHandle(udg_AssassinHash,id,2,f)
call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED"),AddSpecialEffectTarget("Abiliti​es\\Spells\\Other\\HealingSpray\\HealBottleMissile.mdl",d,"origin"))
call SaveEffectHandle(udg_AssassinHash,id,StringHash("ED2"),AddSpecialEffectTarget("Abilit​ies\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl",d,"origin"))
call SaveEffectHandle(udg_AssassinHash,id,StringHash("EM"),AddSpecialEffectTarget("Abiliti​es\\Spells\\Other\\HealingSpray\\HealBottleMissile.mdl",f,"origin"))
call SaveEffectHandle(udg_AssassinHash,id,StringHash("EM2"),AddSpecialEffectTarget("Abilit​ies\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl",f,"origin"))
call SaveReal(udg_AssassinHash,id,StringHash("XE"),X)
call SaveReal(udg_AssassinHash,id,StringHash("YE"),Y)
call SaveReal(udg_AssassinHash,id,StringHash("X"),x)
call SaveReal(udg_AssassinHash,id,StringHash("Y"),y)
call SaveReal(udg_AssassinHash,id,StringHash("Angle"),r)
call SetUnitFlyHeight(d,65,0)
call SetUnitScalePercent(d,200,200,200)
call SetUnitFlyHeight(f,65,0)
call SetUnitScalePercent(f,200,200,200)
call TimerStart(t,.02,true,function HealRayEffect)
set t = null
set c = null
set d = null
set f = null
endfunction
//===========================================================================
function InitTrig_Heal_Ray takes nothing returns nothing
    set gg_trg_Heal_Ray = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Heal_Ray, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition( gg_trg_Heal_Ray, Condition( function HealRayCon))
    call TriggerAddAction( gg_trg_Heal_Ray, function HealRay )
endfunction
можно закрывать
Старый 16.02.2011, 21:10
DioD

offline
Опыт: 45,134
Активность:
правильно делать - крепить к юниту один интегер - а всё остальное хранить в массивах, выигрышь в скорости по кешу 6 раз по хешу 2 раза.
Старый 17.02.2011, 09:05
Закрытая тема

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

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

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

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



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