Приветствую вас, Гость | Среда, 09.07.2025, 01:39
Главная ? Форум ? Новости соц.сетей ? Всё для uCoz ? Набор модераторов
Реклама
Мини-чат
Топ пользователей
Баннеробмен
Последние посты
Горячие обсуждения
  • Страница 1 из 1
  • 1
Создание БАР'a с минимальным кол-вом TextDraw'ов
L1ghT
13.03.2014, 22:40 | Сообщение # 19
Пользователи
Сообщений: 36
1

Всем привет! В данной статье постараюсь подробно обьяснить как создать бар с использованием минимального кол-ва текстдравов.

Тема посвящается исключительно построению БАР'ов.

Что толкнуло меня на написание урока!?




заметил что многие скриптеры создают на каждого игрока минимум 1 текстдрав и соответственно кол-во ТД = онлайну а то и больше.

никаких ников и ссылок на работы, не хочу никого обидеть/унизить

В примере рассмотрим бар из 6 ТД:
Многие сейчас подумают что бар из 6 ТД наглядно выглядит так:

онлайн 1 игрок = 6 текстдравов
онлайн 500 игроков = 3000 текстдравов

Да, цифры не маленькие... даже при онлайне 50 чел. (300 ТД), но можно с легкостью добиться таких результатов:

1 игрок = 6 текстдравов
500 игроков = 6 текстдравов

как вы поняли всего 6 ТД на 500 игроков, звучит как бред, но поспешных выводов делать не стоит, прочтите все до конца.

начнем "построение" такого бара.

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

ВАЖНО:
Тотуриал для тех кто хоть какое-то представление имеет о следующих вещах:
- как создать текстдрав
- как cоздать бар из текстдравов
- как узнать координаты "пустого"/"полного" бара

повтаряюсь: Тема посвещается исключительно построению БАР'ов.

Думаю обьяснение как создавать текстдравы здесь не умесно. Если Вы
совершенно не умеете работать с ТД, ищите, подходящую для Вас, обучающую
статью.

ШАГ 1:
Создаем бар, на вкус и цвет естественно, я использовал данный редактор [url=http://samp-scripts.com/post/6747/[0.3d]_Zamaroht%27s_Textdraw_Editor_v1.0_Modified_by_MakuPL_-_Support_Texture/MakuPL/filterscript/other]TextDraw Editor by Zamaroht (Support Textures by Maku)[/url] и у меня получился вот бар и код.



Код
new
     Text:Textdraw1,
     Text:Textdraw2,
     Text:Textdraw3,
     Text:Textdraw4,
     Text:Textdraw5,
     Text:Textdraw6,
     Float:limit_size; //эта переменная будет "мозгом" бара, мы рассмотрим это чуть ниже

Textdraw1 = TextDrawCreate(500.000000, 101.000000, "box");
TextDrawBackgroundColor(Textdraw1, 255);
TextDrawFont(Textdraw1, 1);
TextDrawLetterSize(Textdraw1, 0.000000, -0.400000);
TextDrawColor(Textdraw1, -1);
TextDrawSetOutline(Textdraw1, 0);
TextDrawSetProportional(Textdraw1, 1);
TextDrawSetShadow(Textdraw1, 1);
TextDrawUseBox(Textdraw1, 1);
TextDrawBoxColor(Textdraw1, 255);
TextDrawTextSize(Textdraw1, 605.000000, 0.000000);

Textdraw2 = TextDrawCreate(500.000000, 114.000000, "box");
TextDrawBackgroundColor(Textdraw2, 255);
TextDrawFont(Textdraw2, 1);
TextDrawLetterSize(Textdraw2, 0.000000, -0.400000);
TextDrawColor(Textdraw2, -1);
TextDrawSetOutline(Textdraw2, 0);
TextDrawSetProportional(Textdraw2, 1);
TextDrawSetShadow(Textdraw2, 1);
TextDrawUseBox(Textdraw2, 1);
TextDrawBoxColor(Textdraw2, 255);
TextDrawTextSize(Textdraw2, 605.000000, 0.000000);

Textdraw3 = TextDrawCreate(500.000000, 101.000000, "box");
TextDrawBackgroundColor(Textdraw3, 255);
TextDrawFont(Textdraw3, 1);
TextDrawLetterSize(Textdraw3, 0.000000, 0.799999);
TextDrawColor(Textdraw3, -1);
TextDrawSetOutline(Textdraw3, 0);
TextDrawSetProportional(Textdraw3, 1);
TextDrawSetShadow(Textdraw3, 1);
TextDrawUseBox(Textdraw3, 1);
TextDrawBoxColor(Textdraw3, 255);
TextDrawTextSize(Textdraw3, 496.000000, 0.000000);

Textdraw4 = TextDrawCreate(612.000000, 101.000000, "box");
TextDrawBackgroundColor(Textdraw4, 255);
TextDrawFont(Textdraw4, 1);
TextDrawLetterSize(Textdraw4, 0.000000, 0.799999);
TextDrawColor(Textdraw4, -1);
TextDrawSetOutline(Textdraw4, 0);
TextDrawSetProportional(Textdraw4, 1);
TextDrawSetShadow(Textdraw4, 1);
TextDrawUseBox(Textdraw4, 1);
TextDrawBoxColor(Textdraw4, 255);
TextDrawTextSize(Textdraw4, 603.000000, 0.000000);

Textdraw5 = TextDrawCreate(610.000000, 101.000000, "box");
TextDrawBackgroundColor(Textdraw5, 255);
TextDrawFont(Textdraw5, 1);
TextDrawLetterSize(Textdraw5, 0.000000, 0.799999);
TextDrawColor(Textdraw5, 88);
TextDrawSetOutline(Textdraw5, 0);
TextDrawSetProportional(Textdraw5, 1);
TextDrawSetShadow(Textdraw5, 1);
TextDrawUseBox(Textdraw5, 1);
TextDrawBoxColor(Textdraw5, 88);
TextDrawTextSize(Textdraw5, 496.000000, 0.000000);

Textdraw6 = TextDrawCreate(502.000000, 104.000000, "box");
TextDrawBackgroundColor(Textdraw6, 255);
TextDrawFont(Textdraw6, 1);
TextDrawLetterSize(Textdraw6, 0.000000, 0.399999);
TextDrawColor(Textdraw6, 88);
TextDrawSetOutline(Textdraw6, 0);
TextDrawSetProportional(Textdraw6, 1);
TextDrawSetShadow(Textdraw6, 1);
TextDrawUseBox(Textdraw6, 1);
TextDrawBoxColor(Textdraw6, 16711935);
TextDrawTextSize(Textdraw6, 603.000000, 0.000000);
 текстдравы созданы, глубоко вдохнем и движемся далее

ШАГ 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 максимально заполненный бар

степень заполненности бара будем высчитывать путем умножения и сложения

Код
496.0 + ( float( box_size [playerid])*limit_size);
 вернемся к нашей непонятной переменной limit_size
сейчас у вас в голове вопрос:




почему мы будем умножать box_size [playerid]на limit_size если она = 0?
почему же все именно так.... обьясняю:
тк я сразу решил что box_size [playerid]не будет превышать 200, можно всего раз узнать и установить значение переменной
limit_size при создании текстдрава. Как это сделать!? Очень просто!

Код
limit_size = (мак. координата - мин. координата) / макс. значение box_size;
 в моем случае:

Код
limit_size = (603.0-496.0)/float(200);
или:
limit_size = (603.0-496.0)/200.0;
 как кому удобнее.

Теперь вся суть темы.

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];

public OnFilterScriptInit ()
{
     Textdraw1 = TextDrawCreate(500.000000, 101.000000, "box");
     TextDrawBackgroundColor(Textdraw1, 255);
     TextDrawFont(Textdraw1, 1);
     TextDrawLetterSize(Textdraw1, 0.000000, -0.400000);
     TextDrawColor(Textdraw1, -1);
     TextDrawSetOutline(Textdraw1, 0);
     TextDrawSetProportional(Textdraw1, 1);
     TextDrawSetShadow(Textdraw1, 1);
     TextDrawUseBox(Textdraw1, 1);
     TextDrawBoxColor(Textdraw1, 255);
     TextDrawTextSize(Textdraw1, 605.000000, 0.000000);

     Textdraw2 = TextDrawCreate(500.000000, 114.000000, "box");
     TextDrawBackgroundColor(Textdraw2, 255);
     TextDrawFont(Textdraw2, 1);
     TextDrawLetterSize(Textdraw2, 0.000000, -0.400000);
     TextDrawColor(Textdraw2, -1);
     TextDrawSetOutline(Textdraw2, 0);
     TextDrawSetProportional(Textdraw2, 1);
     TextDrawSetShadow(Textdraw2, 1);
     TextDrawUseBox(Textdraw2, 1);
     TextDrawBoxColor(Textdraw2, 255);
     TextDrawTextSize(Textdraw2, 605.000000, 0.000000);

     Textdraw3 = TextDrawCreate(500.000000, 101.000000, "box");
     TextDrawBackgroundColor(Textdraw3, 255);
     TextDrawFont(Textdraw3, 1);
     TextDrawLetterSize(Textdraw3, 0.000000, 0.799999);
     TextDrawColor(Textdraw3, -1);
     TextDrawSetOutline(Textdraw3, 0);
     TextDrawSetProportional(Textdraw3, 1);
     TextDrawSetShadow(Textdraw3, 1);
     TextDrawUseBox(Textdraw3, 1);
     TextDrawBoxColor(Textdraw3, 255);
     TextDrawTextSize(Textdraw3, 496.000000, 0.000000);

     Textdraw4 = TextDrawCreate(612.000000, 101.000000, "box");
     TextDrawBackgroundColor(Textdraw4, 255);
     TextDrawFont(Textdraw4, 1);
     TextDrawLetterSize(Textdraw4, 0.000000, 0.799999);
     TextDrawColor(Textdraw4, -1);
     TextDrawSetOutline(Textdraw4, 0);
     TextDrawSetProportional(Textdraw4, 1);
     TextDrawSetShadow(Textdraw4, 1);
     TextDrawUseBox(Textdraw4, 1);
     TextDrawBoxColor(Textdraw4, 255);
     TextDrawTextSize(Textdraw4, 603.000000, 0.000000);

     Textdraw5 = TextDrawCreate(610.000000, 101.000000, "box");
     TextDrawBackgroundColor(Textdraw5, 255);
     TextDrawFont(Textdraw5, 1);
     TextDrawLetterSize(Textdraw5, 0.000000, 0.799999);
     TextDrawColor(Textdraw5, 88);
     TextDrawSetOutline(Textdraw5, 0);
     TextDrawSetProportional(Textdraw5, 1);
     TextDrawSetShadow(Textdraw5, 1);
     TextDrawUseBox(Textdraw5, 1);
     TextDrawBoxColor(Textdraw5, 88);
     TextDrawTextSize(Textdraw5, 496.000000, 0.000000);

     Textdraw6 = TextDrawCreate(502.000000, 104.000000, "box");
     TextDrawBackgroundColor(Textdraw6, 255);
     TextDrawFont(Textdraw6, 1);
     TextDrawLetterSize(Textdraw6, 0.000000, 0.399999);
     TextDrawColor(Textdraw6, 88);
     TextDrawSetOutline(Textdraw6, 0);
     TextDrawSetProportional(Textdraw6, 1);
     TextDrawSetShadow(Textdraw6, 1);
     TextDrawUseBox(Textdraw6, 1);
     TextDrawBoxColor(Textdraw6, 16711935);
     TextDrawTextSize(Textdraw6, 603.000000, 0.000000);

     limit_size = (603.0-496.0)/200.0;
     return 1;
}
public OnPlayerSpawn (playerid)
{
     TextDrawShowForPlayer (playerid, Textdraw1);
     TextDrawShowForPlayer (playerid, Textdraw2);
     TextDrawShowForPlayer (playerid, Textdraw3);
     TextDrawShowForPlayer (playerid, Textdraw4);
     TextDrawShowForPlayer (playerid, Textdraw5);
     //TextDrawShowForPlayer (playerid, Textdraw6);
     return 1;
}
public OnPlayerUpdate (playerid)
{
     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);
     TextDrawShowForPlayer (playerid, Textdraw6);
     return 1;
}
/index/8-1
  • Страница 1 из 1
  • 1
Поиск: