Сейчас 16:14:31 Пятница, 19 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Периодическое Перемещение Юнита
Периодическое Перемещение Юнита
KaotikaДата: Пятница, 22 Мая 2015, 16:33:21 | Сообщение # 1
5 уровень
Группа: Проверенные
Сообщений: 144
Награды: 0
Репутация: 20
Блокировки:
Юнит перемещается на ~50 по координатам вперёд, не больше..
Где могла быть ошибка:

Код
function AngleBetweenPositions takes real xa, real ya, real xb, real yb returns real
     return 180.0 / 3.14159 * Atan2( yb - ya, xb - xa )
endfunction

function DistanceBetweenPositions takes real xa, real ya, real xb, real yb returns real
     real dx = xb - xa
     real dy = yb - ya
     return SquareRoot( dx * dx + dy * dy )
endfunction

function PolarProjectionX takes real x, real dist, real angle returns real
     return x + dist * Cos( angle * 3.14159 / 180.0 )
endfunction

function PolarProjectionY takes real y, real dist, real angle returns real
     return y + dist * Sin( angle * 3.14159 / 180.0 )
endfunction


Код
scope InitA001 initializer InitA001

     globals
         private constant trigger Trigger = CreateTrigger(  )
         private constant timer Timer = CreateTimer(  )
         private group Group = CreateGroup(  )
         private int GetAbilityAccount = 8192
         private int GetSourceAccount = 0
         private unit arr Dummy
         private unit arr Source
         private real arr SourceX
         private real arr SourceY
         private real arr TargetX
         private real arr TargetY
         private real arr Angle
         private real arr Distance
         private real arr DistanceAccount
         private real arr Speed
     endglobals

     define
         private n = [ GetAbilityAccount ]
         private ID = [ i ]
     enddefine

     function A001Activate takes player p returns void
         if GetLocalPlayer(  ) == p
             ForceUIKey( "E" )
         end
     endfunction

     private function Actions takes void returns void
         unit u = GetEnumUnit(  )
         int i = GetUnitUserData( u )

         if DistanceAccount ID < Distance ID
             SetUnitX( Source ID, PolarProjectionX( SourceX ID, Speed ID, Angle ID ) )
             SetUnitY( Source ID, PolarProjectionY( SourceY ID, Speed ID, Angle ID ) )
             DistanceAccount ID += Speed ID
         else
             Source ID = null
             GroupRemoveUnit( Group, Dummy ID )
             RemoveUnit( Dummy ID )
             Dummy ID = null
             GetSourceAccount --
             if GetSourceAccount == 0
                 u = null
                 PauseTimer( Timer )
             end
         end
     endfunction

     private function Update takes void returns void
         ForGroup( Group, function Actions )
     endfunction

     private function Registers takes void returns void
         if GetSourceAccount == 0
             GetAbilityAccount = 8192
             ResumeTimer( Timer )
         end

         GetAbilityAccount --
         GetSourceAccount ++

         Source n = GetSpellAbilityUnit(  )
         SourceX n = GetUnitX( Source n )
         SourceY n = GetUnitY( Source n )
         if GetSpellTargetUnit(  ) == null
             TargetX n = GetSpellTargetX(  )
             TargetY n = GetSpellTargetY(  )
         else
             TargetX n = GetUnitX( GetSpellTargetUnit(  ) )
             TargetY n = GetUnitY( GetSpellTargetUnit(  ) )
         end
         Angle n = AngleBetweenPositions( SourceX n, SourceY n, TargetX n, TargetY n )
         Distance n = DistanceBetweenPositions( SourceX n, SourceY n, TargetX n, TargetY n )
         DistanceAccount n = 0.0
         Speed n = Distance n * 0.03

         Dummy n = CreateUnit( GetOwningPlayer( Source n ), 'unit', SourceX n, SourceY n, 0.0 )
         SetUnitUserData( Dummy n, GetAbilityAccount )
         GroupAddUnit( Group, Dummy n )
     endfunction

     private function AbiFilter takes void returns bool
         return GetSpellAbilityId(  ) == 'A001'
     endfunction

     function InitA001 takes void returns void
         int nPl = 0

         loop
             nPl ++
                 TriggerRegisterPlayerUnitEvent( Trigger, GetPlayerIndex[ nPl ], ConvertPlayerUnitEvent( 274 ), null )
             break nPl >= GetPlayersAccount
         endloop
         TriggerAddCondition( Trigger, function AbiFilter )
         TriggerAddAction( Trigger, function Registers )
         TimerStart( Timer, 0.03, true, function Update )
     endfunction

endscope


Конечно я писал понимая, но вдруг такая неожиданность... искал ошибку часов полтора, так и не нашёл - тошнит уже :'(


Тискаю клаву... остальных пока некогда!
 

[SeKtOR]Дата: Пятница, 22 Мая 2015, 20:27:34 | Сообщение # 2
Группа: Проверенные
Сообщений: 1143
Награды: 0
Репутация: 1168
Блокировки:
Ну в коде как минимум много ошибок т.к. в название переменных не может быть пробела и вообще таких переменных нет, если не учитывать пробел...

Добавлено (22 Мая 2015, 20:22:39)
---------------------------------------------
Извиняюсь, не увидел define...

Добавлено (22 Мая 2015, 20:27:34)
---------------------------------------------
Я конечно против ничего не имею, но сейчас вроде модно использовать Hashtable для достижения MUI и GroupLoop. По теме ошибки, то в процессе...




Сообщение отредактировал [SeKtOR] - Пятница, 22 Мая 2015, 20:28:20
 

KaotikaДата: Суббота, 23 Мая 2015, 06:03:09 | Сообщение # 3
5 уровень
Группа: Проверенные
Сообщений: 144
Награды: 0
Репутация: 20
Блокировки:
Цитата [SeKtOR] ()
Ну в коде как минимум много ошибок т.к. в название переменных не может быть пробела и вообще таких переменных нет, если не учитывать пробел...

Может, если дефинить (define). Вообще-то ошибок грубых нет, чтобы мешало летать. Сегодня случайно нашёл баг. Он заключается в том, я забыл переодически менять дистанцию перемещения.

Добавлено (23 Мая 2015, 06:03:09)
---------------------------------------------

Цитата Kaotika ()
модно использовать Hashtable

меня раздражает hashtable. :D


Тискаю клаву... остальных пока некогда!
 

Форум о Warcraft 3 » Раздел для картостроителей » Вопросы по картостроению » Периодическое Перемещение Юнита
  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz