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

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