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

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

 
Warden
:::...
offline
Опыт: 26,106
Активность:
Группы предметов или “Долой ItemPool!”
<Глава 1 : Близовский Item Pool>

Вы спросите - “Что такое Item Pool” - это скрытые близовская функции, позволяющие создавать нестандартные группы предметов.

Функции ItemPool - немного недоделанные, но все же могут кому-нибудь пригодиться…
Основная недоделка функций в том, что загрузить предмет из группы можно только случайный, хотя в функции сохранения предмета в ItemPool есть оператор номера объекта…

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

Функции ItemPool

native CreateItemPool () returns itempool - оператор, для локальной переменной.
Например :
local itempool ip = CreateItemPool()

native DestroyItemPool (itempool whichItemPool) returns nothing - функция для уничтожения переменной типа ItemPool
Например call DestroyItemPool(ip)

native ItemPoolAddItemType (itempool whichItemPool, integer itemId, real weight) returns nothing - Функция для добавления типа предмета в группу ItemPool.
Например :
call ItemPoolAddItemType (ip, ‘I000’, 1) - Регистрация предмета ‘I000’ в группу “ip”, под номером 1.

native ItemPoolRemoveItemType (itempool whichItemPool, integer itemId) returns nothing - Удаления предмета из группы.
Например :
call ItemPoolRemoveItemType (ip, 1) - удаления типа предмета из группы “ip”, под номером 1.

native PlaceRandomItem (itempool whichItemPool, real x, real y) returns item - А вот и функция, для загрузки случаного предмета из группы :
Например :
call PlaceRandomItem (ip, GetUnitX(u), GetUnitY(u)) - создать случайный предмет из группы “ip” на позиции юнита “u”.

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

<Глава 2 : Кэш группы для предметов>

Я знаю, что в первом разделе я заставил вас задуматься - “Зачем он написал эту статью” или “Что за бред он несет”. Моя цель написать необычную статью, с объективным содержанием, что может отразиться в этой главе.
Все же иногда бывает нужно как-то классифицировать предметы по собственным группам и я хочу сначала рассказать, как это правильно сделать, а потом привести примеры, для чего это бывает нужно и доказать, что это удобно.
Я написал несколько функций, которые отлично во всем заменят ItemPool, упростят ее и добавят новые возможности.

Код:
function ig_cache takes nothing returns gamecache    
    return InitGameCache("cache.w3v")
endfunction

function save_group_item takes integer gr, integer num, integer val returns nothing
   call StoreInteger(ig_cache(), I2S(gr), "ItemGroupItem" + I2S(num), val)
endfunction

function load_group_item takes integer gr, integer num returns integer
   return GetStoredInteger(ig_cache(), I2S(gr), "ItemGroupItem" + I2S(num))
endfunction

function remove_group_item takes integer gr, integer num returns nothing
   call StoreInteger(ig_cache(), I2S(gr), "ItemGroupItem" + I2S(num), 0)
endfunction

function clear_group takes integer gr returns nothing
   call FlushStoredMission(ig_cache(), I2S(gr))
endfunction


Выше изложенная система, отлично заменит ItemPool и добавит много новых возможностей.
Для не очень опытных картостроителей я распишу для чего нужна каждая функция :

ig_cache - нужна для всех функций системы - хранит в себе данные о группах и предметах.

save_group_item - первая основная функция системы - обеспечит удобную регистрацию предмета в группу.
Например :
call save_group_item (2, 1, 'ankh') - Зарегистрировать “Крест перерождения” в группу номер ‘2’, под номером ‘1

load_group_item - вторая основная функция системы - обеспечит быстрое нахождение ячейки предмета в группе.
Например :
call CreateItem( load_group_item(1, GetRandomInt(1, 6)), GetUnitX(u), GetUnitY(u) ) :
locad_group_item(1, GetRandomInt(1, 6)) - использовать случайный предмет группы 1, с промежуточным номером от 1 до 6
set it = locad_group_item(1,1) - тип предмета равен типу предмета под номером 1, в группе номер 1.

remove_group_item - служит для удаления данных о предмете выбранной группы.
Например :
call remove_group_item (1,1) - удалить предмет группы 1, под номером 1.

clear_group - удалить все данные и саму группу.
Например :
call clear_group (1) - удалить группу 1

В общем принцип системы наверное ясен и я могу перейти к описанию ее применения.
По правде я не смог найти много применений системе, но я думаю, что вы сами найдете.
Прикрепленный к статье файл объяснит, вам почему это удобно.
А вот краткий список применений системе :

1. Допустим вы делаете Арену, у вас есть такой аспект, как выпадение случайного предмета после смерти героя… - создайте группу, зарегистрируйте нужные предметы и готово.
2. Функции удобны для тех, кто делает AI для карт типа AoS… - можно каждому герою создать свой список предметов, используя группы.
3. Возможности переключения групп -- глобальными массивами этого не добиться.

Но самое главное, что для системы не нужно создавать кучу глобальных переменных и пользоваться ею легче и удобней, чем глобальными переменными. Система отлично подойдет для распространенного типа Jass-еров, которые “презирают” глобальные переменные.

В прикрепленном к статье файле - доходчиво практикована вся информация второй главы.
Надеюсь теперь вам понятно, как лучше создавать нестандартные группы предметов...
Прикрепленные файлы
Тип файла: w3x AdvancedItemPool.w3x (14.7 Кбайт, 47 просмотров )
________________
//
Старый 28.11.2006, 15:03
dk

offline
Опыт: 59,786
Активность:
Warden ты несовсем правильно понял назначение этих функций. Они находятся в группе "рандомайзеров" и он служит как раз для создания случайных предметов из заранее созданой группы. И применяются как раз здесь:
Цитата:
Допустим вы делаете Арену, у вас есть такой аспект, как выпадение случайного предмета после смерти героя… - создайте группу, зарегистрируйте нужные предметы и готово.
Есть аналогичные функции для юнитов (UnitPool).
Так, что они вполне доделаны и выполняют свое назначение: рандом.
Цитата:
call ItemPoolAddItemType (ip, ‘I000’, 1) - Регистрация предмета ‘I000’ в группу “ip”, под номером 1.
Я практически уверен, что третий задаваемый функции параметр это не номер, для чего тогда он real.
Но чем он точно является я тоже не догадываюсь, судя по переводу вес =)
Цитата:
Их можно использовать только в одном триггере
Всмысле только в одном? Ну создай глоб. переменную типа итемпулл и все, в чем проблема? Да и работать с ними через кеш, нечуть не хуже чем с тем же юнитом.

Твоя же нароботка является не аналогом этих функций, скорее это просто способ юзать сколько угодно групп итемов(нужная вещь кстати). Конечно с помощью наработки можно найти и случайный предмет из группы, но столько обращений к кешу будут работать куда медленнее чем движковые функции. Короче наработку в барахолке наверно разместить не помешает. Пока все =)
Старый 28.11.2006, 16:37
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Участник проектов:
-Dark Way To The Sky
А где функции с условиями??? Фе, IsItemInGroup?
И вообще, уж если упрощать жизнь, то надо это делать основательно. То есть, добавить функцию, например
Код:
function CreateItemByPool takes real x, real y, string s, gamecache gc, и т.д.

Чтоб она сама генерила предмет внутри и создавала его
FoK_KruGer, для тех кто нипанимаит, твоя подпись - абуз!
________________
Как ни странно
Старый 28.11.2006, 16:42
Warden
:::...
offline
Опыт: 26,106
Активность:
Цитата:
Ну создай глоб. переменную

Ну я ваще не пользуюсь глобалками и многие жассеры тоже =)

Цитата:
для чего тогда он real.

Я блин тоже гадал... Причем тут "вес", но по структуре - это похоже на номер предмета...

Я видимо не все Pool-ы нашел, но по сути ими пользоваться все-равно не удобно...

ArchWorm12612 - Я думаю, ты прав, но я выложил ведь только главные функции...
Dead_knight - по любому по моей системе намного удобней, чем через Pool-ы =)
________________
//
Старый 28.11.2006, 17:15
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Участник проектов:
-Dark Way To The Sky
Warden, зря ты глобалки не юзаешь. Кэш-вчерашний день, пора переходить на более современные способы хранения информации.
________________
Как ни странно
Старый 28.11.2006, 19:16
p01nTT

offline
Опыт: 11,160
Активность:
Йа ни фишу в етом смысла
ArchWorm12612 Не знаю насчёт глобалок - к кэшу привык,всё таки сопоставляешь объекту,а не просто переменная
Старый 28.11.2006, 19:53
Алексей
Где кошачья мята?!
offline
Опыт: 26,203
Активность:
Вес - это и есть "вес", т.е. вероятность выпадения из пула данного предмета. Рекомендуется передавать туда число от 0 до 1, но можно передать и др. значения - всё равно перед выбором предмета с помощью PlaceRandomItem список (насколько я понял) нормируется к 1.
Например, если задать:
call ItemPoolAddItemType(ip,предмет1,0.1)
call ItemPoolAddItemType(ip,предмет2,0.9)
то предмет2 будет выпадать в 9 раз чаще, чем предмет1.
________________
Подпись временно недоступна...
Старый 28.11.2006, 19:55
p01nTT

offline
Опыт: 11,160
Активность:
а хде ше смысл, омг йа умирайу бес нефо
Старый 28.11.2006, 20:13
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Участник проектов:
-Dark Way To The Sky
p01nTT, ты хоть как-то говори по-русски.
Алексей, да ты прав.
p01nTT, ты не врубился в фичу. Во-первых, есть несколько резервных способов сопоставления. Например, локации.
________________
DVZEXQNTBИUW
Старый 28.11.2006, 20:54
Warden
:::...
offline
Опыт: 26,106
Активность:
Цитата:
Warden, зря ты глобалки не юзаешь. Кэш-вчерашний день, пора переходить на более современные способы хранения информации.

Я считаю, что глобалки - это мамонт, кэш пока еще рулит... или ты знаешь более совершенную систему?
________________
//
Старый 29.11.2006, 08:08
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Участник проектов:
-Dark Way To The Sky
Warden, вообще мы тут уже не в тему говорим. Лично я знаю даже несколько: Динамические массивы. CSCache.
Вообще ты почаще к Великому В заглядвай, чем он занимается.
________________
DVZEXQNTBИUW
Старый 29.11.2006, 12:18
Warden
:::...
offline
Опыт: 26,106
Активность:
"к Великому В" я часто заглядываю, но нелюблю я его мозгопарку...
________________
//
Старый 29.11.2006, 12:58
NECros88

offline
Опыт: 16,445
Активность:
Не учитывая то, что я половину не понял, статья в любом случае пригодятся для общего ознакомления.
________________
Я олицетворяю пафос и гламур
Старый 29.11.2006, 13:00
p01nTT

offline
Опыт: 11,160
Активность:
ArchWorm12612 Я локациям вещь смогу и так сопоставить - через CSCache
Старый 29.11.2006, 18:42
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
Участник проектов:
-Dark Way To The Sky
p01nTT, ну тогда да.
________________
DVZEXQNTBИUW
Старый 29.11.2006, 19:50
DioD

offline
Опыт: 45,151
Активность:
Участник проектов:
-WarCraft 3
-Minecraft
не страдайте идиотизмом, я писал как включать новые виды глобалок
регестрируем массив айтем пулов и КЕША НЕ НУЖНО
Старый 30.11.2006, 13:01

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

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

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

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



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