ZeToX2007
offline
Опыт:
7,009Активность: |
Работа с типом unit
Работа с типом unit
ВведениеВ этой статье Вы возможно не увидите ничего нового, но тут будут описаны методы работы с типом боевая единица – сохранения любых данных, отслеживание урона, работа со снарядами и другое… Часть перваяПервое с чего начнем это хранения данных, у юнита есть весьма полезные функции – SetUnitUserData,GetUnitUserData, она может хранить integer. Прекрасно, часто бывает, что нам нужно прикрепить несколько данных… и для реализации нам потребуются несколько массивов и SetUnitUserData, она будет выступать в роли ключа в наших массивах. Для удобство сначало сделаем так: Код:
На cJass define это как бы автозамена , после компиляции все замениться на GetUnitUserData(u) Прекрасно, следующая задача – это сделать так, чтобы у каждого юнита были разные значения, для этого нам понадобиться 1 массив и 2 переменные типа integer. Код:
В cJass, при объявление переменных не в функциях они будут являться глобальные, иначе локальными. Пусть: define void = nothing Код:
Кто не знает ещё cJass смотреть сюда: (после компиляции будет именно так) Код:
Эта функция будет давать юниту уникальный номер и сохранять его. Это конечно замечательно но массив в варике рассчитан на 8192 элементов, поэтому придётся нам убирать умерших юнитов, и давать новым юнитам старые номера. Код:
Довольно простая функция, выводит юнита из игры и освобождает номер… эту функцию мы вскоре будет дополнять… и так объявив несколько массивов мы уже можем хранить данные и читать их, это самая быстрая система… пример: void TEST(){ integer i = GetIdUnit(GetTriggerUnit()) …. MyArray[i] = 5 MyArray2[i] = 10 …. } Отлично, но тут ещё возникают ряд проблем, например как присвоить id более удобным способом ? тут все просто, при инициализации мы выбираем каждого юнита и взываем функцию AddUNIT, а так же создадим функцию – альтернатива CreateUnit. Код:
И так прекрасно ! теперь созданым юнитам будут прикрепляться номера. Для удобство оформим это виде библиотеки Код:
После удаления юнита важно обнулить все массивы, где это требуется. Часть втораяПриступим ко второй части… мы можем условно разделить юнитов на: Обычные боевые единицы и снаряды. У них конечно будут разные прикрепленные к ним данные и свойства… Для начало можно копирнуть библиотеку и переписать её аккуратно это основа. Для них будут разные номера и массивы. Создадим две группы для каждой библиотеке Код:
Мы так же будет добавлять юнитов и снарядов при создании и убирать при удалении функции дополняться: Код:
Тоже самое проделаем для библиотеки снарядов… В этих группах будет находиться Все юниты и снаряды нам будет удобно обращаться к группам для реализации своих целей. так же добавим в библиотеки то что нам надо… Например, чтобы юнит мог перемещаться по оси Z, так же отсаживание урона – Допустим у нас есть триггер, где нам нужно получить урон и юнита, мы так же добавим в наши функции – TriggerRegisterUnitEvent. Для данной функции… для библиотеки снарядов это необязательно, зато добавим другое, например чтобы снаряд нельзя было выделить (москиты). ЗаключениеЗаключение: придерживаясь этой системы, мы можем наиболее быстро обращаться к данным юнита, так же отслеживать повреждения, работать со снарядами, с группами и разделять условно Юнитов на несколько типов, у которых будут свои свойства. Отредактировано ZeToX2007, 20.09.2009 в 20:19. |
14.09.2009, 19:01 | #1
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
NCrashed
offline
Опыт:
13,553Активность: |
|
20.09.2009, 20:15 | #2
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Цитата:
Ок Статья будет доработана, будут примеры использования, будет рассмотренна функция SetUnitPath, будет... только фиг знает когда всё это будет ). |
|
20.09.2009, 20:34 | #3
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
adic3x
offline
Опыт:
108,439Активность: |
как бы вопрос - как бы зачем? т.е. это ничего не дает, тем более что может запутать, т.к. кто то сторонний при чтении кода куда лучше будет понимать вызов нативки
i = ++I
+ мне очень не нравиться имена переменных в этом примере, они могут провоцировать ошибки некоректное название - в тако случае стоило бы описывать нативки например. скорее это работа с данными |
20.09.2009, 20:48 | #4
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ScorpioT1000
Работаем
offline
Опыт: отключен
|
вобщем, шлак полный. даже не постарался ошибки русского языка исправить.
угарно вобще) |
20.09.2009, 20:51 | #5
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Цитата:
где ошибки ?О_о ? |
|
20.09.2009, 20:57 | #6
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Автор кран. Серьезно. Это не оскорбление. Просто кран.
Если используешь сЖасс, то хоть используй все богатство возможностей, тот же перехват нативок...
+Названия переменных ниачомные, если тебе все понятно, то оставляй такую статью при себе и читай её, когда что-то забудешь. +Весь твой код можно записать так:
Отредактировано Hellfim, 20.09.2009 в 23:15. |
20.09.2009, 21:19 | #7
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Van Damm
wait... what?
offline
Опыт:
22,268Активность: |
Hellfim, фейл, надо так:
|
21.09.2009, 01:02 | #8
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Van_Damm, нет, не фейл, или ты считаешь, что в систему надо вностить сразу при создании? Бтв, у меня сначала так и было, но потом я подумал о том, что написано выше =) |
21.09.2009, 15:41 | #9
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Van Damm
wait... what?
offline
Опыт:
22,268Активность: |
Hellfim, фейл-фейл, у тебя бесконечный реплейс получался
Офк сейчас ты уже код изменил =) |
21.09.2009, 19:17 | #10
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Hellfim, Один вапрос, работать то так будет ? 0_0. когда SetUnitUserData принимала 1 аргумент? ну это пустики, способ не очень, так как мы при создание, и уничтожении юнита перезаписываем множество массивов. так же "айдишники юнитов" меняются это тоже не красиво и может повлечь за собой нежелательный результат. тут нет выйгрыша ни в скорости ни в логике,сорри это калл...
|
21.09.2009, 19:30 | #11
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Van_Damm
кк, я до сих пор хз, как с помщью возможностей см "незаметно" редактировать пост -.- ZeToX2007, да, с юзердата ошибся, ибо спешил =)
» исправленый вариант
Это в любом способе, даже в твоем, кол-во записываемых/перезаписываемых массивов зависит от кол-ва данных, которых польхователь хочет сохранить. А у тебя в системе юнит вносится только при создании и убирается только при смерти. А если например мне на 5 секунд надо внести его в систему, а потом убрать? Юзердата юнитов меняется и это очень "красиво". Какой? Есть и в первом и во втором. |
22.09.2009, 14:24 | #12
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Цитата:
компактное хранение информации. Цитата:
У меня обнуляется только 1 раз, когда юнит умирает, у тебя и при создания и уничтожения. Цитата:
Собственно ответил выше. Цитата:
непонятно что ты имел ввиду. ZeToX2007 добавил: Hellfim, а пример нежелательного результата: Допустим мы дожны через некоторое время, что либо изменить (в массивах) прикрепив к таймеру, "ключ" юнита, по истечению таймера должно, что либо измениться в нужных массивах, а что будет если какого либо юнита убили и номер последнего переписался ? |
||||
23.09.2009, 16:31 | #13
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
И еще раз: "а если мне не нужно заносить юнита в систему сразу при создании?"
Как именно ты собрался прикреплять? |
23.09.2009, 16:37 | #14
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|
ZeToX2007
offline
Опыт:
7,009Активность: |
Цитата:
объясни в каких случаях тебе не нужно заносить в систему юнита ? и если не надо - не заноси сразу, ничего все равно не измениться ) Если в какой либо фунции вызвана GetUnitUserData и она присвоена какой либо переменной, то не имеет смысла прикреплять юнита к таймеру, а лучше это число. если меняем такие характеристики как Хп и другие, прикрепляем юнита, а потом получаем его "айдишник" в группе. но для 1 юнита это не играет роль, а если их 30 ? то для эффективного переноса удобней работать с int и с двухмерными массивами интежеров, чем с юнитами. выйгрыш минимальный кажется, а если таймер с периодом 0.05с и ниже ? и надо исходить из удобства... |
|
23.09.2009, 23:10 | #15
+0/−0
Профиль |
Приват |
Поиск |
IP: Записан
|