Сейчас 07:24:11 Воскресенье, 14 августа, 2022 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » Статья: "Работа с типом unit" (обсуждение)
Статья: "Работа с типом unit"
ЭллесарДата: Понедельник, 14 Сентября 2009, 21:15:07 | Сообщение # 1
DeMoN
Группа: Ветераны
Сообщений: 934
Награды: 1
Репутация: 210
Блокировки:
Работа с типом unit

В этой статье Вы возможно не увидите ничего нового, но тут будут описаны методы работы с типом боевая единица – сохранения любых данных, отслеживание урона, работа со снарядами и другое…

Первое с чего начнем это хранения данных, у юнита есть весьма полезные функции – SetUnitUserData,GetUnitUserData, она может хранить integer. Прекрасно, часто бывает, что нам нужно прикрепить несколько данных… и для реализации нам потребуются несколько массивов и SetUnitUserData, она будет выступать в роли ключа в наших массивах.

Для удобство сначало сделаем так:

Code
define GetIdUnit(u) ={GetUnitUserData(u)}

На cJass define это как бы автозамена , после компиляции все замениться на GetUnitUserData(u)

Прекрасно, следующая задача – это сделать так, чтобы у каждого юнита были разные значения, для этого нам понадобиться 1 массив и 2 переменные типа integer.

Code
integer array Mass
integer I = 0
integer F = 0

В cJass, при объявление переменных не в функциях они будут являться глобальные, иначе локальными.

Пусть: define void = nothing

Code
void AddUNIT(unit u){
     integer i = F
     if (F==0){
         I=I+1
         i=I}
     else{i=Mass[F]}
     Mass[i]=-1
     SetUnitUserData(u,i)
}

Кто не знает ещё cJass смотреть сюда: (после компиляции будет именно так)

Code
function AddUNIT takes unit u returns nothing
     local integer i = F
     if (F==0) then
     set  I = I + 1
     set  i = I
     else
     set i = Mass[F]
     endif

      set Mass[i]=-1
     call SetUnitUserData(u,i)
endfunction

Эта функция будет давать юниту уникальный номер и сохранять его. Это конечно замечательно но массив в варике рассчитан на 8192 элементов, поэтому придётся нам убирать умерших юнитов, и давать новым юнитам старые номера.

Code
void RemoveUNIT(unit u){
         integer i = GetIdUnit (u)
         RemoveUnit(u)
         Mass[i]=F
         F=i
     }

Довольно простая функция, выводит юнита из игры и освобождает номер… эту функцию мы вскоре будет дополнять…

и так объявив несколько массивов мы уже можем хранить данные и читать их, это самая быстрая система…
пример:

void TEST(){
integer i = GetIdUnit(GetTriggerUnit())
….
MyArray[i] = 5
MyArray2[i] = 10
….
}

Отлично, но тут ещё возникают ряд проблем, например как присвоить id более удобным способом ? тут все просто, при инициализации мы выбираем каждого юнита и взываем функцию AddUNIT, а так же создадим функцию – альтернатива CreateUnit.

Code
unit CreateUNIT(player p,integer id,real x,real y, real f){
        integer i = F
        bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
         if (F==0){
            I=I+1
            i=I}
         else{i=Mass[F]}
         Mass[i]=-1
         SetUnitUserData (bj_lastCreatedUnit,i)
         return bj_lastCreatedUnit
      }

И так прекрасно ! теперь созданым юнитам будут прикрепляться номера.

Для удобство оформим это виде библиотеки

Code
library UnitAll{
     private  integer array Mass
     private  integer I = 0
     private  integer F = 0
      
     void AddUNIT(unit u){
     integer i = F
     if (F==0){
         I=I+1
         i=I}
     else{i=Mass[F]}
     Mass[i]=-1
     SetUnitUserData(u,i)
         }
      

     unit CreateUNIT(player p,integer id,real x,real y, real f){
        integer i = F
        bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
        // Ваши действия

        //

         if (F==0){
            I=I+1
            i=I}
         else{i=Mass[F]}
         Mass[i]=-1
         SetUnitUserData (bj_lastCreatedUnit,i)
         
         return bj_lastCreatedUnit
     }
      
     void RemoveUNIT(unit u){
         integer i = GetUnitUserData(u)
         // Ваши действия
         //Обнуление
         UnitAll_Data1[i] = 0
         UnitAll_Data2[i] = 0
          
         UnitAll_Ax[i] = 0
         UnitAll_Ay[i] = 0
         UnitAll_Az[i] = 0
         //
         RemoveUnit(u)
         Mass[i]=F
         F=i
     }
      
     //Ваши данные
   public  real array Ax,Ay,Az
   public  integer array Data1,Data2
              
}

После удаления юнита важно обнулить все массивы, где это требуется.

Приступим ко второй части… мы можем условно разделить юнитов на: Обычные боевые единицы и снаряды. У них конечно будут разные прикрепленные к ним данные и свойства… Для начало можно копирнуть библиотеку и переписать её аккуратно это основа. Для них будут разные номера и массивы.

Создадим две группы для каждой библиотеке

Code
group UnitAll = CreateGroup()
     group SNAR = CreateGroup()

Мы так же будет добавлять юнитов и снарядов при создании и убирать при удалении функции дополняться:

Code
void AddUNIT(unit u){
     integer i = F
     if (F==0){
         I=I+1
         i=I}
     else{i=Mass[F]}
     Mass[i]=-1  
     GroupAddUnit(UnitAll,u)
     SetUnitUserData(u,i)
         }

     unit CreateUNIT(player p,integer id,real x,real y, real f){
        integer i = F
        bj_lastCreatedUnit = CreateUnit(p,id,x,y,f)
        // Ваши действия

        //

         if (F==0){
            I=I+1
            i=I}
         else{i=Mass[F]}
         Mass[i]=-1
         SetUnitUserData (bj_lastCreatedUnit,i)
        GroupAddUnit(UnitAll,u)
         return bj_lastCreatedUnit
     }
      
     void RemoveUNIT(unit u){
         integer i = GetUnitUserData(u)
         // Ваши действия  
   
         GroupRemoveUnit(UnitAll,u)
         //Обнуление
         UnitAll_Data1[i] = 0
         UnitAll_Data2[i] = 0
          
         UnitAll_Ax[i] = 0
         UnitAll_Ay[i] = 0
         UnitAll_Az[i] = 0
         //
         RemoveUnit(u)
         Mass[i]=F
         F=i
     }

Тоже самое проделаем для библиотеки снарядов…

В этих группах будет находиться Все юниты и снаряды нам будет удобно обращаться к группам для реализации своих целей. так же добавим в библиотеки то что нам надо…

Например, чтобы юнит мог перемещаться по оси Z, так же отсаживание урона –
Допустим у нас есть триггер, где нам нужно получить урон и юнита, мы так же добавим в наши функции – TriggerRegisterUnitEvent. Для данной функции… для библиотеки снарядов это необязательно, зато добавим другое, например чтобы снаряд нельзя было выделить (москиты).

Заключение: придерживаясь этой системы, мы можем наиболее быстро обращаться к данным юнита, так же отслеживать повреждения, работать со снарядами, с группами и разделять условно Юнитов на несколько типов, у которых будут свои свойства.

Скачать карту


база паролей: https://yadi.sk/d/mdDhWuvPcTSKw
бекап сайта от 26.12.2010 https://yadi.sk/d/L3xNpibbiHpYE
 

Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » Статья: "Работа с типом unit" (обсуждение)
  • Страница 1 из 1
  • 1
Поиск:

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