Как сделать кастомный текстдрав

Обновлено: 05.07.2024

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

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

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

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

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

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

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

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

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

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

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

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

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

вернемся к нашей непонятной переменной 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

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

Что нам понадобится:
Photoshop - для отрисовки дизайна
Magic TXD - для импорта картинки в TXD архив.
TDeditor - для изменения размера картинки и позиции на экране.

На все приложения есть ссылки на моем: boosty.to/jimtaker
Не хотите подписываться, скачивайте из общей сети интернет исходники. На boosty.to проверенные файлы лично мной. И они работоспособны.

Комментарии • 47

Крутяк, ещё бы ты сделал видео как сделать анимации интерфейсов в сампе, а то инфы по такому очень мало

Багажник и инвентарь, в первую очередь, предназначены под чистую игру, на которой они без проблем работают
Ищите проблему во вспомогательных скриптах и обращайтесь к их автору, либо удаляйте / ищите альтернативу

Valtteri Raikkonen

Найден способ починки текстдрава, что бы все нажималось.
Если не работает, пишем /mm, закрываем диалог и все работает. И так постоянно

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


Официальный сайт клана [Gn_R] - Моды, скрипты для SA-MP

Изображение Отсутствует

Примечание: Этот инструмент предназначено только для скриптеров, которые хотят создать текстдравы для своего сервера.
Если вы хотите созданные текстдравы использовать в качестве какой нибудь системы и т.п, вы находитесь в неправильном месте.

Редактор текстдравов от iPLEOMAX (v1.6 (стабильная версия) )

  • /itd - Основное меню
  • /itd top - Установка позиций панели инструментов
  • /itd bottom - Вернуть панели инструментов в исходное положение (по умолчанию)
  • Горячая клавиша 'C': копия (при редактировании textdraw)
  • Горячая клавиша 'Z': Отмена (при редактировании textdraw)
  • Удерживайте клавишу "левый Shift" во время редактирования для перемещения/изменения размера textdraws медленно, для точности.
  • Удерживайте "пробел" во время редактирования для перемещения/изменения размера textdraws быстрее.
  • Горячая Клавиша 'F': Изменение Шрифта
  • Горячая Клавиша 'P': Изменение Позиции
  • Горячая клавиша 'S': изменить размер (если при изменении размера шрифта, используйте 'Letter mode', 'size mode" работает только на текстуры/Размер коробки)
  • Горячая Клавиша 'Y': Изменение Текста
  • Горячая Клавиша "L": Изменить Размер Текста
  • Горячая Клавиша 'Q': Изменение Цвета
  • Горячая Клавиша 'B': Изменить Цвет Фона
  • Горячая клавиша 'U': Использование бокса ON/OFF
  • Горячая Клавиша 'O': Изменить Размер Плана
  • Горячая Клавиша 'W': Изменить Размер Тени
  • Горячая Клавиша 'G': Переключение на глобального (или для определенного игрока) текстдрава
  • Горячая Клавиша 'A': Переключение Типа Выравнивания
  • Hotkey 'K': Переключение Серий
  • Горячая Клавиша 'R': Переключение Пропорциональности
  • Горячая Клавиша 'M': Текстдравы в Диалоговом Окне Списка
  • Горячая Клавиша 'N': Новый Textdraw Диалог
  • Клавиша 'Esc': Закрыть редактор, вернуться в меню.

Правила публикации комментариев: 1. Запрещено оскорблять, унижать в грубой форме других пользователей.
2. Мат и грубые слова запрещены, даже в скрытой форме, для этого существуют масса слов которые заменяют мат.
3. Запрещено писать ссылки на другие сайты

Читайте также: