Добавлен , опубликован

Всё о Multiboard'ах

Содержание:

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

1. Если при оформлении 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’а у нас получается из:
  • 2 - строки заголовков
  • количество играющих игроков
  • 1 - строчка для таймера
В общей сумме получается так: 3 + player строк.
это мы узнали с каким количеством строк нужно создавать Multiboard, количество столбиков уже зависит от самого вашего Multiboard'a...
Далее, зачем нам понадобилась переменная MBplayer?
Т.к. есть такая функция "Преобразование - Convert Player Index To Player", она может пригодиться для Multiboard’а, а именно в использовании цикла на распределение очков убийств. Хотя эта функция определяет игрока по его номеру, такое в данном случае не выйдет, потому что у нас совершено иной набор игроков и потому вместо этой функции мы будем использовать переменную MBplayer, которая содержит тот набор, который нам нужен.
Все циклы используем от 1 до player, потому что больше не требуется. Ведь у нас все равно игроков не больше player’а.
[indent]Примечание: Если вы еще будете где-то использовать какие-либо циклы с действиями над всеми игроками, используйте его также от 1 до player’а, т.к., опять повторю - "больше не требуется".[/indent]
Остался таймер... советую посмотреть эту тему (xgm.ru/forum/showthread.php?t=2926), там вы поймете, как делать таймер. Но т.к. строка таймера у нас всегда разная, то она будет всегда равна 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__**.__
    call MultiboardDisplayBJ( true, udg_MB__ )
  endif
  set i = i + 1
endloop
__//этот массив показал для первого игрока **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 игрокам, которые не играют.
Ну вот и все...

Содержание
3
5
14 лет назад
3
ты сразу начинаешь с как сделать чтобы игрок который не играет не высвечивался а как сделать чтобы вообще игроки в МБ были то
2
14
13 лет назад
2
  1. Как сделать для каждого игрока MultiBoard отдельно?
Очень распространённый вопрос, но сделать это легко... Однако только через jass...
НеправДо!!!
Недавно созданная система муртза доказывает что у автора рак!
1
17
13 лет назад
1
Я без знания того как делать таблицы вообще сделал мультиборд лучше, чемв доте для своей аос... Учитесь) А лучше просто включите мозги, все делается легко даже на гуи.
0
29
12 лет назад
0
MyRtZ, локалплеер - это уже джасс, не дезинформируй
0
1
11 лет назад
0
  1. Как сделать для каждого игрока MultiBoard отдельно?
А можно ли так же зделать для двух групп игроков?
0
1
3 года назад
Отредактирован Ryberoid
0
есть такая функция "Преобразование - Convert Player Index To Player", она может пригодиться для Multiboard’а, а именно в использовании цикла на распределение очков убийств ... Хотя эта функция определяет игрока по его номеру, такое в данном случае не выйдет, потому что у нас совершено иной набор игроков и потому вместо этой функции мы будем использовать переменную MBplayer, которая содержит тот набор, который нам нужен.
Так как в итоге учитывать очки убийства/смерти игроков при раскладе, что не все слоты заняты? оч жаль, что нет примерного кода в статье.
Пример, игра 6на6, но вошли игроки на слоты 1 2 4 (1ая команда) и 7 9 (2ая), 4 убил 7. При этом в мультиборде будет 5 строк с именами игроков (без учета титула и т.п.) и как добавить 2-ому очко килл, учитывая, что он занимает 2ю строку в МБ, а у 7 соотв-но очко смерти, занимая 4ю строку.

upd: Но, внезапно, возможное решение пришло: в MBplayer записывать ID играющих Player-ов. В итоге надо будет всего лишь пройтись по массиву MBplayer через if/else от 1 до player и искать совпадение значения массива со значением ID duying/killing Player. там где совпадение получим номер строки для мультиборда, игроку которому надо добавить килл/смерть.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.