- Регистрация
- 27 Мар 2011
- Сообщения
- 1,324
- Лучшие ответы
- 0
- Репутация
- 156
В дальнейших уроках мы рассмотрим все типы диалогов и работу с ними. Для начала я
ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому
типу диалога. Итак, приступим к теории. Диалоги бывают трех типов:
0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками,
1 - DIALOG_STYLE_INPUT - диалог с полем для ввода,
2 - DIALOG_STYLE_LIST - список из нескольких элементов.
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:
Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, я
заменяю их такими константами:
Для написания основного текста диалогового окна вы можете использовать:
\b backspaсe
\f Form feed
\n переход на новую строку
\r возврат каретки
\' одиночная кавычка
\" двойные кавычки
\? вопросительный знак
Итак, переходим к практике или к разбору первого стиля: DIALOG_STYLE_MSGBOX.
Рассмотрим обычный пример: Мы вводим команду, и появляется диалоговое окно с запросом о
подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в
автовызываемую функцию OnPlayerCommandText.
Затем с помощью функции ShowPlayerDialog мы вызовем данное диалоговое окно. Так как
вызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже
внутри нее.
Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID. После
идентификатора пишем название стиля диалога, но я заменил его константой, поэтому я написал
DSM (DIALOG_STYLE_MSGBOX). После стиля пишем название диалога. Далее пишем текст диалога и
название первой и второй кнопки.
В общем, код будет выглядеть следующим образом:
Но данное диалоговое окно работать не будет, если мы не напишем для него функцию.
Допустим, наша команда выдаст в чат всю информацию об игроке, т.е при нажатии кнопки «Да»
все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том что
данная команда не была выполнена.
Писать функцию диалогового окна мы будем в автовызываемой функции
OnDialogResponse. Сначала внутри функции мы напишем условную конструкцию, которая будет
проверять, что данное диалоговое окно было вызвано. Код условия такой:
Условие проверяет: было ли вызвано диалоговое окно с ID = 0. Внутрь этой условной
конструкции добавляем еще одно условие:
Условие проверяет, была ли нажата первая кнопка, если нажата вторая кнопка, то
выполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем
следующий код.
Сначала мы создаем все необходимые переменные, а потом получаем данные и сразу же их
записываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках
она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег
игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение,
которое и будет значением этой переменной.
Еще обратите внимание на %.2f, я мог бы использовать просто %f, как показано в таблице.
Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше
мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите
внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет
отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой
уже есть готовое отформатированное сообщение.
Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без
объяснений в else пишем:
Вот в принципе и все, В следующем уроке мы рассмотрим другой стиль диалога. Переходим
к следующему уроку.
Автор Cloud
ознакомлю вас со всеми диалогами, а затем в каждом уроке мы будем рассматривать по каждому
типу диалога. Итак, приступим к теории. Диалоги бывают трех типов:
0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками,
1 - DIALOG_STYLE_INPUT - диалог с полем для ввода,
2 - DIALOG_STYLE_LIST - список из нескольких элементов.
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:
Код:
ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая>);
заменяю их такими константами:
Код:
#define DSL DIALOG_STYLE_LIST
#define DSI DIALOG_STYLE_INPUT
#define DSM DIALOG_STYLE_MSGBOX
\b backspaсe
\f Form feed
\n переход на новую строку
\r возврат каретки
\' одиночная кавычка
\" двойные кавычки
\? вопросительный знак
Итак, переходим к практике или к разбору первого стиля: DIALOG_STYLE_MSGBOX.
Рассмотрим обычный пример: Мы вводим команду, и появляется диалоговое окно с запросом о
подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в
автовызываемую функцию OnPlayerCommandText.
Код:
if (strcmp("/test", cmdtext, true, 10) == 0)
{
return 1;
}
вызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже
внутри нее.
Код:
ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");
идентификатора пишем название стиля диалога, но я заменил его константой, поэтому я написал
DSM (DIALOG_STYLE_MSGBOX). После стиля пишем название диалога. Далее пишем текст диалога и
название первой и второй кнопки.
В общем, код будет выглядеть следующим образом:
Код:
if (strcmp("/test", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");
return 1;
}
Допустим, наша команда выдаст в чат всю информацию об игроке, т.е при нажатии кнопки «Да»
все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том что
данная команда не была выполнена.
Писать функцию диалогового окна мы будем в автовызываемой функции
OnDialogResponse. Сначала внутри функции мы напишем условную конструкцию, которая будет
проверять, что данное диалоговое окно было вызвано. Код условия такой:
Код:
if(dialogid == 0)
{
}
конструкции добавляем еще одно условие:
Код:
if(response)
{
}else{
}
выполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем
следующий код.
Код:
if(response)
{
new string[128]; //Переменная с основным текстом диалога
new plname[MAX_PLAYER_NAME]; //Переменная с именем игрока
new money; //Переменные для хранения кол-ва наличных денег игрока
new Float: health, Float: armor; //Переменные для хранения кол-ва здоровья и брони игрока
GetPlayerName(playerid,plname,MAX_PLAYER_NAME); //Записываем имя игрока в переменную plname
money = GetPlayerMoney(playerid); //Записываем деньги игрока в переменную money и т.д.
GetPlayerHealth(playerid,health);
GetPlayerArmour(playerid,armor);
format(string,sizeof(string),”Игрок: %s(ID:%d). Деньги: %d $.\n Здоровье: %.2f\n Броня:
%.2f”,plname,playerid,money,health,armor);
ShowPlayerDialog(playerid,1,DSM,"Информация об игроке",string,"ОК","");
}else{
записываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках
она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег
игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение,
которое и будет значением этой переменной.
Еще обратите внимание на %.2f, я мог бы использовать просто %f, как показано в таблице.
Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше
мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите
внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет
отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой
уже есть готовое отформатированное сообщение.
Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без
объяснений в else пишем:
Код:
SendClientMessage(playerid,COLOR_RED,"Команда отменена");
к следующему уроку.
Автор Cloud