PDA

Просмотр полной версии : [Мануал] Подробное знакомство с диалогами



ADE
10.12.2014, 21:48
ShowPlayerDialog




Данная функция была добавлена в SA-MP 0.3a и не будет работать в более ранних версиях!

Описание:
Показывает диалоговое окно определенному игроку.
Параметры:

(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, структура функции такая:

ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая кнопка>);

Упрощение:
Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, я заменяю их такими макросами:


#define LIST DIALOG_STYLE_LIST

#define PASSWORD DIALOG_STYLE_PASSWORD

#define MSGBOX DIALOG_STYLE_MSGBOX

#define INPUT DIALOG_STYLE_INPUT
Или можно использовать <ID> стиля диалогового окна

Для написания основного текста диалогового окна вы можете использовать нижеприведенную таблицу:


\b
backspaсe


\f
Form feed


\n
Переход на новую строку


\r
Возврат каретки


\t
Табуляция


\v
Вертикальная табуляция


\'
Одиночная кавычка


\"
Двойные кавычки


\?
Вопросительный знак



Пример диалогов:

//пример для 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 пунктов. А нам надо сделать так, чтобы при нажатии на первый пункт, у нас появлялся другой диалог с другой информацией. Для этот мы будем использовать вот такой код:


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) // Девятый пункт
{
}
}
}

Условные конструкции:
Вот примет одной конструкции


if(response) //Условие: если мы нажали первую кнопку
{
}
else //Условие: если мы нажали вторую кнопку
{
}

Пример диалога с использование условной конструкцией

Создадим команду с использование ZCMD (командный процессор)


CMD:test(playerid, params[])
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");
}




if (strcmp("/test", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");
}


И в public OnDialogResponse мы добавим ответ на наш диалог


case 1:
{
if(response) //Условие: если мы нажали первую кнопку
{
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали первую кнопку");
}
else //Условие: если мы нажали вторую кнопку
{
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали вторую кнопку");
}
}


Креативизация:
Вы решили создать диалог, а он серы и скучный?
Мы можем раскрасить наш диалог в любые цвета формата RGB.
Пример:

ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"{FFFFFF}Уведомление","{3DB6F2}Выберите кнопку","Первая","Вторая");
Цвет мы заключаем в фигурную скобку "{" и "}"
FFFFFF - это белый цвет
3DB6F2 - светло-голубой
Думаю цвета вам не доставит большого труда отыскать. Для этого есть множество поисковых система.

Версия: 1.2


Лучше использовать switch для перебора диалогов.

Что же такое этот оператор switch?
Оператор switch – это оператор выбора. Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной.
Пример построения с этим оператором:


switch(reason)
{
case 0: // Первый пункт
{
// Тут у Вас что то будет
}
case 1: // Второй пункт
{
// Тут у Вас что то будет
}
case 2: // Третий пункт
{
// Тут у Вас что то будет
}
}

! Стоить отметить, что в официальной документации к языку написано: ‘In pawn, switch is a structured “if”‘, а это значит, что конструкция switch — это набор структурированных if’ов, отсюда следует, что switch не может работать быстрее if. Но это не всегда так.


Примеры by ZiGGi

Следующая конструкция:


switch(var)
{
case 40,80,150,160,230,420: return 1;
}

быстрее, чем

if ( var == 40 || var == 80 || var == 150 || var == 160 || var == 230 || var == 420 ) return 1;
Следующая конструкция:


switch(var)
{
case 40..80,150..160,230..420: return 1;
}

медленнее чем

if ( var >= 40 && var <= 80 || var >= 150 && var <= 160 || var >= 230 && var <= 420 ) return 1;
Следующая конструкция:

switch(var)
{
case 40: return 1;
}
одинакова как и

if ( var == 40 ) return 1;
Следующая конструкция:

switch(var)
{
case 40..50: return 1;
}
быстрее чем

if ( var >= 40 && var <= 50 ) return 1;
Как видим — switch/case медленнее(значительно) if только на больших промежутках значений.



Версия: 1.3

Сейчас бы я хотел немного рассказать вам о том, как можно в один диалог использовать гораздо большее количество символов.

Данный метод подходит, когда есть некоторые переменные, которые нужно внедрить в текст.


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".


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 модах. Мне же не очень нравится этот метод.Причины: не очень читабельный для человека, в отличии от первого примера.


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




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, "Понятно", "Закрыть");