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

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

Ответ
 
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Ассоциативные массивы или прогоним SCV

Вступление


Итак , с чего же начинают все ? А вот, статью написать меня подвигло то, что столь практичный метод знает столь малое кол-во народу ( кстати сам недавно о нем узнал ). Статья предназначена для Jass’еров от мала до велика, и если вы не знаете Jass то это статья не представит для вас никакой ценности.

Вперёд с песней.


Этот метод чем то похож на SCV( System Custom Value ), а именно тем, что к хэндлу привязываются обьекты. Итак нам понадобится функция H2I :
Код:
function H2I takes handle h returns integer
return h
return 0
endfunction


Теперь качаем карту приложенную к статье. Итак ознакомимся с текстом 1-ого триггера
Код:
set udg_String[H2I(t)-0x100000] = "Trig #"


Здесь мы видим привязку глобалки String к только что созданному таймеру. ( не бойтесь 0х100000 – это число в 16-ично системе счисления, без него будет 10-и значное число) Далее :
Код:
local trigger tt = CreateTrigger()
call DisplayTextToPlayer(Player(0),0,0,udg_String[H2I(t)-0x100000]+I2S(H2I(tt)-0x100000))

Здесь мы видим, что создается триггер и на экран выводится его номер, причем эти номера последовательные. Следовательно при привязки глобальных переменных к хэндлу, никогда не будет совпадений в номерах. Теперь отключим первый триггер и включим второй. Собственно они отличаются только лишь одной строкой
Код:
call DestroyTrigger(tt)


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

Практическое применение :



Вобщем данный метод имеет очень большое практическое значение. Я вам покажу этот метод в действии на примере движения снарядов. Пришло время включить последний триггер.
Создаем снаряд и записываем его в переменную:
Код:
set udg_Unit[H2I(t)-0x100000] = CreateUnit(GetOwningPlayer(u),'u000',GetUnitX(u),GetUnitY(u),GetUnitFacing(u))

Тут же забиваем в переменную дальность полета снаряда:
Код:
set udg_Real[H2I(t)-0x100000] = 500

И собсвенно запускаем таймер. Теперь расммотрим функцию Move:
Код:
call SetUnitX(udg_Unit[H2I(t)-0x100000],GetUnitX(udg_Unit[H2I(t)-0x100000])+5*Cos(GetUnitFacing(udg_Unit[H2I(t)-0x100000])*bj_DEGTORAD))
call SetUnitY(udg_Unit[H2I(t)-0x100000],GetUnitY(udg_Unit[H2I(t)-0x100000])+5*Sin(GetUnitFacing(udg_Unit[H2I(t)-0x100000])*bj_DEGTORAD))

Изменяем координаты юнита забитого в переменную Unit с уникальным номером нашего таймера. Далее уменьшаем переменную Real:
Код:
set udg_Real[H2I(t)-0x100000] = udg_Real[H2I(t)-0x100000] - 5
И когда снаряд пролитит определенное растояние юничтожаем его и таймер к которому он привязан.
Вот собсвенно и всё , я надеюсь что данная статья будет полезной. Жду предложения и замечяния, если таковые имеются =).

Конец

Прикрепленные файлы
Тип файла: w3x Massivs.w3x (13.6 Кбайт, 23 просмотров )
Старый 28.03.2009, 09:51
adic3x

offline
Опыт: 108,439
Активность:
1 вопрос автору - как он думает что будет если хендл обьекта превысит 0x00102000?
2 вопрос автору - как он думает что будет если хендл юнита на которого он аттачит значение будет "очищен" движком и в последствии присвоен другому юниту?
Старый 28.03.2009, 11:38
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
  1. А это вообще реально, если их уничтожать?
  2. Я предлагаю аттачить к тригерам и к таймерам( они вроде не очищаются ) и я не в коем случае не призываю людей аттачить к юниту.
Старый 28.03.2009, 11:52
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
Способ - не абсолютно fault-safe. Будет вылет если индекс выйдет за границу массива в 8192 элемента.

плюс
Цитата:
Сообщение от ShadoW DaemoN
этот метод не подойдет, если ты захочешь что-то зааттачить на хендл из "внутренней области" (т.е. с H2I(h) < 0x100000).


ну и плюс ко всему, это давно не ново: http://xgm.guru/forum/showpost.php?p=463224&postcount=7
и почитай вот эту тему, там много интересного на этот счет: http://xgm.guru/forum/showthread.php?p=463204
Старый 28.03.2009, 11:52
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Van Damm хм , я и не писал что он нов, я писал ,что о нем нет статей и что о нем мало кто знает. Я думаю если грамотно удалять хэндлы то значение в 8192 не будет превышено

ELDAR добавил:
Цитата:
Из этого можно сделать вывод, что при своевременном удалении хэндлов не возникнет ошибок с величиной массивов.
Старый 28.03.2009, 11:58
agentex

offline
Опыт: 34,834
Активность:
ELDAR это все давно и ежу понятно. Токо одно но - оффсет надо брать не 0x100000, а хендл обьекта созданного сразу после инициализации (когда все статичные обьекты созданы тригерры и др). Границы массива преодлеть довольно трудно, если конешно код не кишит утечками.
Старый 28.03.2009, 12:01
J
expert
offline
Опыт: 48,447
Активность:
статью фтопку, идеия не нова, ей уже 3 года если не больше, всегда был против способа кастрирования хендла для атача чегонибудь на обекты

J добавил:
agentex нет, кокраз таки лучше начинать именно с этой цыйры, потомучто вместе с тригерами создаются и юниты и пр. и если они убиваются например, то их хендлы освобождаются и если мы приатачим на них ченибудь то они будут в отрицательном индесе масива, тем самым и так шаткая система становится еще более шаткой
Старый 28.03.2009, 12:21
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Хм, интерестно найдется ли кто нить, кто за этот метод
Старый 28.03.2009, 12:21
J
expert
offline
Опыт: 48,447
Активность:
ELDAR, ShadoW DaemoN вроде его юзает, больше никого незнаю
Старый 28.03.2009, 12:22
adic3x

offline
Опыт: 108,439
Активность:
свдн - хз
я не говорю что этот метод плохой/хороший. я говорю что всему свое место
Старый 28.03.2009, 12:28
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Я вот что понял, этот метод может быть годен для карт не особо здаровых, на которых менее 7000 обьектов(таких карт большенство), и если автор емеет прямые руки.

ELDAR добавил:
И вообще, этот метод хорошая замена SCV , не менее но более
Старый 28.03.2009, 12:33
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
и если автор емеет прямые руки

к сожалению вся индустрия сейчас и пытается делать продукты, которые можно было бы использовать без прямых рук
Старый 28.03.2009, 12:37
Toadcop

offline
Опыт: 54,313
Активность:
Цитата:
я и не писал что он нов, я писал ,что о нем нет статей и что о нем мало кто знает.
это очень хорошо советую что бы нубы снова не имели повод тупить как можно быстрей спрятать эту статью... (это не шутка...)

Цитата:
ELDAR, ShadoW DaemoN вроде его юзает, больше никого незнаю
я юзаю тока у меня всё рацыональней. а не такой фри стайл... я юзаю тока на статик хендл аррей.
Старый 28.03.2009, 14:19
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
я юзаю тока у меня всё рацыональней. а не такой фри стайл... я юзаю тока на статик хендл аррей
расскажи ка, плиз =)
Старый 28.03.2009, 15:11
Toadcop

offline
Опыт: 54,313
Активность:
ELDAR толку то нету ка. ну очевидно я не использую -0x100000 для получения хеша... а минимальный хендл из массива.
Старый 28.03.2009, 16:13
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
Цитата:
ELDAR толку то нету ка
не обоснованный вывод, поделился бы с народом хорошей идеей.
Старый 28.03.2009, 17:49
MF
Что-то вокруг не так
offline
Опыт: 26,594
Активность:
ELDAR, в плане атача к таймерам... ИМХО лучше все вешать перебор массива на 1 таймер, чем все элементы на отдельные таймеры.

MF_Andreich добавил:
ну и SCV давно прогнан (умные люди им и не пользовались, так как все решаетс грамотно организоваными массивами, а после изобретения структур все стало еще проще)
Старый 28.03.2009, 18:02
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
А собственно какая разница между этой системой и кешем ?
Старый 29.03.2009, 09:14
ELDAR
НИИ 4А-ВО кафедра SPELLS
offline
Опыт: 8,394
Активность:
PlayerDark оч. большая, кешь сохраняет данные на компьютере хоста. Поэтому от него отказались Jass'еры , т.к. оч медленно.
Старый 29.03.2009, 10:12
adic3x

offline
Опыт: 108,439
Активность:
Цитата:
кешь сохраняет данные на компьютере хоста. Поэтому от него отказались Jass'еры , т.к. оч медленно.

лол? фраза сия бред

ADOLF добавил:
// едем в жасс раздел
Старый 29.03.2009, 10:28
Ответ

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

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

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

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



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