( +3.74 3,74 0.00 )

[Гайд][1.8+] Экранизация скорборда

Автор: TDEDETD
[Гайд][1.8+] Экранизация скорборда

Итак, допустим, вы делаете карту и хотите вывести какую-либо статистику (время, количество убийств и т.д.) на большой дисплей. Соглашусь с тем, что эта задача кажется сегодня достаточно непростой. Однако в версии 1.8 появилось огромное количество возможностей. Инструментарий новой версии позволяет строить нам самые разнообразные механизмы, в частности благодаря команде scoreboard players operation. Именно она станет главным средством для нашей задачи.
Для начала взглянем на принцип действия механизма. В данном примере я для наглядности использовал быстрый таймер, а также намерено допускал ошибки, чтобы получить разные результаты.



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

[Гайд][1.8+] Экранизация скорборда

1. Для начала нужно разработать алгоритм. Как с помощью командных блоков вывести число на экран? Если бы наше число было меньше 10, то было бы намного проще. Мы бы просто перебрали все 10 цифр с помощью тестера, и подходящую цифру скопировали бы на итоговое табло командой clone. Поэтому, чтобы вывести многоразрядное число на экран, потребуется сначала извлечь все цифры данного числа. Я думаю, трех разрядов для примера нам хватит. Для наглядности приведу реализацию этого простого, наверное, многим известного алгоритма.

 C#


Теперь реализуем данный алгоритм на командных блоках. Для начала создадим необходимые скорборды:
/scoreboard objectives add rank1 dummy
/scoreboard objectives add rank2 dummy
/scoreboard objectives add rank3 dummy
/scoreboard objectives add const dummy

Скорборд const потребуется нам для хранения константы 10.

[Гайд][1.8+] Экранизация скорборда

2. Далее присвоим нашим скорбордам начальные значения. Значения будем присваивать несуществующему игроку с ником Time:
/scoreboard players operation Time rank1 = Time time
/scoreboard players operation Time rank2 = Time time
/scoreboard players operation Time rank3 = Time time
/scoreboard players set Time const 10

Повторюсь, что time – это и есть изначальный скорборд (входные данные), значение которого мы собираемся выводить на экран.

[Гайд][1.8+] Экранизация скорборда

3. В коде программы мы могли выполнить несколько операций в одной строчке. В командных блоках, однако, такой номер не пройдет. Чтобы не запутаться, предлагаю отслеживать значения скорбордов на каждом шаге. Возьмем число, например, 123. Значения будут такие:
rank1 = 123
rank2 = 123
rank3 = 123

Теперь применим нужные операции к нужным скорбордам. Действуем по алгоритму:
/scoreboard players operation Time rank1 %= Time const
/scoreboard players operation Time rank2 /= Time const
/scoreboard players operation Time rank3 /= Time const


[Гайд][1.8+] Экранизация скорборда

4. На данный момент значения скорбордов таковы:
rank1 = 3  
rank2 = 12
rank3 = 12

Как мы видим, единицы мы уже получили, поэтому скорборд rank1 обрабатывать больше не нужно. Да, я знаю, что rank3 мы могли поделить сразу на 100, но так пришлось бы создавать еще один скорборд со второй константой. Лучше разобьем на две операции, много проблем это не добавит.
Выполняем вторые операции над rank2 и rank3:
/scoreboard players operation Time rank2 %= Time const
/scoreboard players operation Time rank3 /= Time const


[Гайд][1.8+] Экранизация скорборда

5. Отлично! Теперь все сходится:
rank1 = 3
rank2 = 2
rank3 = 1

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

[Гайд][1.8+] Экранизация скорборда

6. Построим линию 10 чередующихся командных блоков с какими-нибудь другими блоками. К каждому блоку подключим компаратор, к которому в свою очередь примкнем снова командные блоки. В блоки на линии введем команды, проверяющие значение разряда:
/scoreboard players test Time rank1 0 0
/scoreboard players test Time rank1 1 1

...
/scoreboard players test Time rank1 9 9
А в парные командные блоки введем команды, копирующие соответствующие цифры на карте в нужное место на экране:
/clone -672 11 616 -669 17 616 -677 11 615 masked
/clone -672 11 617 -669 17 617 -677 11 615 masked

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

[Гайд][1.8+] Экранизация скорборда

7. Аналогично поступаем с остальными двумя разрядами. Не забываем, что десятки мы копируем на среднюю позицию на экране, а сотни – налево.

[Гайд][1.8+] Экранизация скорборда

8. Теперь необходимо провести дополнительный сигнал, сбрасывающий выход тестовых командных блоков в случае, если игрок решит перезапустить прохождение данного отрезка карты. На этом же сигнале расположим командные блоки, удаляющие наши скорборды:
/scoreboard objectives remove rank1
/scoreboard objectives remove rank2
/scoreboard objectives remove rank3
/scoreboard objectives remove const

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

[Гайд][1.8+] Экранизация скорборда

Карта из гайда:
Внимание! Гости не имеют прав для просмотра скрытого текста, зарегистрируйтесь.

Так же есть и другие алгоритмы выделения цифр из числа, в том числе из числа с любым количеством знаков. Пример реализации приведен ниже. Этот алгоритм реализовать в игре тоже возможно, но это уже совершенно другая история. Куда проще определить количество знаков заранее.

 C#


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

    18 декабря 2015 11:37

    0

    Полезно. 5 мем
  2. Посетители

    20 декабря 2015 12:08

    0

    Безоговорочно, 5 мем.
    С визуализацией наглядности на сишарпе здорово придумано!
Для написания комментария зарегистрируйся на сайте, это займет всего пару минут, голосуй за новости, зарабатывай репутацию.

Последние сообщения с форума

Название темы
Статистика
Последнее сообщение

Просмотров: 9122

Ответов: 168

Просмотров: 146097

Ответов: 697