Подробное знакомство с диалогами
Данная функция была добавлена в SA-MP 0.3a и не будет работать в более ранних версиях!
Описание:
Показывает диалоговое окно определенному игроку.
Параметры:
PHP код:
(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая кнопка>)
Разбор кода:
playerid |
ID игрока, которому будет показан диалог. |
<ID диалога> |
Уникальный ID диалога. |
<ID стиля> |
Стиль диалогового окна. |
<Название> |
Заголовок окна. |
<Текст> |
Текст самого диалога. |
<Первая кнопка> |
Название первой (левой) кнопки диалога. |
<Вторая кнопка> |
Название второй (правой) кнопки. |
Возвращаемые значения:
Данная функция не возвращает какого-либо конкретного значения.
Стили диалога:
0 |
DIALOG_STYLE_MSGBOX |
Обычный диалог с 2-мя кнопками |
1 |
DIALOG_STYLE_INPUT |
Диалог с полем для ввода |
2 |
DIALOG_STYLE_LIST |
Список из нескольких элементов |
3 |
DIALOG_STYLE_PASSWORD |
Позволяет игрокам вводить пароль не раскрывая его |
Функция:
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:
PHP код:
ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая кнопка>);
Упрощение:
Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, я заменяю их такими макросами:
PHP код:
#define LIST DIALOG_STYLE_LIST
PHP код:
#define PASSWORD DIALOG_STYLE_PASSWORD
PHP код:
#define MSGBOX DIALOG_STYLE_MSGBOX
PHP код:
#define INPUT DIALOG_STYLE_INPUT
Или можно использовать <ID> стиля диалогового окна
Для написания основного текста диалогового окна вы можете использовать нижеприведенную таблицу:
\b |
backspaсe |
\f |
Form feed |
\n |
Переход на новую строку |
\r |
Возврат каретки |
\t |
Табуляция |
\v |
Вертикальная табуляция |
\' |
Одиночная кавычка |
\" |
Двойные кавычки |
\? |
Вопросительный знак |
Пример диалогов:
PHP код:
//пример для DIALOG_STYLE_MSGBOX
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Вы вошли на сервер","Закрыть","");
//пример для DIALOG_STYLE_INPUT
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Авторизация","Введите свой пароль:","Войти","Отмена");
//пример для DIALOG_STYLE_LIST
ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,"Мой диалог","1. Строка\r\n2. Строка\r\n3. Строка","Опция 1", "Опция 2");
//пример для DIALOG_STYLE_PASSWORD
ShowPlayerDialog(playerid,1,DIALOG_STYLE_PASSWORD,"Авторизация","Введите ваш пароль ниже:","Готово","Отмена");
Ответ на диалог:
Мы сделали диалоговое меню, состоящее из 9 пунктов. А нам надо сделать так, чтобы при нажатии на первый пункт, у нас появлялся другой диалог с другой информацией. Для этот мы будем использовать вот такой код:
PHP код:
case <ID диалога>:
{
if(response)
{
if(listitem == 0) // Первый пункт
{
}
else if(listitem == 1) // Второй пункт
{
}
else if(listitem == 2) // Третий пункт
{
}
else if(listitem == 3) // Четвертый пункт
{
}
else if(listitem == 4) // Пятый пункт
{
}
else if(listitem == 5) // Шестой пункт
{
}
else if(listitem == 6) // Седьмой пункт
{
}
else if(listitem == 7) // Восьмой пункт
{
}
else if(listitem == 8) // Девятый пункт
{
}
}
}
Условные конструкции:
Вот примет одной конструкции
PHP код:
if(response) //Условие: если мы нажали первую кнопку
{
}
else //Условие: если мы нажали вторую кнопку
{
}
Пример диалога с использование условной конструкцией
Создадим команду с использование ZCMD (командный процессор)
PHP код:
CMD:test(playerid, params[])
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");
}
Пример команды на стандартном командном процессере
PHP код:
if (strcmp("/test", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");
}
И в public OnDialogResponse мы добавим ответ на наш диалог
PHP код:
case 1:
{
if(response) //Условие: если мы нажали первую кнопку
{
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали первую кнопку");
}
else //Условие: если мы нажали вторую кнопку
{
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали вторую кнопку");
}
}
Креативизация:
Вы решили создать диалог, а он серы и скучный?
Мы можем раскрасить наш диалог в любые цвета формата RGB.
Пример:
PHP код:
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"{FFFFFF}Уведомление","{3DB6F2}Выберите кнопку","Первая","Вторая");
Цвет мы заключаем в фигурную скобку "{" и "}"
FFFFFF - это белый цвет
3DB6F2 - светло-голубой
Думаю цвета вам не доставит большого труда отыскать. Для этого есть множество поисковых система.
Версия: 1.2
Цитата:
Лучше использовать switch для перебора диалогов.
Что же такое этот оператор switch?
Оператор switch – это оператор выбора. Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной.
Пример построения с этим оператором:
PHP код:
switch(reason)
{
case 0: // Первый пункт
{
// Тут у Вас что то будет
}
case 1: // Второй пункт
{
// Тут у Вас что то будет
}
case 2: // Третий пункт
{
// Тут у Вас что то будет
}
}
! Стоить отметить, что в официальной документации к языку написано: ‘In pawn, switch is a structured “if”‘, а это значит, что конструкция switch — это набор структурированных if’ов, отсюда следует, что switch не может работать быстрее if. Но это не всегда так.
Тесты
Примеры by ZiGGi
Опен меня
Следующая конструкция:
PHP код:
switch(var)
{
case 40,80,150,160,230,420: return 1;
}
быстрее, чем
PHP код:
if ( var == 40 || var == 80 || var == 150 || var == 160 || var == 230 || var == 420 ) return 1;
Следующая конструкция:
PHP код:
switch(var)
{
case 40..80,150..160,230..420: return 1;
}
медленнее чем
PHP код:
if ( var >= 40 && var <= 80 || var >= 150 && var <= 160 || var >= 230 && var <= 420 ) return 1;
Следующая конструкция:
PHP код:
switch(var)
{
case 40: return 1;
}
одинакова как и
PHP код:
if ( var == 40 ) return 1;
Следующая конструкция:
PHP код:
switch(var)
{
case 40..50: return 1;
}
быстрее чем
PHP код:
if ( var >= 40 && var <= 50 ) return 1;
Как видим — switch/case медленнее(значительно) if только на больших промежутках значений.
Версия: 1.3
Сейчас бы я хотел немного рассказать вам о том, как можно в один диалог использовать гораздо большее количество символов.
Данный метод подходит, когда есть некоторые переменные, которые нужно внедрить в текст.
PHP код:
new string[кол-во символов];
format(string, sizeof(string), "1 строка");
format(string, sizeof(string), "\n2 строка ",string);
format(string, sizeof(string), "\n3 строка",string);
format(string, sizeof(string), "\n4 строка",string);
format(string, sizeof(string), "\n5строка",string);
ShowPlayerDialog(playerid, НОМЕР_ДИАЛОГА, СТИЛЬ_ДИАЛОГОВОГО_ОКНА, "ЗАГОЛОВОК", string, "КНОПКА1", "КНОПКА2");
Пример использования
Строки - это места для хранения символов (букв и/или символов). Строки должны быть помещены в массив, так что каждая ячейка может содержать букву, вы должны указать экстра-ячейку для идентификатора строки - "0".
Пример со статистикой:
PHP код:
new string[128];
format(string, sizeof(string), "Ваше имя: %s",pInfo[playerid][pName]);
format(string, sizeof(string), "\nИгровой уровень: %d",string,pInfo[playerid][pLevel]);
format(string, sizeof(string), "\nДата регистрации: %d ",string,pInfo[playerid][pDataReg]);
format(string, sizeof(string), "\nКоличество убийств: %d и смертей: %d",string,pInfo[playerid][pKills],pInfo[playerid][pDeaths]);
ShowPlayerDialog(playerid, 228, DIALOG_STYLE_MSGBOX, "Статистика", string, "Понятно", "");
Есть еще один метод, который более менее мне известный - это константная переменная. Этот пример часто встречается в RLS/SRL модах. Мне же не очень нравится этот метод.Причины: не очень читабельный для человека, в отличии от первого примера.
PHP код:
static const _n[5][] =
{
"1 строка\n",
"2 строка\n",
"3 строка\n",
"4 строка\n",
"5 строка"
}
format(string, sizeof(string),"%s%s%s%s%s%s", _n[0],_n[1],_n[2],_n[3],_n[5]);
ShowPlayerDialog(playerid, НОМЕР_ДИАЛОГА, СТИЛЬ_ДИАЛОГОВОГО_ОКНА, "ЗАГОЛОВОК", string, "КНОПКА1", "КНОПКА2");
Пример использования
PHP код:
static const _n[11][] =
{
"Lorem Ipsum - это текст-рыба, часто используемый в печати и\n",
"вэб-дизайне. Lorem Ipsum является стандартной рыбой для\n",
"текстов на латинице с начала XVI века. В то время некий \n",
"безымянный печатник создал большую коллекцию размеров и\n",
"форм шрифтов, используя Lorem Ipsum для распечатки образцов.\n"
"Lorem Ipsum не только успешно пережил без заметных изменений\n"
"пять веков, но и перешагнул в электронный дизайн. Его\n"
"популяризации в новое время послужили публикация листов\n"
"Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее\n"
"время, программы электронной вёрстки типа Aldus PageMaker, в\n"
"шаблонах которых используется Lorem Ipsum."
}
format(string, sizeof(string),"%s%s%s%s%s%s", _n[0],_n[1],_n[2],_n[3],_n[5],_n[6],_n[7],_n[8],_n[9],_n[10]);
ShowPlayerDialog(playerid, 1337, DIALOG_STYLE_MSGBOX, "Lorem Ipsum", string, "Понятно", "Закрыть");