| Что же Что же нужно сделать, чтобы создать 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, также лучше вместо него использовать таймер.. |