Делаю триггерную версию Стального вихря Blademaster'a. Все вражеские воины, которые задеты данной способностью медленно притягиваются к герою и в то же время крутятся. Работает примерно как Black Hole Enigma из Dota 2.
set  dx  =  GetUnitX( this.blademaster ) - GetUnitX( enumUnit )                           
set  dy  =  GetUnitY( this.blademaster ) - GetUnitY( enumUnit )
set  dist  =  SquareRoot( dx * dx + dy * dy )

Здесь вычисляется координата "x" и "y" для ''enumUnit''
enumUnit должен стать ближе к герою на 2.0 единицы
2.0 * bj_DEGTORAD - это изменение на 2.0 градуса, чтобы сделать вращение

set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - 2.0 ) * ( dx / dist + 2.0 * bj_DEGTORAD )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - 2.0 ) * ( dy / dist + 2.0 * bj_DEGTORAD )

call SetUnitX( enumUnit, enumUnitX )
call SetUnitY( enumUnit, enumUnitY )
Но почему то воины не крутятся, а дёргаются в разные стороны. Где я допустил ошибку?

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

set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - 2.0 ) * ( dx / dist + 2.0 * bj_DEGTORAD )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - 2.0 ) * ( dy / dist + 2.0 * bj_DEGTORAD )
  • dx / dist и dy / dist - косинус и синус текущего угла.
  • + 2.0 * bj_DEGTORAD - добавление 2-градусов для вращения.


Я оказывается забыл найти косинус и синус угла вращения:
set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - 2.0 ) * ( dx / dist + Cos( 2.0 * bj_DEGTORAD ) )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - 2.0 ) * ( dy / dist + Sin( 2.0 * bj_DEGTORAD ) )
На даже так не работает...



Сделал через супер утечную BJ-функцию, почему-то заработало:
call SetUnitPositionLoc( enumUnit, PolarProjectionBJ( GetUnitLoc( this.blademaster ), DistanceBetweenPoints( GetUnitLoc( this.blademaster ), GetUnitLoc( enumUnit ) ) - 2.0, AngleBetweenPoints( GetUnitLoc( this.blademaster ), GetUnitLoc( enumUnit ) ) + 2.0 ) )
- ура, я сделаль:
set  dx     =  GetUnitX( enumUnit ) - GetUnitX( this.blademaster )
set  dy     =  GetUnitY( enumUnit ) - GetUnitY( this.blademaster )
set  dist   =  SquareRoot( dx * dx + dy * dy )
set  angle  =  Atan2( dy, dx )

set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - dist * 0.00128 ) * Cos( angle - ( dist * 0.0128 ) * bj_DEGTORAD )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - dist * 0.00128 ) * Sin( angle - ( dist * 0.0128 ) * bj_DEGTORAD )

call SetUnitX( enumUnit, enumUnitX )
call SetUnitY( enumUnit, enumUnitY )
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
6 лет назад
0
ScopteRectuS, угол к текущему углу между юнитом и блейдастером где добавляется для вращения?
1
21
6 лет назад
Отредактирован scopterectus
1
set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - 2.0 ) * ( dx / dist + 2.0 * bj_DEGTORAD )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - 2.0 ) * ( dy / dist + 2.0 * bj_DEGTORAD )
  • dx / dist и dy / dist - косинус и синус текущего угла.
  • + 2.0 * bj_DEGTORAD - добавление 2-градусов для вращения.


Я оказывается забыл найти косинус и синус угла вращения:
set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - 2.0 ) * ( dx / dist + Cos( 2.0 * bj_DEGTORAD ) )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - 2.0 ) * ( dy / dist + Sin( 2.0 * bj_DEGTORAD ) )
На даже так не работает...



Сделал через супер утечную BJ-функцию, почему-то заработало:
call SetUnitPositionLoc( enumUnit, PolarProjectionBJ( GetUnitLoc( this.blademaster ), DistanceBetweenPoints( GetUnitLoc( this.blademaster ), GetUnitLoc( enumUnit ) ) - 2.0, AngleBetweenPoints( GetUnitLoc( this.blademaster ), GetUnitLoc( enumUnit ) ) + 2.0 ) )
- ура, я сделаль:
set  dx     =  GetUnitX( enumUnit ) - GetUnitX( this.blademaster )
set  dy     =  GetUnitY( enumUnit ) - GetUnitY( this.blademaster )
set  dist   =  SquareRoot( dx * dx + dy * dy )
set  angle  =  Atan2( dy, dx )

set  enumUnitX  =  GetUnitX( this.blademaster ) + ( dist - dist * 0.00128 ) * Cos( angle - ( dist * 0.0128 ) * bj_DEGTORAD )
set  enumUnitY  =  GetUnitY( this.blademaster ) + ( dist - dist * 0.00128 ) * Sin( angle - ( dist * 0.0128 ) * bj_DEGTORAD )

call SetUnitX( enumUnit, enumUnitX )
call SetUnitY( enumUnit, enumUnitY )
Принятый ответ
2
27
6 лет назад
Отредактирован MpW
2
разве в стандартном стальном вихре притягиваются? а не все, не притягиваются, проверил. значит триггерный аналог будет притягивать. и что за коэффициент 0.00128. Понял. Этот множитель уменьшает расстояние, чем больше расстояние тем больше вычитает. Необычная и интересная фишка: чем объект ближе, тем медленнее он вращается и притягивается.
1
21
6 лет назад
Отредактирован scopterectus
1
Steal nerves, конечно, если верить логике, то объекты должны притягиваться тем сильнее, чем ближе. А я сделал замедление при приближении для того, чтобы юниты, которые находятся слишком близко, не продолжали притягиваться, а останавливали своё движение (иначе их модель в конечном итоге слипается с моделью Blademaster'a).
А при умножении дистанции на этот коэффициент ( dist * 0.00128 ), получается такое число, которое тем ближе к нулю, чем дистанция ( dist ) меньше. Соответственно, рано или поздно, произведение чисел ( dist * 0.00128 ) станет равна нулю. Это приведёт к тому, что объект перестанет притягиваться.
Ну и с градусами аналогичная ситуация.
0
28
6 лет назад
0
ScopteRectuS, я был как то выкладывал сюда похожий скилл
притягивает окружающих юнитов по спирали
Чтобы оставить комментарий, пожалуйста, войдите на сайт.