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

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

Ответ
 
DualShock

offline
Опыт: 5,023
Активность:
не линейное движение
Вот пример обычного движения дамми по линии:
((код jass
...
private static method Move takes nothing returns nothing
local thistype this = GetTimerData(GetExpiredTimer())
if .range > 0. then
set .range = .range - SPEED
set .sfx.x = .sfx.x + SPEED * Cos(.angle)
set .sfx.y = .sfx.y + SPEED * Sin(.angle)
...
else
...
call ReleaseTimer(.tim)
call .destroy()
endif
endmethod
...
))
Но мне нужно реализовать полет дамми не по линии, а по волнистой траектории ( как синусоида, см. скрин). Как это лучше сделать (желательно без гемора)
Миниатюры
Кликните на картинку для увеличения
Название:  statia_3.1.jpg
Просмотров: 7
Размер:  22.3 Кбайт  
Старый 04.08.2012, 12:20
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
гляди спелл там вроде как похоже даммики движутся экспериментируй с углами
и глянь эту тему
function HealRayCon takes nothing returns boolean
return GetSpellAbilityId() == 'A0IH'
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 ef = 0.
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 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"))
local integer i = 0
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 + 60.*Cos(za)*Cos(ang-.71)))
	call SetUnitY(d,SafeY(Y + 60.*Cos(za)*Sin(ang-.71)))
	call SetUnitX(f,SafeX(X + 60.*Cos(za)*Cos(ang+.71)))
	call SetUnitY(f,SafeY(Y + 60.*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),'e00O',x,y,bj_RADTODEG*r)
local unit f = CreateUnit(GetOwningPlayer(c),'e00O',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 SetUnitScale(d,2.,2.,2.)
	call SetUnitFlyHeight(f,65,0)
	call SetUnitScale(f,2.,2.,2.)
	call TimerStart(t,.02,true,function HealRayEffect)
set t = null
set c = null
set d = null
set f = null
endfunction

Отредактировано Nerevar, 04.08.2012 в 12:38.
Старый 04.08.2012, 12:31
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
DualShock, это траектория сверху? если да - то
я юзаю способ,когда добавляется пара координат,чтобы отслеживать движение если бы оно было по прямой,а дальше относительно ее сдвигать
если смотреть по картинке то синусоида будет состоять из двух смещений
по горизонтали -
	set .sfx.x1 = .sfx.x1 + SPEED * Cos(.angle)
	set .sfx.y1 = .sfx.y1 + SPEED * Sin(.angle)
и по вертикали
	set .sfx.x = .sfx.x1 + Max * Sin(distance) * 0.999624216
	set .sfx.y = .sfx.y1 + Max * Sin(distance) * 0.027412133
Тут синусоида будет зависеть от пройденного расстояния(distance),Max - максимальная амплитуда синусоиды
соответственно будешь двигать в координаты .sfx.x\.sfx.y
Старый 04.08.2012, 12:32
Ответ

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

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

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

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



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