XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Harakternyk

offline
Опыт: 2,703
Активность:
Алгоритм определения точки "за спиной" цели
При создании очередной способности у меня возникла потребность в том, чтобы кастер появлялся, что называется "за спиной" цели, т.е. со стороны, противоположной её ориентации (unit facing angle). Разработал я рабочий (тестировал чутьли не в каждом градусе этой ориентации) код, но хотел бы узнать насколько он оптимален и не содержит ли он утечек.
Вобщем, кто может и хочет помочь - оставляйте свои мнения и замечания, за что буду очень благодарен!

P.S. Если будут вопросы по поводу того, из чего я исходил при разработки алгоритма - спрашивайте, отвечу. Но вкратце - деление системы координат карты вара на восемь секторов (по два на каждую четверть).

Код:
function Action_TBTA takes unit target, real Yc, real Xc, real TFA returns nothing

   call CreateNUnitsAtLoc( 1, 'O000', Player(0), Location(( ( GetLocationX( GetUnitLoc ( target ) ) - Xc * CosBJ( TFA ) ) ), ( ( GetLocationY( GetUnitLoc ( target ) ) - Yc * SinBJ( TFA ) ) )), TFA )

endfunction

function Main_TBTA takes nothing returns nothing

   local real Yc
   local real Xc
   local real TFA = I2R ( R2I (GetUnitFacing( gg_unit_otbk_0002  ) ) )
   local real tfa_emulation
  
   if ( TFA == 0 ) then
           
      call Action_TBTA ( gg_unit_otbk_0002, 100, 100, TFA )

   endif
 
   if ( TFA > 0 ) and ( TFA <= 45 ) then
      
      set tfa_emulation = 1
      set Yc = 50
      set Xc = 50
      loop
           exitwhen  Yc == 94

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc + 0.9
           set Yc = Xc + 0.9

      endloop

   endif

   if ( TFA > 45 ) and ( TFA <= 90 ) then
      
      set tfa_emulation = 46
      set Yc = 99
      set Xc = 99
      loop
           exitwhen  Yc == 54

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc - 0.9
           set Xc = Xc - 0.9

      endloop

   endif

   if ( TFA > 90 ) and ( TFA <= 135 ) then
      
      set tfa_emulation = 91
      set Yc = 50
      set Xc = 50
      loop
           exitwhen  Yc == 94

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc + 0.9
           set Yc = Xc + 0.9

      endloop

   endif

   if ( TFA > 135 ) and ( TFA <= 180 ) then
      
      set tfa_emulation = 136
      set Yc = 99
      set Xc = 99
      loop
           exitwhen  Yc == 54

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc - 0.9
           set Xc = Xc - 0.9

      endloop

   endif

   if ( TFA > 180 ) and ( TFA <= 225 ) then
      
      set tfa_emulation = 181
      set Yc = 50
      set Xc = 50
      loop
           exitwhen  Yc == 94

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc + 0.9
           set Yc = Xc + 0.9

      endloop

   endif

   if ( TFA > 225 ) and ( TFA <= 270 ) then
      
      set tfa_emulation = 226
      set Yc = 99
      set Xc = 99
      loop
           exitwhen  Yc == 54

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc - 0.9
           set Xc = Xc - 0.9

      endloop

   endif

   if ( TFA > 270 ) and ( TFA <= 315 ) then
      
      set tfa_emulation = 271
      set Yc = 99
      set Xc = 99
      loop
           exitwhen  Yc == 54

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc - 0.9 
           set Yc = Xc - 0.9 

      endloop

   endif

   if  ( TFA > 315 ) and ( TFA <= 360 ) then
   
      set tfa_emulation = 316
      set Yc = 99
      set Xc = 99
      loop
           exitwhen  Yc == 54

           if ( tfa_emulation == TFA ) then
           
              call Action_TBTA ( gg_unit_otbk_0002, Yc, Xc, TFA )

           endif

        
           set tfa_emulation = tfa_emulation + 1
           set Yc = Yc - 0.9 
           set Xc = Xc - 0.9 

      endloop

   endif

   set Yc = 0
   set Xc = 0
   set TFA = 0
   set tfa_emulation = 0
       
endfunction

Замечание: В качестве ключевого действия для примера я использовал функцию создания юнита в точке, а юнит-цель - это генерированная игрой глобалка "gg_unit_otbk_0002".

Harakternyk добавил:

Выкладываю карту-пример для ознакомления и наглядности...
В карте угол ориентации цели (троль-берсерк) нужно менять в ручную - через WE. Позже сделаю через тригеры.
Прикрепленные файлы
Тип файла: w3x Target's Back Teleportation Algorithm.w3x (15.1 Кбайт, 3 просмотров )

Отредактировано Harakternyk, 25.12.2007 в 11:31.
Старый 24.12.2007, 19:58
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Код:
function Action_TBTA takes unit target, real ld, real TFA returns nothing
   call CreateUnit(Player(0),'O000',GetUnitX(target) - 100.00 * CosBJ( TFA ), GetUnitY(target) - ld * SinBJ( TFA ), TFA )
endfunction
вобщемто этой функции было достаточно :\ просто проверка на угол и пути..
Старый 24.12.2007, 20:05
Harakternyk

offline
Опыт: 2,703
Активность:
Тему можно закрыть!
Я нашёл то, что мне нужно здесь. ...Давно математикой не занимался просто

P.S. Впредь буду сначала поиском пользоваться, а потом создавать "велосипед". Приношу свои искренние извенения за собственную неосмотрительность. Пожалуйста, закройте тему.
Старый 25.12.2007, 13:57
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 04:02.