Высота Z
Как плавно повышать или понижать высоту dummy с точки A к точке B
x = GetUnitX(цель) - GetUnitX(P_a.dummy);
y = GetUnitY(цель) - GetUnitY(P_a.dummy);
z = GetUnitZ(цель) - GetUnitZ(P_a.dummy);
r = SquareRoot(x*x + y*y + z*z)
так я узнаю дистанцию между точками (юнитами)
потом двигаю
a = RADTODEG * Atan2(GetUnitY(P_a.at2) - GetUnitY(P_a.dummy), GetUnitX(P_a.at2) -
GetUnitX(P_a.dummy))
поворот дамика
SetUnitFacingTimed(P_a.dummy, a, 0)
координаты
x = GetUnitX(P_a.dummy);
y = GetUnitY(P_a.dummy);
z = GetUnitZ(P_a.dummy);
смещение
x = x + move_cord * Cos(DEGTORAD * a);
y = y + move_cord * Sin(DEGTORAD * a);
z = ??? как работать с высотой ?
SetUnitX(P_a.dummy, x);
SetUnitY(P_a.dummy, y);
SetUnitZ(P_a.dummy, z);

Без ответа.


Просмотров: 245

XGM Bot #1 - 2 недели назад 0
Похожие вопросы:

» ответ
возвращает то же значение Z, что было до деформации.
Вообще-то нет, иначе в Sniper Aren-у было бы невозможно играть.
Скорее всего ты создаёшь "временную" а не "постоянную" деформацию. По завершению постоянной деформации он выдаёт точные данные (деформация длится в течение времени, указанного в триггере)
Если надо делать деформацию на время, то лучше заносить точки в переменные и в нужный момент делать обратную деформацию, возвращающую первоначальное состояние.
» ответ
Kinade, изучай на здоровье
» ответ
Всё, разобрался, вопрос снимаю)

quq_CCCP #2 - 2 недели назад 0
SetUnitFlyHeght
Sergey105 #3 - 2 недели назад 0
SetUnitFlyHeght == SetUnitZ
я знаю как утсновить высоту
мне надо чтобы снаряд повышеал или понижал высоту плавно пока летит к цели
Zahanc #4 - 2 недели назад 0
SetUnitFlyingHeight или что-то в этом роде. Для работы нужно добавить способность Превращение в ворона к юниту которому нужно изменить Z.
Всё это описано в следующей статье: xgm.guru/p/wc3/spellmaker-stomp-spell-creation
Кстати, функции GetUnitZ нет в стандартной библиотеке.
Sergey105,
Sergey105:
SetUnitFlyHeght == SetUnitZ
я знаю как утсновить высоту
мне надо чтобы снаряд повышеал или понижал высоту плавно пока летит к цели
Таймер.
Sergey105 #5 - 2 недели назад 0
Zahanc, кстате чтобы ты знал я знаю как изменить высоту а GetUnitZ() я сам добавил для удобства
private void RangeAttack(){
ProcessingAttack P_a = GetStoredInteger(gc, "Attack", I2S(GetHandleId(GetExpiredTimer())))
float x = 0x00, y = 0x00, z = 0x00, r = 0x00, a = 0x00;
float z1 = 0x00;

===================== Узнаем дистанцию до цели ========================================================
x = GetUnitX(P_a.at2) - GetUnitX(P_a.dummy);
y = GetUnitY(P_a.at2) - GetUnitY(P_a.dummy);
z = GetUnitZ(P_a.at2) - GetUnitZ(P_a.dummy);
r = SquareRoot(x*x + y*y + z*z)

BJDebugMsg(R2S(RAbsBJ(Atan2(z, r))))
==================================================================================================​=====
if (r > move_cord ) { если дистанция r больше 1 то двигаем дамика
определяем угол поворота
a = RADTODEG * Atan2(GetUnitY(P_a.at2) - GetUnitY(P_a.dummy), GetUnitX(P_a.at2) - GetUnitX(P_a.dummy))
поворачивем дамика под углом a
SetUnitFacingTimed(P_a.dummy, a, 0)
сдвигаем координаты
x = GetUnitX(P_a.dummy);
y = GetUnitY(P_a.dummy);
z = GetUnitZ(P_a.dummy);

z1 = GetUnitZ(P_a.at2);

if (r > P_a.radius_attack/2) {
z = z
}

x = x + move_cord * Cos(DEGTORAD * a);
y = y + move_cord * Sin(DEGTORAD * a);
z = ???

двигаем дамика по координатам
SetUnitX(P_a.dummy, x);
SetUnitY(P_a.dummy, y);
SetUnitZ(P_a.dummy, z);
} else { когда дистанция уже меньше или равно 10
SetHp(P_a.at2, GetHp(P_a.at2) - 100 )
RemoveUnit(P_a.dummy) удаляем дамика
DestroyEffect(P_a.ef_dummy);
DestroyTimer(P_a.ex_t) удаляем таймер
FlushStoredInteger(gc, "Attack", I2S(GetHandleId(P_a.ex_t))) чистим кеш
P_a.ex_t = null обнуляем переменную
P_a.destroy() уничтожаем структуру
}
////////////////
}
это для не понтяных уже
Zahanc, ясно что таймером я и двигаю таймером тут без него не как
Zahanc #6 - 2 недели назад 0
Если нужно чтобы снаряд вёл себя как homing missile, то советую делать с помощью векторов.
Sergey105 #7 - 2 недели назад 0
я не б нем в векторах
и незнаю как
вот и задал впопрос как сделать
у меня высота допустим 50 у моей цели 200 мне надо чтобы высота постепенно повышалась дамика пока она летит к цели и достигла равной высоты цели
ну или понизилась если цель опустилась ниже
Zahanc #8 - 2 недели назад (отредактировано ) 0
Я думаю что можно сделать тупо
"""
if z > targetZ then
z = RMinBJ(z - (targetZ - z) * timeout, targetZ)
elseif z < targetZ then
z = RMaxBJ(z + (targetZ - z) * timeout, targetZ)
endif
"""
Возможно хрень сморозил. Я сомневаюсь.
+
Обновил. Заменил статичное число.
Hate #9 - 2 недели назад (отредактировано ) 0
значит так Sergey105, я тебе помогу, но в благородство играть не буду
напишу тебе примерный код, а ты там сам уже, хер его знает на кой черт тебе это Z сдалось, но я в чужие дела не лезу

берешь изначальную высоту отправной точки
MoveLocation(Loc, Gx(caster), Gy(caster))
start_z = GetLocationZ(Loc) + ShellStartZ[weapon]
и конечной точки
MoveLocation(Loc, x, y)
end_z = GetLocationZ(Loc) + ShellEndZ[weapon]
вместо ShellStartZ[weapon] и ShellEndZ[weapon] можно подставить стартовую и конечную высоту снаряда, что бы снаряд вылетал на уровне оружия например
рассчитываешь шаг который будет сделан за тик таймера
start_step_z = (start_z - end_z) / ( time / moving_period )
где moving_period = периоду таймера
time = время за которое снаряд пролетит все свое расстояние
можно найти используя формулы времени/расстояния/скорости за 4 класс математики
сохраняешь этот start_step_z еще раз как step_z
а далее при движении делаешь так
step_z += start_step_z
MoveLocation(Loc, x, y)
SetUnitFlyHeight( bullet, (start_z - step_z) - GetLocationZ(Loc), 0.)
занавес
п.с.
у юнита должен стоять тип движения земноводный, и нулевые крены
п.п.с.
изучайте прикрепленную карту
прикреплены файлы
ScopteRectuS #10 - 2 недели назад (отредактировано ) 0

где t угол между высотой цели и точки начала движения.

x = x + move_cord * Cos( a ) * Sin( t )
y = y + move_cord * Sin( a ) * Sin( t )
z = z + move_cord * Cos( t )
Steal nerves #11 - 2 недели назад 0
bifurcated #12 - 2 недели назад 0
Посмотри в этой карте, там есть полёт гранаты. Запусти карту и посмотри, как выглядит этот полёт гранаты, в игре нажми G, чтоб кинуть её. Потом открываешь карту, заходишь в триггеры, открываешь папку Shoot, в которой есть триггер Grenades и смотришь, как сделали этот полёт гранаты.
прикреплены файлы
nvc123 #13 - 2 недели назад 0
научиться юзать вектора 2 минуты при очень медленом чтении и полном отсутствие мозга