L1ghT
13.03.2014, 22:40 | Сообщение # 19
Пользователи
Сообщений: 36
|
Всем привет! В данной статье постараюсь подробно обьяснить как создать бар с использованием минимального кол-ва текстдравов.
Тема посвящается исключительно построению БАР'ов.
Что толкнуло меня на написание урока!? заметил что многие скриптеры создают на каждого игрока минимум 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; }
|
|