Что же
Что же нужно сделать, чтобы создать MultiBoard?
Нужно использовать действие: Меню паузы – Create.
Пример:
Create a multiboard with 3 columns and 2 rows, titled "Мультиборд"
Это действие приводит к тому, что будет создан MultiBoard под названием “Мультиборд” с 3-мя столбцами и 2 строчками. (сам MultiBoard - это таблица, которая состоит из столбиков и строчек, например, как MO Excel)
Вы можете попробовать, но учтите, что MultiBoard не может быть одновременно создан во время загрузки карты, и поэтому перед его созданием ставьте событие Wait 0.1 (Но также можно обойтись без Wait- указав в событии не Map initialization, а время - Elapsed game time is 0 seconds). А теперь попробуйте сами создать MultiBoard.
Вы заметили, что во время игры появилась какая-то шести-глазая лажа).
Это связано с тем, что по умолчанию стоит иконка в виде глаза (исправить это можно в игровом интерфейсе), а так как у нас 3 столбца и 2 строчки, то создается 6 иконок и текстов, расположенных правее их. Но так как тексты у нас пока не написаны, они не отображаются.
Запомните! Сolumn – это столбик, а row – это строчка.
Можно даже сказать, что сolumn – это x (абсцисса) координата, а Row – это y (ордината).
Подсчет столбиков и строчек начинается с верхнего левого угла MultiBoard-а.
Чтобы поменять глаз на другую иконку необходимо воспользоваться действием “Меню паузы – Set Item Icon”:
Пример:
Set the icon for Last created multiboard item in column 2, row 1 to UI\Feedback\Resources\ResourceGold.blp
После этого действия в последнем созданном MultiBoard’е в 1-ой строчке 2-ого столбца, если иконка не будет скрыта, она примет вид монетки, потому что “ UI\Feedback\Resources\ResourceGold.blp” - путь, указывающий на ее текстуру. С тем же успехом можно поставить и другую текстуру, а лучше щелкнуть кнопку “Выбрать пиктограмму” и выбрать ту иконку, чья текстура нам нужна.
Также можно приписать к иконке текст с помощью действия “Меню паузы – Set Item Text”:
Пример:
Set text for Last created multiboard item in column 2, row 2 to “Надпись”
В результате во 2-ом столбце 2-ой строчки правее от иконки появится текст - “Надпись”.
Может возникнуть другая проблема, текст может не помещаться в отведенное ему пространство до следующей иконки.
Решением этой проблемы станет использование действия Меню Паузы – Set Item Width:
Пример:
Set the width for Last created multiboard Item in column 2, row 2 to 5.00% of total screen width
Ну, в принципе 1% может измеряться как длина одной иконки ну или ~0.5 см., и действие будет означать, что во 2 столбце 2 строчки расстояние, отведенное для текста, будет ровняться 1.5 см. от иконки. Почему 1.5 см.? Подсчет расстояния начинается с левой стороны иконки, и если длину поставить 1%, то текста вообще не будет видно т.к. вместо текста сразу будет следовать следующая иконка. А если поставить 0%, то эта иконка будет поверх предыдущей.
Рассмотрим следующее действие - Меню паузы – Set Item Color.
Им можно поменять цвет текста.
Пример:
Set the color for Last created multiboard item in column 2, row 2 to (100%, 0%, 0%) with 25% transparency.
Эффект этого действия заключается в том, что во 2 столбце 2 строки текст поменяет свой цвет на красный, который к тому же будет немного прозрачным. Но почему именно красный? Потому что все цвета определяются по технологии RGB (RedGreenBlue) по трем цифрам - от 0 до 255. Но у нас стоят проценты, и за 255 принято 100%. Значит, получилось, что в нашем цвете 100% красных оттенков, 0% зеленых и 0% синих. В действии есть еще 4 число, оно определяет прозрачность текста, у нас стоит 25% прозрачности. Обратите внимание! Не “видимости”, а ”прозрачности”. Сам MultiBoard по умолчанию прозрачный на 25%, если не заметили можете проверить - что рельеф, юниты и т.п. видны сквозь него..., потому лучше ставить и текст прозрачным на 25% чтобы он не сильно но сочетался с MultiBoard’ом... Эту прозрачность установленную по умолчанию можно убрать в "игровом интерфейсе" заменив иконку фона MultiBoard'а.
Также можно поменять название MultiBoard'а при помощи действия Меню паузы – Change Title и поменять его цвет также как в случае с текстом, но только действием Меню паузы – Change Title Color.
Ещё можно скрывать иконки и тексты не удалая их содержимое: Меню паузы - Set Item Display Style
Пример:
Set the display style for Last created multiboard item in column 2, row 2 to Показать text and Скрыть icons.
Получится, что в указанном месте исчезнет иконка. Возможно также скрыть текст (не удалить, а просто сделать его невидимым), а можно и то и другое.
Событие Меню паузы – Destroy, Полностью удаляет MultiBoard.
А событие Меню паузы – Show/Hide просто делает его невидимым, сохраняя все настройки. Потом его можно снова показать, и он останется без изменений.
MultiBoard можно также свернуть в правый верхний угол действием Меню паузы – Minimize/Maximize.
А можно и удалить все его параметры, используя действиеМеню паузы – Clear. Следует учесть, что при применении этого действия число колонок и столбцов приводится к 0.Также их количество можно изменить при помощи действий:
Меню паузы – Change Number Of Rows (Изменяет количество строк);
Меню паузы - Change Number Of Columns (Изменяет количество столбцов).
Обратите внимание, что на их количестве стоят ограничения, но это можно легко обойти, использовав на месте числа, функцию – Arithmetic. И при ее помощи можно задавать сколько угодно колонок и столбцов, например максимум столбцов 16 – а мы хотим 40, и потому делаем 20+20, и все.
Запомните:
Главное в MultiBoard’е - это дизайн. Если всё будет стоять где попало, и все тексты будут написаны одним цветом, то они мысленно сливается друг с другом, и будет сложно понять, на какую именно строчку смотреть:
Это может быть очень плохо, если вы играете в очень активную карту, и время, чтобы посмотреть на MultiBoard всего секунда. Тогда приходится искать глазами, где та или иная информация, которая нужна, а если, например, выделить ее красным, то глаз сразу реагирует на нее, и следить за состоянием информации гораздо проще – в этом суть дизайна.
Также будет полезно знать, что расстояние между строчками изменить НИКАК нельзя, не через триггеры не через джаз, не через что-либо еще...
Пожалуй, по теории это все.
. Если при оформлении MultiBoard’а в одном из его действий в значении столбца/строчки поставить "0", то в этом случае действие произойдет на все столбики/строчки
Пример:
Set the color for Last created multiboard item in column 2, row 0 to (100%, 0%, 0%) with 0% transparency.
В этом случае весь текст, на всех строчках во 2-ом столбике станет красным, тоже правило действует если указать "0" в номере строчки.
Если же указать "0" и в столбике, и в строчке, то в этом случае изменение произойдет со всем multiboard’ом.
2. Вы наверно уже видели Multiboard в карте Dota? Вы наверно обратили внимание, что Multiboard не показывает неиграющих игроков... как же это сделать? очень просто, сначала необходимо создать 2 переменных:
1) Одна обычная, типа целочисленная переменная (integer), назовем ее "player"
2) Одна массив, типа игрок (player), назовем ее "MBplayer"
При событии "Map Initialization" делаем следующее:
Событие
Map initialization
Условие
Действие
Set player = 0
For each (Integer A) from 1 to 12, do (Actions)
Цикл - Действия
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условие
((Player((Integer A))) slot status) равно "Играет"‚
То - Действия
Set player = (player + 1)
Set MBplayer[player] = (Player((Integer A)))
Иначе - Действия
И что же у нас получилось? Объясняю:
у нас получилось что player стал равным количеству ТОЛЬКО ИГРАЮЩИХ игроков на карте.
А в переменную MBplayer в значение [1] записан первый по номеру играющий игрок, в [2] - второй по номеру, и т.д. но не обязательно, что в [1] записан первый игрок (красный), т.к. его может не быть (он может не играть), а в [1] записан именно первый ИГРАЮЩИЙ игрок, ну и т.д.
И зачем же это все нужно?
А всё очень просто, например, у нас будет Multiboard, показывающий характеристику игроков (ну как в картах жанра AoS). Пусть это будет что-то вроде таблицы (правда Multiboard и есть таблица) заголовки которой будут занимать... скажем... 2-е строчки, а дальше идет перечисление игроков, а потом в самом низу таймер, показывающий время игры...
Общий размер MultiBoard’а у нас получается из:
1. 2 - строки заголовков
2. количество играющих игроков
3. 1 - строчка для таймера
В общей сумме получается так: 3 + player строк.
это мы узнали с каким количеством строк нужно создавать Multiboard, количество столбиков уже зависит от самого вашего Multiboard'a...
Далее, зачем нам понадобилась переменная MBplayer?
Т.к. есть такая функция "Преобразование - Convert Player Index To Player", она может пригодиться для Multiboard’а, а именно в использовании цикла на распределение очков убийств. Хотя эта функция определяет игрока по его номеру, такое в данном случае не выйдет, потому что у нас совершено иной набор игроков и потому вместо этой функции мы будем использовать переменную MBplayer, которая содержит тот набор, который нам нужен.
Все циклы используем от 1 до player, потому что больше не требуется. Ведь у нас все равно игроков не больше player’а.
Примечание: Если вы еще будете где-то использовать какие-либо циклы с действиями над всеми игроками, используйте его также от 1 до player’а, т.к., опять повторю - "больше не требуется".
Остался таймер... советую посмотреть эту тему, там вы поймете, как делать таймер. Но т.к. строка таймера у нас всегда разная, то она будет всегда равна 3+player. Вот вроде бы и примерное объяснение такого Multiboard’а...
3. Как сделать для каждого игрока MultiBoard отдельно?
Очень распространённый вопрос, но сделать это легко... Однако только через jass...
Для начала нам понадобится переменная-массив типа multiboard, и назовем ее "MB".
Нужно при инициализации использовать код:
local integer i = 1
call TriggerSleepAction( 0.01 )
loop
exitwhen i > 12 //12 - это количество всех игроков, но как уже говорилось выше (во 2-ом пункте), лучше здесь указать не 12, а переменную udg_player.
set udg_MB = CreateMultiboardBJ( ROWS, COLUMNS, "TITLE" )
call MultiboardDisplayBJ( false, udg_MB )
set i = i + 1
endloop
//верхний цикл, создавал 12 совершено разных MultiBoard’ов, и записал их в переменную массив MB по порядку
set i = 1
loop
exitwhen i > 12
if ConvertedPlayer(i) == GetLocalPlayer() then //ConvertedPlayer(i), это то о чем говорилось во 2-ом пункте, но если вы хотите делать также как и там, то тут вместо этого следует указать переменную udg_MBplayer[i].
call MultiboardDisplayBJ( true, udg_MB )
endif
set i = i + 1
endloop
[I]//этот массив показал для первого игрока MultiBoard который находится в переменой MB[1], для второго - MB[2], и т.д.
Данный код создаст 12 MultiBoard’ов, каждый из которых будет помещен в переменную MB, от 1 до 12 ячеек. Мультиборд из первой ячейки будет показан 1-ому игроку, MultiBoard из 2-ой ячейки будет показан 2-ому и т.д.
Если же мы хотим изменить multiboard у 4-ого игрока, надо изменять MB[4], если же хотим изменить multiboard у всех игроков, то надо будет изменить каждую ячейку переменой MB. Лучше конечно использовать цикл...
Примечание: Вообще-то было бы лучше, если будет использован пункт 2 из данной части статьи, и при последующем создании multiboard’а он будет создаваться циклом не для всех игроков (играющих и не играющих), а для только играющих, через цикл от 1 до player, потому что нет смысла показывать multiboard игрокам, которые не играют.
Ну вот и все...
Действия я подробно расписывать не буду, т.к. если вы внимательно хотя бы 2 раза прочитали “теорию” у вас не должно возникнуть с этих проблем, и вы должны постараться справиться сами, т.к. практика учит быстрее теории.
В конце статьи прикреплен файл, с уже сделанным MultiBoard’ом, о котором будет идти речь. Вы можете просмотреть его, НО!! Суть практики не в том, чтобы смотреть уже сделанную работу, а в том, чтобы самим ее сделать. Настоятельно рекомендуется сначала попробовать самим, хоть даже если это и покажется сложным.
Рассмотрим создание multiboard’a, который будет отображать, жив юнит или мертв, и если он мертв, то будет показано, через какое время он воскреситься.
Сначала попробуйте сделать MultiBoard сами, прочитав только его описание и руководствуясь этой картинкой (на ней изображено что должно получится).
если вы сможете его сделать, то читать практику необязательно, но можете скачать прикрепленный файл для сравнения.
Если не получилось - прочитайте инструкцию. Смысл инструкции в том, что она не указывает, какие действия надо ставить, а только говорит, каков эффект будет от данного действия. Вы прочитали теорию, и должны знать, какое действие поставить. Если все равно не получается - смотрите пример.
Состояние юнита
Создадим простейший MultiBoard
Инструкция
Для начала создадим карту, удалим все действия из триггера “Initialization”, и первое, что поставим - это “Wait 0.1”. После этого создаём MultiBoard c 2-я столбцами и 3-я строчками, назовем этот MultiBoard “Состояние юнита”.
Далее можно пользоваться циклами, но так как предполагается, что читатель – новичок, будем делать без циклов - просто по порядку.
(Чтобы было меньше писать столбики и строчки будем обозначать так: x-y, где X- столбцы, Y – строчки.)
Далее делаем, чтобы в позициях 1-1, 1-2, 1-3, 2-1, 2-2, 2-3, скрывалась иконка, но показывался текст.
Далее:
Действия:
-на позицию 1-1 припишем текст “Имя:”
-на позицию 2-1 припишем текст “Состояние:”
//Мультиборд у нас будет в виде таблицы, и выше перечисленные тексты будут являться заголовками столбцов.
-на позицию 1-2 припишем текст “Артес -”
-на позицию 1-3 припишем текст “Иллидан -”
//Эти имена будут стоять в колонке "Имя", и они будут неизменны.
-на позицию 2-2 и 2-3 припишем текст “Жив”.
//Это будет стоять в колонке "Состояние", и они будут меняться по ходу игры.
//Следующее, что надо сделать, это оформить, определим расстояние для каждого текста:
-на позицию 1-1, 1-2, 1-3 делаем расстояние 5%;
-на позицию 2-1, 2-2, 2-3 делаем расстояние 7%;
//Сейчас у нас готов MultiBoard, но он крайне некрасив - все слова написаны белыми буквами.
//Так что следующий шаг - это дизайн:
-Цвет названия делаем красным (100%, 0%, 0%)
-Цвет текста (1-1 и 2-1) делаем синим (0%, 0%, 100%)
-Цвет текста (1-2 и 1-3) делаем зеленым (0%, 100%, 0%)
-Цвет текста (2-2 и 3-3) делаем желтым (0%, 100%, 100%)
Первый триггер у нас готов!
Далее поставим 2-х юнитов на карту рядом друг с другом (Артеса и Иллидана).
Создаем переменную-массив integer (целочисленная) OTC4ET.
Создаём следующий триггер:
Событие
Generic Unit Event, Юнит умирает.
В действиях: Создаем 2 действия – If / Then / Else, Multiple Functions.
В первом ставим, что:
Если: Умерший юнит = Артес
То:
Set OTC4ET (1) = 30
//Далее без циклов тут не обойтись потому создаем цикл
For each (integer from 1 to 30, do (Actions)
Цикл – Действия
//Далее создаём в позиции 2-2 текст, используя пару функций
(Делаем действие создание текста с функцией (Мертв(+((String(OTC4ET(1)))+сек.)))
//Что это значит? Это означает что создастся текст “Мертв(" + "[текущее значение переменной OTC4ET(1)]" + "сек.)”
//Далее, конечно же, ставим действие:
Set OTC4ET (1) = OTC4ET (1) - 1
Wait 1.00 game-time second
//На этом цикл закончился.
(Создаем текст в позиции 2-2 “Жив”)
//И ставим действие возрождение героя:
Герой – Instantly revive (Triggering unit at (Position of (Triggering unit), Показать revival graphics))
//Все
//(В следующем действии (If / Then / Else) ставим ВСЕ ТО ЖЕ САМОЕ только заменяем в условии Иллидана на Артеса
//А во всех действиях создания текста в MultiBoard’е заменяем 2-2 на 2-3. И везде используем переменную не OTC4ET(1), а OTC4ETT(2).
Теперь запустите карту, и убейте любого юнита другим юнитом и посмотрите на Multiboardd. Всё отлично!
Надеюсь, вы поняли, как делать MultiBoard, ниже я выложил его пример.
Примечание: Действие - Wait, очень плохо работает, и если зделать через него промежуток в 30 сек, то он будет ждать не 30 сек, а совсем другое время но примерно равное 30, также лучше вместо него использовать таймер..