Как сделать текст pawn
Урок Textdraw как их создавать и с чем их едят.
Интересующийся
Итак, всем привет! Очень много мне писали в Skype или же просто видел темы на форуме, что, сейчас многие любят делать все на TextDrawах. На самом деле не так давно я сам еще не очень разбирался в них но постепенно я все нашел сам. Мне никто не помогал и поэтому я знаю как чувствуют себя те бедолаги которые желают научится работать и создавать отличные Textdraw’ы. Итак, для того чтобы отлично делать Textdraw’ы и понять с чем их едят вам нужно:
1. Действительно прямые руки, чтобы вы все делали проделанно!
2. Хоть малейший стаж работы в Павно
3. Хоть малейший стаж работы с любыми текстдравами.
4. Два скрипта (любой на выбор) ссылка будет в самом низу ↓
1. Простейшие (Круг, Полоски)
1.1. В скачанном архиве вы найдете два скрипта, советую для создания всего использовать именно скрипт TD.AMX, один минус скрипта, создать прозрачный бокс не получится, для этого прийдется делать его с помощью iTD.AMX. Итак. Запускаем ваш сервер, вводим /text и видим:
[=======================================================]
[=======================================================]
У нас создался текстдрав появился он вверху вввиде: New Textdraw, и сейчас мы с вами начнем работу с первого объекта. Круг.
Итак, жмем на нашем текстдрав который выделен на скриншоте и видим это:
[=======================================================]
[=======================================================]
Итак, если вы имеете хоть какое то знание англ. языка вам будет не так трудно. А если нет тогда делайте дальше по шагам.
Итак, жмем на Change Font и выбираем там FONT TYPE 4.
Далее жмем EDIT BOX, и выбираем BOX ON. Теперь видим строку CHANGE TEXT STRING и вписываем туда:
ld_pool:ball
и ничего не произошло, теперь возврашаемся в EDIT BOX и выбираем BOX SIZE.
А дальше просто растягиваем сколько нам нужно с помощью клавиш W D S A, для более быстрого редактирования советую зажать SHIFT. И у вас получится это:
Если вы это усвоили, то теперь обьясняю в чем легкость рисования этим способом, весь путь которй вы сейчас проделали, мы будем делать снова, только вместо LD_POOL:BALL мы будем вписывать кое что другое. А теперь спросите вы, как же найти название что вводить. Все очень просто друзья. Вам понадобится программа TXD WORK SHOP. Заходим в папку с игрой, находим папку TXD и видим там это:
как вы успели заметить у нас там лежат файлы по такому формату: LD_. вот это и есть название номер один, а теперь открываем файл, и видим там:
как вы видите я выбрал файл LD_BEAT: и теперь ищем нужную нам «Картинку» и вписываем в игре вместо LD_POOL:Ball например:
LD_BEAT:up, и у нас получится уже вот это:
Вот так вы сможете вставлять различные картинки. А теперь поговорим о «картинках» которые вы не найдете в папке TXD.
для этого вам понадобится такой код: ld_otb2:butnc
для создание сплошных полос, или например если вам нужно будет «закрасить» весь ваш экран для чего либо используйте это.
А теперь пойведу речь о «Картинках» тоесть например изображаем текстдрав машины на спидометре.
Для этого делаем следующее: Create new textdraw > CHANGE FONT > FONT 5 > EDIT BOX > BOX ON > BOX SIZE. А после
в главном меню редактирования текстдрава жмем Textdraw previev model options.. Извините уже без скриншотов так как уже слишком много кинул.
Спасибо всем! Надеюсь у вас все получится.
Вот пример того какие вы сможете делать меню персонажа для сервера (это я накидал в этом редакторе за 20 минут где то)
автор скрипта: Zamarohit
ВСЕМ СПАСИБО! ЕСЛИ НЕ ЖАЛКО СПАСИБО НАЖМИ)
Сборник полезных советов по написанию кода.
Решил объединить полезные советы по написанию кода из разных тем и других порталов.
На оптимизацию они сильно не влияют, но упрощают написание ваших скриптов.
Тема создана, в основном, для начинающих, или более-менее шарящих юзеров.
1. Пропуск необязательных параметров(аргументов функции).
Автор первичной публикации: Tracker1
В Pawn есть возможность создания функций с необязательными параметрами, у которых уже есть значения, задаваемые по умолчанию.
Подробнее про такие функции: http://forum.sa-mp.c. ad.php?t=321465
Итак, существуют 2 способа пропустить параметры:
Если параметр(ы) последний(ие) то просто можем их не указывать. Это самый простой способ пропуска.
Например, нам нужно узнать только время (в часах), в момент, когда мы запустили мод. Для этого мы будем использовать функцию gettime.
В большинстве модов это обычно выглядит вот так:
Две переменные создаются просто «удовлетворить» функцию.
Вместо этого можно создать одну переменную, и не заполнять память впустую.
А что если нам нужно узнать только секунды, или минуты? Первые параметры так просто не пропустишь.
Тогда вместо параметра, который нужно пропустить, просто указываем символ подчёркивания ‘_’.
Пример:
2. Строковые разделители.
Авторы первичной публикации: Tracker1, ^_^
Форматируя сроку, можно указывать не только ширину поля, которое будет дополняться пробелами, но и нулями, добавляя между % и числом, указывающее размер поля, 0.
Вместо этого можно сделать так:
// Между «%» и «d» мы добавили «02», чтобы минуты отображались в
// двухсимвольном формате с пустыми ячейками поля, заменяющимися на нули.
*При форматировании строк можно указывать максимальную длину поля между символом % и спецификатором (%).
Важно: символ @ входит в состав названия функции (VVWVV).
4. Оператор char.
Автор первичной публикации: Darge
Отредактировал и дополнил: SooBad
При использовании оператора char мы устанавливаем границы каждой ячейки массива: от 0 и до 255.
В сумме каждая ячейка может принимать 256 значений.
Для примера давайте создадим обычный массив:
Тут мы используем 1000*4 байт (1 ячейка = 4 байта), то есть 4000 байт.
Пояснение:
если заглянуть в a_samp.inc, то можно увидеть, что по стандарту максимальное значение константы MAX_PLAYERS равно 1000 (с выходом сампа 0.3.7)
Теперь давайте создадим массив с оператором char:
Вот она наша оптимизация. Здесь мы используем 1000/4*4 байт, то есть 1000 байт. Неплохо, да?
Пояснение:
Каждая ячейка равна 4 байтам. Оператор char лишь запаковывает округленный вверх результат от деления числа, стоящего перед ним, на 4.
Чтобы обратиться к массиву, объявленного с char, мы должны использовать фигурные скобки, заместо квадратных.
Во всем остальном, char-массив такой же, как и обычный массив и использование его аналогичное.
// обратимся к конкретному игроку с ID 123
Помните, что char-массивы можно использовать далеко не всегда, нужно придерживаться определенных правил.
1. Ни в коем случае нельзя упаковывать первый суб-массив, код будет работать неправильно:
2. Ни в коем случае нельзя присваивать ячейкам массива, объявленного с помощью char, значение, превышающее 255 (в д.случае константа INVALID_PLAYER_ID = 65565).
Мы объявляем массив, в котором будут записаны буквы в различных регистрах, цифры и символы.
Вот как это выглядит наглядно (что мы подразумеваем)
5. Упакованные строки.
Автор статьи: Daniel_Cortez
Тем не менее, в Pawn есть возможность избежать подобной растраты. Строки можно хранить в упакованном формате, в котором для каждого символа отводится не целая ячейка (4 байта), а лишь 1 байт. В таком формате строки занимают примерно в 4 раза меньше памяти, чем неупакованные строки.
Чтобы строка стала упакованной, нужно всего лишь поставить перед ней восклицательный знак.
Также можно делать массивы из упакованных строк (т.е. двумерные массивы):
Знак «!» не является оператором, это всего лишь часть синтаксиса объявления упакованных строк, он работает только со строками, объявленными в кавычках.
Если вы хотите упаковать строку, которая уже объявлена в виде массива, то с помощью знака «!» у вас ничего не получится.
Для работы с упакованными строками есть специальные функции:
// Упаковывает строку source в массив dest с размером maxlength
// Распаковывает строку source в массив dest
Следует заметить, что другие функции из string.inc умеют работать с упакованными строками.
Рассмотрим эту особенность на примере strcat:
Если строка dest упакована, а source нет, то функция будет копировать символы из source и «на лету» упаковывать их перед записью в dest.
Примерно то же самое произойдёт, если с помощью strcat добавить упакованную строку к неупакованной.
// Сцепляем две строки.
// Будет выведено «string1string2».
Кроме функций из string.inc многие функции SA-MP также «понимают» упакованные строки.
Если строка, которую вы хотите упаковать, используется в одной из перечисленных выше функций, её следует оставить неупакованной.
6. Тернарный оператор.
Автор статьи: Untonyst(на английском)
Автор перевода и корректировок: SooBad
В этом уроке я хотел бы рассказать про тернарный оператор.
Также возможно использовать тернарный оператор со строками:
Исправлено в компиляторе от Zeex.
Где он применяется?
Тернарный оператор следует использовать, если условие имеет два операнда: если/иначе.
. или использование при отправке сообщения:
Можно использовать данный оператор в тернарной операции(конструкции):
7. Полезные советы от Nexius (про тернарный оператор, оператор return и конвертации лог.переменных).
Полезное применение можно найти и тернарному оператору, например:
Пример тернарного оператора внутри условия:
Ну и ещё пример в параметрах функции:
Также очень удобно менять значения bool переменным без ветвлений:
Также добавив два логических отрицания «!» можно легко конвертировать значения целых переменных в bool, например:
А вместо «обнуления» (под ним может пониматься и присвоение каких-то других первоначальных одинаковых чисел всему массиву, например 65535) значений большого массива при запуске мода можно делать так:
//НО: для массива игроков обнуление лучше всё равно делать при коннекте, т.к. после перезахода игрока старые данные таким образом не перезапишутся, т.к. создание массива у вас скорее всего идёт только при запуске мода
Иногда удобно возвращать сразу выполнение какого-то действия (особенно если оно стоит только одно), чем писать отдельно выполнение этого действия и прерывание функции (return) на следующей строке. Пример:
вернёт то значение, которое вернёт и SendClientMessage. Имейте это в виду, используя другие функции при возврате в событиях, результат выполнения которых зависит от этого возвращаемого значения!
Также можно использовать такую конструкцию:
независимо от того, что вернёт SendClientMessage, т.к. 1 стоит последним (и соответственно вернёт в итоге последнее)
Это немного уже не по теме, хотя возможно тоже пригодится
Когда люди делают внутренние проверки в своих функциях (к примеру на валидность переданных ей аргументов), часто вижу такое:
Функция GivePlayerMoney также возвращает значения, имея уже встроенную проверку аргументов (ну вообще только playerid’а, но всё-же). 1 она вернёт, если игрок подключён и 0, если нет. Соответственно от IsPlayerConnected можно избавиться:
Аналогично можно опускать IsPlayerConnected и в циклах, но только если к игрокам применяются какие-то функции с уже имеющимися в них проверками и больше ничего помимо них не стоит. Но это наверное скорее совет по небольшому увеличению производительности.
8. Символ #, как замена кавычкам » «.
Автор первичной публикации: SooBad
Многие об этом не знали, ибо это не столь существенно, но иногда, всё же, может пригодиться.
Символ # можно использовать как альтернативу для кавычек » «
Пример:
//Нужно вывести сообщение, с использованием кавычек
Такое использование выдаст нам ошибку.
Однако, желательно не злоупотреблять этим, и не делать так:
Также можно использовать вот в таком случае, но не рекомендуется, ввиду плохой читабельности:
Нельзя использовать в функциях, у которых все аргументы являются обязательными:
10. Сокращение значений с плавающей точкой.
Авторы первичной публикации: Romzes, SooBad
При использовании Float-тега в форматировании, можно указать количество символов после запятой.
11. Использование знака «_» в записи чисел.
Автор первичной публикации: VVWVV
Дополнил: SooBad
Для прибавки читабельности вашему коду следует поразрядно разделять большие числа.
Например:
Notice: в Pawn 4.0 вместе символа «_» следует задействовать апостроф » ‘ »
Пример:
( c ) Копирование информации разрешено, но только с указанием всех авторов!
Опять же, потому что клиент (игрок) отсылает серверу данную информацию. И, опять же, это не обязательно клавиша «Y». Если ты зайдёшь в настройки управления персонажем, ты увидишь пункт «Положительный ответ». Именно это действие вызывает OnPlayerKeyStateChange со значением «65536» aka «KEY_YES». Ты можешь переназначить клавишу, например, на «L» или «N», а после зайти на сервер и удивиться тому, что твоё действие, которое раньше вызывалось на Y, теперь вызывается на ту кнопку, которую ты указал.
Вообще к чему эти споры, если тебе уже объяснили как всё работает?
Эмм, что работает? Если действие продолжило вызываться на Y, то ты либо не ту клавишу заменил, либо не сохранил изменения.
А если действие начало вызываться на G, то я о том тебе и говорил.
Думаю, если хотя бы официальную wiki почитать, то можно найти подтверждение тех слов, что тебе тут пишут:
1) Это не Pawn не позволяет, а реализация SA-MP. Как уже выше неоднократно писалось, достаточно сделать так, чтоб клиент начал отсылать информацию о нажатых клавишах и всё станет возможно. А заставить клиент отсылать информацию можно двумя способами: переписать SA-MP, добавив отправку данных о нажатых клавишах или же сделать свой клиентский плагин, который будет отсылать нужную информацию. И если первое практически невозможно, то второе вполне реально. В любом случае придётся заставить игрока качать твои разработки, чтоб всё работало.
2) Всё это можно было понять ещё по первому сообщению, а не спорить и пытаться сделать самому 🙂 Впрочем, не суть уже.
1) Это не Pawn не позволяет, а реализация SA-MP. Как уже выше неоднократно писалось, достаточно сделать так, чтоб клиент начал отсылать информацию о нажатых клавишах и всё станет возможно. А заставить клиент отсылать информацию можно двумя способами: переписать SA-MP, добавив отправку данных о нажатых клавишах или же сделать свой клиентский плагин, который будет отсылать нужную информацию. И если первое практически невозможно, то второе вполне реально. В любом случае придётся заставить игрока качать твои разработки, чтоб всё работало.
2) Всё это можно было понять ещё по первому сообщению, а не спорить и пытаться сделать самому 🙂 Впрочем, не суть уже.
Зачем нужны эти символы?
https://yapx.ru/v/FNRjN // Извините за постороннюю ссыль, но это чисто хостинг картинок.
Зачем нужны эти символы?
https://yapx.ru/v/FNRjN // Извините за постороннюю ссыль, но это чисто хостинг картинок.
Затем, что в текстдравах своя таблица символов (как в кодировках, по типу ASCII). И тут просто перечислено то, какое число какому символу соответствует.
К слову, в разных русификаторах таблицы символов отличаются (символы хранятся не в одинаковом порядке, грубо говоря). Поэтому у части игроков твой текст в текстдравах будет искажён, так как, допустим, в твоём русификаторе под номером 112 хранится символ «Z», а у этого игрока в русификаторе под таким номером хранится номер «G».
Тебе стоит понять, что у любого мультиплеера есть клиентская и серверная стороны.
функция
В теме 4 сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Войти
Уже есть аккаунт? Войти в систему.
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу
Похожий контент
Введение.
К сожалению, у многих пользователей, работающих с языком pawn, возникают вопросы, связанные с подсчетом размера строки. Вероятно, их просто отпугивает ошеломляющий вид конечной строки (которую мы получим на выходе). Хотя на самом деле здесь нет ничего сложного. Данная тема обретает актуальность, потому что все большее количество разработчиков пользуются данным методом. Ну, что ж, попробуем разобраться.
А действительно ли оно того стоит?
Было время, когда я и сам использовал таковой метод. Однако со временем я решил воздержаться от него. Почему? Казалось бы, все удобно и чудесненько. Но меня напрягает в таком случае мой же код: появляется некий мусор, который только мешает мне обрабатывать код. Давайте взглянем на два примера. В одном из них я использую метод, о котором пойдет речь. В другом же я воздерживаюсь от него и делаю это альтернативно (узнаем дальше).
Автор статьи: @odosenok.
Еще один примерчик, для самостоятельного разбора. Ничего в нем особенного нет. Впрочем, можете оставлять в теме свои строки, разберемся, с чем есть строки ваши.
Для примера объявим число Пи:
const Float:M_PI = 3.141593;
Теперь объявим целочисленную константу (как и в new, для целых чисел указание типа не потребуется):
const MAX_BYTE = 255;
Внимание! В отличие от переменных (new), в константах нужно обязательно указывать значение.
Правила задания имён у констант те же, что и у переменных, за исключением одного необязательного:
Имя константы должно записываться в верхнем регистре (все буквы большие), чтобы было легче отличить его от имён переменных и функций. Примеры имён констант: MAX_PLAYERS, MAX_VEHICLES, MAX_PLAYER_NAME.