Всем привет! В данной статье постараюсь подробно обьяснить как создать бар с использованием минимального кол-ва текстдравов.
Тема посвящается исключительно построению БАР'ов.
В примере рассмотрим бар из 6 ТД: Многие сейчас подумают что бар из 6 ТД наглядно выглядит так:
онлайн 1 игрок = 6 текстдравов онлайн 500 игроков = 3000 текстдравов
Да, цифры не маленькие... даже при онлайне 50 чел. (300 ТД), но можно с легкостью добиться таких результатов:
1 игрок = 6 текстдравов 500 игроков = 6 текстдравов
как вы поняли всего 6 ТД на 500 игроков, звучит как бред, но поспешных выводов делать не стоит, прочтите все до конца.
начнем "построение" такого бара.
Обращаюсь к тру оптимизаторам! Это лишь показательный код, построен как можно проще для лучшего усвоения.
ВАЖНО: Тотуриал для тех кто хоть какое-то представление имеет о следующих вещах: - как создать текстдрав - как cоздать бар из текстдравов - как узнать координаты "пустого"/"полного" бара
повтаряюсь: Тема посвещается исключительно построению БАР'ов.
Думаю обьяснение как создавать текстдравы здесь не умесно. Если Вы совершенно не умеете работать с ТД, ищите, подходящую для Вас, обучающую статью.
ШАГ 1: Создаем бар, на вкус и цвет естественно, я использовал данный редактор TextDraw Editor by Zamaroht (Support Textures by Maku)(http://samp-scripts.com/post/6747/[0.3d]_Zamaroht's_Textdraw_Editor_v1.0_Modified_by_MakuPL_-_Support_Texture/MakuPL/filterscript/other) и у меня получился код.
Код
new Text:Textdraw1, Text:Textdraw2, Text:Textdraw3, Text:Textdraw4, Text:Textdraw5, Text:Textdraw6, Float:limit_size; //эта переменная будет "мозгом" бара, мы рассмотрим это чуть ниже
текстдравы созданы, глубоко вдохнем и движемся далее
ШАГ 2: Определение границ бара. под определение границ я имею в виду координаты пустой бар/заполненний бар, в моем случае min = 496.0 max = 603.0 расказывать откуда я взял эти числа (496/603) не буду, тк выше написано
Код
Тотуриал для тех кто хоть какое-то представление имеет о следующих вещах:
Теперь давайте подумаем для чего мы будем его использовать и как? Ничего в голову не приходит поэтому.... для примера я создам переменную для каждого игрока (box_size [MAX_PLAYERS]) и в паблике OnPlayerUpdate (playerid) буду прибавлять к ней playerid+1(+1 что бы у игрока с идом 0 бокс "заполнялся") как только box_size [playerid] будет более 200 сбросим значение на 0, тем самым бар будет "заполняться" от минимума к максимуму и автоматически "опустошаться"
будет как вы поняли: box_size [playerid] = 0 пустой бар box_size [playerid] = 200 максимально заполненный бар
степень заполненности бара будем высчитывать путем умножения и сложения
вернемся к нашей непонятной переменной limit_size сейчас у вас в голове вопрос: почему мы будем умножать box_size [playerid] на limit_size если она = 0?
почему же все именно так.... обьясняю: тк я сразу решил что box_size [playerid] не будет превышать 200, можно всего раз узнать и установить значение переменной limit_size при создании текстдрава. Как это сделать!? Очень просто!
TextDrawTextSize - устанавливает размер бокса, естественно все знают об этом, и при попытке изменить размер бокса уже созданного ТД путем TextDrawTextSize (TDid, x, y); козалось бы ничего не происходит, в отличии от TextDrawSetString при использовании этой функции ТД мигом "изменяется" а вот TextDrawTextSize "молчит". Нет, это совсем ни так. На самом деле размер бокса изменяется, просто чтобы это увидеть нужно комбинировать две функции TextDrawTextSize и TextDrawShowFor(Player/All) с последовательностью как я и написал, привожу пример с нашим баром, который мы уже так долго пытаемся создать.
перейдем к паблику OnPlayerUpdate (playerid) в котором будем заполнять бар
Код
public OnPlayerUpdate (playerid) { //limit_size уже имеет нужное значение и не нудно ничего делить и умножать, //это повышает скорость выполнения кода box_size [playerid] += playerid+1; //прибавляем значение if (box_size [playerid] > 200) box_size [playerid] = 0; //если привышен лимит сбрасываем TextDrawTextSize (Textdraw6, 496.0+( float( box_size [playerid])*limit_size), 0.0); //узнаем коорд x TextDrawShowForPlayer (playerid, Textdraw6); // показываем "обновленный" текстдрав return 1; }
box_size [playerid] += playerid+1 для того чтобы убедить Вас что все работает правильно, зайдите на сервер с другом и проверьте. Вы думаете что если на сервере 2 и более игрока ТД будет "прыгать"!? Нет, не будет. Я это уже доказывал в небольшом споре и гарантирую безупречную работу.
Вот так мы получили бар в 6 ТД для любого онлайна.
Вот полный код в виде FS
Код
#include a_samp
new Text:Textdraw1, Text:Textdraw2, Text:Textdraw3, Text:Textdraw4, Text:Textdraw5, Text:Textdraw6, Float:limit_size, box_size [MAX_PLAYERS];