Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Форматирование и показ сообщений

Статус
В этой теме нельзя размещать новые ответы.

Volchenok

Ученик
Одной из самых распространённых задач в программировании является вывод данных для пользователей в текстовом виде. При этом вместе с текстом приходится выводить значения каких-либо переменных.
Для подобных задач можно использовать функцию printf, однако в SA:MP от неё не будет никакого толку: printf выводит текст только в консоль сервера, пользователи (т.е. игроки) этот текст не увидят.

Для вставки в текст значений переменных (форматирования) в SA:MP есть функция format:
PHP:
format(<строковая переменная>, <размер>, <форматная строка>, <список>)
  1. <строковая переменная> - переменная, в которую будет записан отформатированный текст
  2. <размер> - размер строковой переменный (нужен функции, чтобы предотвратить случайный выход за пределы строковой переменной), желательно указывать в виде sizeof(<строковая переменная>)
  3. <форматная строка> - строка для вставки значений переменных
  4. <список> - значения, которые нужно вставить в форматный текст

Принцип работы функции format схож с принципом работы printf (см. урок " "), однако format не выводит отформатированный текст в консоль, а сохраняет его в строковой переменной.

С форматированием разобрались, но как показывать отформатированный текст игрокам?
Для показа сообщений игрокам разработчики SA:MP сделали функции SendClientMessage и SendClientMessageToAll.

PHP:
// отправка сообщения указанному игроку
SendClientMessage(<id игрока>, <цвет>, <строка>)

// отправка сообщения всем игрокам
SendClientMessageToAll(<цвет>, <строка>)
  • <id игрока> - номер игрока, которому требуется показать сообщение

  • <цвет> - число (обычно в шестнадцатеричном представлении), в котором закодирован цвет текста сообщения
  • <строка> - текст сообщения, который будет показан игроку


Чаще всего цвет записывают в форме
PHP:
0xAARRGGBB
  • A (alpha) - степень прозрачности (от 0 до FF, чем меньше - тем прозрачнее)
  • R (red) - оттенок красного (от 0 до FF)
  • G (green) - оттенок зелёного
  • B (blue) - оттенок синего

Для удобного выбора цвета можно использовать инструмент "Подбор цвета" в программе SimplePawn.


Теперь перейдём к практике.
Сделаем простую команду /stats, в которой выведем игроку его ID, имя и кол-во игровых очков:
PHP:
CMD:stats(playerid, params[])
{
    // строковая переменная для хранения имени игрока, длиной в
    // MAX_PLAYER_NAME (константа из a_samp.inc, обозначающая макс.
    // длину имени игрока) + 1 ячейка под завершающий нуль-символ
    new playername[MAX_PLAYER_NAME+1];

    // получаем кол-во игровых очков с помощью функции GetPlayerScore
    new score = GetPlayerScore(playerid);

    // строка для форматирования сообщения
    new string[128];

    // получить имя игрока
    GetPlayerName(playerid, playername, sizeof(playername));

    // форматирование текста сообщения
    format( string, sizeof(string), "ID: %d, имя: %s, очки: %d",
            playerid, playername, score);

    // вывод сообщения игроку
    SendClientMessage(playerid, 0xFFFFFFFF, string);

    // завершение работы команды
    return 1;
}
Разберём некоторые детали:
  • Количество игровых очков мы узнаём с помощью функции GetPlayerScore, которая имеет следующий синтаксис:
PHP:
GetPlayerScore(<id игрока>)
  • Имя игрока получаем с помощью функции GetPlayerName:
PHP:
GetPlayerName(<id игрока>, <строковая переменная>, <размер>)
  • Число 0xFFFFFFFF означает белый цвет (alpha=255 (FF), R=255, G=255, B=255).

Теперь посмотрим на вышеприведённый код ещё раз, многие вещи можно упростить:
  1. Вместо playername можно получать имя игрока в строковую переменную string, после чего строка может участвовать в форматировании (format) самой себя.
  2. Использовать переменную score необязательно, вместо этого можно подставить вызов функции GetPlayerScore напрямую в format.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу