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

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

Ответ
 
ArhiVamp

offline
Опыт: 897
Активность:
Вопросик в Jass
Подскажите, пожалуйсто, как для каждого созданного юнита создавать 2 челочисленных переменные, и чтобы с ними потом можно было работать длительное время, а при смерти эти переменные убирать?
[+] 1 пункт от X: название темы не отражает сути вопроса!
Старый 29.12.2010, 12:34
XOR

offline
Опыт: 38,159
Активность:
Массивы/хеш. Динамически создать переменную нельзя, и удалить тоже, только изменять ее содержимое. Для чего тебе надо?
X добавил:
Старый 29.12.2010, 12:45
ArhiVamp

offline
Опыт: 897
Активность:
В моей карте у юнита будут 2 характеристики Атака и Жизни, причем у каждого они будут разные. Когда жизни становятся <=0 то убить юнита.
Старый 29.12.2010, 12:49
Icy
Это Я!
offline
Опыт: 1,785
Активность:
ArhiVamp, отдельные переменные(не массивы) никак, все указанные тобой переменные в коде карты компилит редактор и во время игры нельзя добавлять их
Отсюда вывод, массивы...
Ну а если тебе не больно охото парится с созданием списков для юнитов, то юзай вжасс, его структуры рулят!
А если все же тебе нужно идентифицировать каждого юнита на жассе, тогда читай этот код:

globals
  // Номер свободной ячейки
  integer FreeCell = 0
  // Идентификатор самой последней ячейки(не последней выделенной, а именно последней)
  integer AbsMaxID = 0
  // Количество выделенных ячеек
  integer UnitCount = 0
  // Номер предыдущей свободной ячейки
  integer array PrevFreeCell
  // Сопсно хендл юнита
  unit array UnitHandle
endglobals

// Функция выделения идентификатора для юнита
function AllocateUnit takes unit u returns integer
  local integer result

  // Проверяем если переменная "u" пуста или количество выделенных объектов превысило допустимое значение, то выходим из функции и возвращаем 0
  if (u == null) or (UnitCount >= JASS_MAX_ARRAY_SIZE) then
    return (0)
  endif

  set result = FreeCell

  if (result == 0) then
    set AbsMaxID = AbsMaxID + 1
    set result = AbsMaxID
  else
    set FreeCell = PrevFreeCell[result]
  endif

  set PrevFreeCell[result] = -1
  set UnitHandle[result] = u
  set UnitCount = UnitCount + 1

  return (result)
endfunction

// Функция удаления идентификатора юнита
// ВАЖНО! Передаваемый идентификатор не должен быть ниже 1 и не выше JASS_MAX_ARRAY_SIZE(На данный момент равно 8192)
function DeallocateUnit takes integer unit_id returns nothing

  // Если идентификатор объекта равен нули или значение предыдущей свободной ячейки не равно -1, то выходим из функции(если передаваемый идентификатор не будет попадать в допустимые рамки(от 1 до 8192), то движок сам выйдет из функции, так как такой переменной просто не существует
  if (unit_id == 0) or (PrevFreeCell[unit_id] != -1) then
    return
  endif

  //ну тут всё понятно
  set UnitCount = UnitCount - 1
  set UnitHandle[unit_id] = null
  set PrevFreeCell[unit_id] = FreeCell
  set FreeCell = unit_id
endfunction
Старый 29.12.2010, 13:39
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
Icy, при удалении юнита лучше последнею ячейку переместить на место удаленной. Во первых быстро, во вторых сразу избавишься от некоторых багов.

King Ksel добавил:
Имхо vJass рулит
Код:
struct myUnit
 static myUnit array All
 static integer count = 0
 unit u
 integer id
 //User Values
 integer value1
 integer value2
 //и так сколько хочешь и чего хочешь
 static nethod New takes unit u returns myUnit
  local myUnit this = myUnit.create()
  set .u = u
  set .All[.count] = this
  set .id = .count
  set .count = .count + 1
  set .value1 = 0
  set .value2 = 0
  call SetUnitUserData(.u,this)
  return this
 endmethod
 method Delete takes nothing returns nothing
  set .u = u
  set .count = .count - 1
  set .All[.id] = .All[.count]
  set .All[.id].id = .id
  call .destroy()
 endmethod
endstruct
//Пример использования
...
 local unit u = //Как то берем нужного нам юнита
 local myUnit mu = GetUnitUserData(u)
 local integer v1 = myUnit.All[mu].value1
 local integer v2 = myUnit.All[mu].value2
...
Старый 29.12.2010, 13:58
ArhiVamp

offline
Опыт: 897
Активность:
Спасибо большое, пошёл учить vJass
Старый 29.12.2010, 14:11
Ответ

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

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

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

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



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