Title 1Title 2Title 3Title 4
Title 1

Title 2

Title 3

Title 4

назад вперед
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Мультибоард
DrKircДата: Вторник, 17.03.2009, 02:06 | Сообщение # 1
Рицензатор
Группа: Администраторы
Сообщений: 207
Статус: Offline
Данная статья расскажет вам, как надо нормально и правильно создавать MultiBoard, или в русской версии WE Меню паузы (но дальше мы будем называть ее просто MultiBoard-ом).
Это статья состоит из четырех частей, перваявведение, во второй я расскажу о теории создания MultiBoard-а, и обо всех действиях ему присущих, в третьей раскажу о некоторых хитростях и фичах мультиборда, а в четвертой перейдем непосредственно к практике, и попробуем создать свой простенький MultiBoard.

Введение

Думаю, вы все уже видели MultiBoard, т.к. не одна хорошая, или даже просто не плохая ката, не обходится без этой поистине уникальной вещи. MultiBoard может содержать в себе очень много информации, и притом совершенно не мешает окружению игры, т.к. ОчЕнЬ компактно складывается, в отличие от LeaderBoard. Его применение не ограничивается просто выводом информации, также его можно использовать во многих других по истине разнообразных целях:

1. Можно сделать часики и результат будет превосходить по качеству даже действия, типа – Обратный отсчет.
2. Можно сделать очень прикольную вещь – Радар, в принципе это весьма сложно сделать без тормозов в игре, и не приобретя много геморроя.
3. Можно также сделать всякие разнообразные простенькие игры, ну например танчики.
4. И многое-многое другое.

Теория

Что нужно сделать, чтобы создать MultiBoard:
Нужно использовать действие: Меню паузы – Create.
Пример:

Code
Create a multiboard with 3 columns and 2 rows, titled "Мультиборд"

Что означает это действие? Означает то, что будет создан MultiBoard под названием “Мультиборд” с 3-мя столбцами и 2 строчками.
Вы можете попробовать, но учтите, что MultiBoard не может быть одновременно создан во время загрузки карты, и поэтому перед созданием ставьте событие Wait 0.1 (Но также можно обойтись без Wait-а указав в событии не Map initialization, а время - Elapsed game time is 0.01 seconds). А теперь пробуйте.
Вы заметили, что создается какая-то шестиглазая лажа.
Это из-за того что по умолчанию стоит иконка в виде глаза, и так как у нас 3 столбца и 2 строчка то создается, 3*2 иконок и текстов расположенных правее их, но так как тексты у нас пока не написаны потому они не отображаются.
Запомните column – это столбик, row – это строчка.
Можно даже сказать что Column – это x (абсцисса) координата, а Row – это y (ординат).
Подсчет столбиков и строчек начинается с верхнего левого угла MultiBoard-а.

Чтобы поменять глаз на другую иконку надо воспользоваться действием “Меню паузы – Set Item Icon”:

Пример:

Code
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”:

Пример:

Code
Set text for (Last created multiboard) item in column 2, row 2 to “Надпись”

В результате во 2 столбце 2 строчки правее от иконки появится Текст - “Надпись”.
Теперь другая проблема – этот текс не помещается в отведенное уму пространство до следующей иконки.
Это решимо, нужно следующие действие: Меню Паузы – Set Item Width:

Пример:

Code
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.
Им можно поменять цвет текста.

Пример:

Code
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 число, оно определяет прозрачность текста, у нас стоит 20% “прозрачности”, обратите внимании не “видимости”, а ”прозрачности”.

Также можно поменять название мультиборда (Меню паузы – Change Title)
И поменять его цвет также как в случае с текстом, но только другим действием (Меню паузы – Change Title Color).

Можно также скрывать иконки и тексты: Меню паузы - Set Item Display Style

Пример:

Code
Set the display style for (last created multiboard) item in column [u]2[/u], row [u]2[/u] to [u]Скрыть[/u] text and [u]Показать[/u] icons.

Получится что в указанном месте исчезнет иконка, можно также скрыть текст (не удалить, а просто скрыть), а можно и то и другое.

Событие Меню паузы – Destroy, Полностью удаляет MultiBoard.
А событие Меню паузы – Show/Hide, Просто скрывает его, сохраняя все его настройки, и потом его можно снова показать и он останется без изменений.
MultiBoard можно свернуть в правый верхний угл действием Меню паузы – Minimize/Maximize.
А можно и удалить все его параметры (Меню паузы – Clear), и число колонок и столбцов приводится к 0.Также их количество можно изменить при помощи действий:
Меню паузы – Change Number Of Rows (Изменяет количество строк)
Меню паузы - Change Number Of Columns (Изменяет количество столбцов)
Обратите внимание, что на их количестве стоят ограничения, но это можно легко обойти, так как WorldEdit до тупости тупой, его можно обмануть, начиная этим способом и кончая Return Bug-ом. А все очень просто, нужно на месте числа просто использовать функцию – Arithmetic. И при ее помощи можно задавать сколько угодно колонок и столбцов, например максимум столбцов 16 – а мы хотим 40, и потому делаем 20+20, и все.

Запомните:
Главное в MultiBoard-е, это дизайн, если все будет стоять где попало, и все тексты написаны одним цветом, то они мысленно сливается друг с другом, и не понимаешь на какую именно строчку смотреть:
Это может быть очень плохо, если ты играешь в очень активную карту и время чтобы посмотреть на MultiBoard всего секунда, и приходится искать глазами, где та информация, которая нужна, а если, например, выделить ее красным, то глаз сразу реагирует на нее, и следить за состоянием информации гораздо проще – в этом суть дизайна.
И также хотел бы сообщить что расстояние между строчками изменить НИКАК нельзя, не через триггеры не через джаз, не через что либо еще...
Пожалуй, по теории это все.

Хитрости и фичи

1. Если при оформлении Мультиборд в одном из его действий в значении столбца/строчки поставить "0", то в этом случае действие произойдет на все столбики/строчки
Например:

Code
Set the color for ([u]Last created multiboard[/u]) item in column [u]2[/u], row [u]0[/u] to ([u]100%[/u], [u]0%[/u], [u]0%[/u]) with 0% transparency.

В этом случае Весь текст находящийся во 2-ом столбике станет красным, тоже правило действие если указать "0" в номере строчке.
Если же указать "0" и в столбике и в строчке, то в этом случает изменение произойдет со всем multiboard-ом.
2.Вы наверно уже видели multiboard в карте Dota? вы наверно обратили внимание что multiboard не показывает неиграющих игроков... как же это сделать? очень просто, сначала нужны 2 переменные:
одна обычная типа целочисленная переменная (integer), назовем ее "player"
одна массив типа игрок (player), назовем ее "MBplayer"
При событии "Map Initialization" делаем следующие:

Code

Событие    
    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[.b]-а...

Далее, зачем нам понадобилась переменая [b]MBplayer?

т.к. есть такая функция "Преобразование - Convert Player Index To Player" она может пригодится для multiboard-а, а именно в использовании цикла на распределение очков убийств, но эта функция определяет игрока по его номеру, но такое в данном случае не выйдет (потому что у нас совершено иной набор игроков) и потому вместо этой функции мы будем использовать переменную MBplayer, которая содержит тот набор который нам нужен.
Все циклы используем от 1 до player, потому что больше не требуется ведь у нас все равно игроков не больше player

Примечание: Если вы еще будете где использовать какие либо действия со всеми игроками, используйте этот также от 1 до player-а, т.к., опят повторю, больше не требуется.

Остался таймер... обьеснять как его делать небуду обьесню тока что строка таймера у нас всегда разная, но она будет всегда ровна 3+player, вот вроде бы и примерное объяснение такого multiboard-а...
3. как сделать для каждого игрока multiboard отдельно?
Очень распространенный вопрос, но сделать это легко... Но только через джаз...
для начало нужна переменная массив типа multiboard, и назовем ее "Multiboard".
нужно при инициализации использовать код:

Code
local integer i = 1
call TriggerSleepAction( 0.01 )
loop
     exitwhen i > 12
     set udg_Multiboard[i] = CreateMultiboardBJ( Columns, Rows, "Title" )
     call MultiboardDisplayBJ( false, udg_Multiboard[i] )
     set i = i + 1
endloop
set i = 1
loop
     exitwhen i > 12
     if ConvertedPlayer(i) == GetLocalPlayer() then
       call MultiboardDisplayBJ( true, udg_Multiboard[i] )
     endif
     set i = i + 1
endloop

данный код Создаст 12 multiboard, каждый из них, будет помещен в переменную multiboard, от 1 до 12 ячеек, multiboard/[b] из первой ячейки будет показан 1-ому игроку, [b]multiboard из 2-ой ячейки будет показан 2-ому и т.д.
Если же мы хотим изменить multiboard у 4-ого игрока, надо изменять multiboard[4], если же хотим изменить multiboard у всех игроков, то надо будет изменить каждую ячейку переменой multiboard, лучше конечно использовать цикл...

Примечание: Вообще-то было бы лучше если будет использован пункт 2 из данной части статьи, и при последующем создавании multiboard-а он создавался циклом не для всех игроков (играющих и не играющих), а для только играющих, через переменную player

ну вот и все...

Практика

Действия я подробно расписывать не буду, т.к. если вы внимательно хотя бы 2 раза прочитали “теорию” у вас не должно возникнуть с этим проблем, и вы должны стараться справится сами, т.к. практика учит быстрее теории.
В конце статьи прикреплен файл, с уже сделанным MultiBoard-ом о котором будет идти речь, вы можете посмотреть его, НО, суть практики не в том чтобы смотреть уже сделанную работу, а в том чтобы самому ее сделать, настоятельно рекомендуется сначала попробовать самим, хоть даже если и покажется сложным.

Сделаем multiboard который будет отображать жив юнит или мертв, если мертв то через какое время.
Сначала попробуйте сделать MultiBoard прочитав только его описание.
Если не получилось - прочитайте инструкцию, смысл инструкции в том что она не указывает какие действия надо ставить, а только говорит что это действие должно делать, вы прочитали теорию, и должны знать - какое действие поставить если, Если опять Если опять не получилось - смотрите пример.

Состояние юнита

Создадим простенький MultiBoard

Инструкция


Для начала создадим карту, удалим все действия из триггера “Initialization”, и первое что поставим это “Wait 0.1”, после создаем MultiBoard c 2-я столбцами и 3-я строчками, назовем этот MultiBoardСостояние юнита”.
Далее можно пользоваться циклами, но так как предполагается что читатель – новичок, будем делать без циклов - просто по порядку.

(Чтобы было меньше писать столбики и строчки будем обозначать так: x-y, где X- столбцы, Y – строчки.)
Далее делаем, чтобы в позициях 1-2, 1-2, 1-3, 2-1, 2-2, 2-3, скрывалась иконка, но показывался текст.
Далее:

Code
Действия:
-на позицию 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.

Делаем следующий триггер.

Code
Событие Generic Unit Event, Юнит умирает.
В действиях: Создаем 2 действия – If / Then / Else, Multiple Functions.
В первом ставим, что:
Если: Умерший юнит = Артес
То:    
Set OTC4ET (1) = 30
//Далее без циклов тут не обойтись потому создаем цикл
For each (integer <img src="http://s19.ucoz.net/sm/15/cool.gif" border="0" align="absmiddle" alt="cool"> 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).

Теперь запустите карту, и убейте любого юнита другим юнитом и посмотрите на MultiBoar. Правда, здорово .
Надеюсь, вы поняли, как делать MultiBoard, ниже я выложил его пример, так же и еще выложил мой Вертикальный прогрес бар, он не для использования, а большей частью для примера как создавать такие вещи... Но плохо в нем то что растояние между строчками не изменить!

Прикрепления: Stateunits.w3x (10.8 Kb) · Verticalprogres.w3x (11.0 Kb)


 
  • Страница 1 из 1
  • 1
Поиск: