Добавлен
Не могу разобраться с углом. Не толкает юнита вперед.
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 - расстояние на которое двигаем
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
событие юнит умер
действие удалить юнита из группы
хватит уже писать тупые вопросы ответ на которые есть в статьях и 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.

20
GetSpellTargetX ?
Вы делаете арктангенс2 между одинаковыми координатами вроде. Либо нужен весь код.
28
local real x = x1 - s * Cos(a)
local real y = y1 - s * Sin(a)
попробуй так
27
попробуй наработки под себя подмять вот
еще вот
смотрю на код, и не понимаю. Нужно чтобы он вперед толкал (просто данных мало, берет координаты одного и того же юнита)? тогда зачем нужно было высчитывать угол между двумя точками, брал бы угол взгляда юнита, и крутил вперед. еще проверку надо делать, чтоб за границу карты не вылетел юнит и может ли там двигаться
тут должна быть относительность чего-то либо. Либо от угла взгляда кастера или от угла взгляда цели, или угла между точками. А так он едет влево или вправо, или еще куда.
27
вот переделанная мной карта по быстрому (но надо еще проверки делать, чтобы не заехал за карту или в кустах не застрял, и проверять может лить ходить вот ссылка раздел 3. пункт 3.). только не знаю это то, что тебе нужно было ли.
Загруженные файлы
28
Принятый ответ
нафига тут вообще угол?
вот функция перемещения в направлении точки
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 - расстояние на которое двигаем
9
Просто шок, сделал 16GB:
local real x = x1 - s * Cos(a)
local real y = y1 - s * Sin(a)
сработало, перезапустил карту - сломалось...
28
noyl, потому что должны быть радианы а не градусы
29
local real x = x1 - s * Cos(a*bj_DEGTORAD)
local real y = y1 - s * Sin(a*bj_DEGTORAD)
27
Msey, пробовал его код вставить, у него это влево все время ехать юнит будет (либо код не правильный либо не все показал). =(
nvc123, в вашем коде float distance можно убрать, ничего не делает =(
Загруженные файлы
29
float cos=dx/r;
float sin=dy/r;
Не знал, что единичный вектор - это синус и косинус одновременно кек
Steal nerves, скорее всего второй вариант.
тогда зачем нужно было высчитывать угол между двумя точками, брал бы угол взгляда юнита, и крутил вперед
ну тут спорно, на самом деле. вот успеет юнит посмотреть чуть вбок и по кривой поедет
Чтобы оставить комментарий, пожалуйста, войдите на сайт.