Добавлен scopterectus
Делаю триггерную версию Стального вихря 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 )
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован scopterectus
Отредактирован MpW
Отредактирован scopterectus
А при умножении дистанции на этот коэффициент ( dist * 0.00128 ), получается такое число, которое тем ближе к нулю, чем дистанция ( dist ) меньше. Соответственно, рано или поздно, произведение чисел ( dist * 0.00128 ) станет равна нулю. Это приведёт к тому, что объект перестанет притягиваться.
Ну и с градусами аналогичная ситуация.
притягивает окружающих юнитов по спирали