Добавлен
Не могу разобраться с углом. Не толкает юнита вперед.
function KBT takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit u = LoadUnitHandle(Hash,id,0)
    local real x0 = LoadReal(Hash,id,1)
    local real y0 = LoadReal(Hash,id,2)
    local real x1 = GetUnitX(u)
    local real y1 = GetUnitY(u)
    local real s = LoadReal(Hash,id,3)
    local real d = LoadReal(Hash,id,4)
    local string st = LoadStr(Hash,id,5)
    local real cd = LoadReal(Hash,id,6)
    local real a = Atan2(y0-y1,x0-x1)
    local real x = x1 + s * Cos(a)
    local real y = y1 + s * Sin(a)
    if cd >= d then
        call FlushChildHashtable(Hash,id)
        call PauseTimer(t)
        call DestroyTimer(t)
    else   
        call SetUnitX(u,x)
        call SetUnitY(u,y)
        call DestroyEffect(AddSpecialEffect(st,x,y))
    endif
    call SaveReal(Hash,id,6,cd + s)
    set t = null
    set u = null
endfunction

function KB takes unit u, real s, real d, string st returns nothing
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    call SaveUnitHandle(Hash,id,0,u)
    call SaveReal(Hash,id,1,GetUnitX(u))
    call SaveReal(Hash,id,2,GetUnitY(u))
    call SaveReal(Hash,id,3,s)
    call SaveReal(Hash,id,4,d)
    call SaveStr(Hash,id,5,st)
    call SaveReal(Hash,id,6,0)
    call TimerStart(t,0.04,true,function KBT)
    set t = null
endfunction

Принятый ответ

нафига тут вообще угол?
вот функция перемещения в направлении точки
void moveTo(unit u, float targetX, float targetY, float distance){
	float x=GetUnitX(u);
	float y=GetUnitY(u);
	float dx=targetX-x;
	float dy=targetY-y;
	float r=SquareRoot(dx*dx+dy*dy);
	float cos=dx/r;
	float sin=dy/r;
	SetUnitX(u, x+cos*distance);
	SetUnitY(u, y+sin*distance);
}
вызывается примерно так
moveTo(u, x1, y1, s);
где u - юнит которого двигаем
x1, y1 - координаты точки в направлении которых двигаем
s - расстояние на которое двигаем
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
19
6 лет назад
0
Похожие вопросы:

ответ
событие юнит умер
действие удалить юнита из группы
хватит уже писать тупые вопросы ответ на которые есть в статьях и F.A.Q.
ответ
Эм. Ну если триггерно делаешь, то мути так: speed=maxspeed*(1-distance/max_distance) , где speed- текущая. maxspeed- начальная скорость (самая максимальная без замедления), distance (уже пройденное расстояние), maxdistance (максимальное расстояние).
Ой. не дочитал. Там зависимость еще от времени. Ну тогда вообще не проблема.
Мб тогда стоит к школьной физике обратиться?) S=V0+(at^2)/2. A будет отрицательной (a=-V0/t), т.к конечная скорость = 0.
S=V0t+(at^2)/2.

0
20
6 лет назад
0
GetSpellTargetX ?
Вы делаете арктангенс2 между одинаковыми координатами вроде. Либо нужен весь код.
2
29
6 лет назад
2
local real x = x1 - s * Cos(a)
local real y = y1 - s * Sin(a)
попробуй так
1
27
6 лет назад
Отредактирован MpW
1
попробуй наработки под себя подмять вот
еще вот
смотрю на код, и не понимаю. Нужно чтобы он вперед толкал (просто данных мало, берет координаты одного и того же юнита)? тогда зачем нужно было высчитывать угол между двумя точками, брал бы угол взгляда юнита, и крутил вперед. еще проверку надо делать, чтоб за границу карты не вылетел юнит и может ли там двигаться
тут должна быть относительность чего-то либо. Либо от угла взгляда кастера или от угла взгляда цели, или угла между точками. А так он едет влево или вправо, или еще куда.
1
18
6 лет назад
1
Если нужно, вот наработка есть: xgm.guru/p/blog-maniac91/push.
0
27
6 лет назад
Отредактирован MpW
0
вот переделанная мной карта по быстрому (но надо еще проверки делать, чтобы не заехал за карту или в кустах не застрял, и проверять может лить ходить вот ссылка раздел 3. пункт 3.). только не знаю это то, что тебе нужно было ли.
Загруженные файлы
0
18
6 лет назад
0
Steal nerves, в моей наработке как раз есть проверки =)
4
28
6 лет назад
Отредактирован nvc123
4
нафига тут вообще угол?
вот функция перемещения в направлении точки
void moveTo(unit u, float targetX, float targetY, float distance){
	float x=GetUnitX(u);
	float y=GetUnitY(u);
	float dx=targetX-x;
	float dy=targetY-y;
	float r=SquareRoot(dx*dx+dy*dy);
	float cos=dx/r;
	float sin=dy/r;
	SetUnitX(u, x+cos*distance);
	SetUnitY(u, y+sin*distance);
}
вызывается примерно так
moveTo(u, x1, y1, s);
где u - юнит которого двигаем
x1, y1 - координаты точки в направлении которых двигаем
s - расстояние на которое двигаем
Принятый ответ
0
10
6 лет назад
0
Просто шок, сделал 16GB:
local real x = x1 - s * Cos(a)
local real y = y1 - s * Sin(a)
сработало, перезапустил карту - сломалось...
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.