Перейти к содержанию
Авторизация  
#Kot

Типы диалогов и с чем их подавать

Рекомендуемые сообщения

#Kot

И так. Есть диалоги следующих видов:

DIALOG_STYLE_LIST
DIALOG_STYLE_INPUT
DIALOG_STYLE_MXGBOX
DIALOG_STYLE_PASSWORD
А теперь по подробнее.
DIALOG_STYLE_LIST - вид диалога для так сказать вывода списка нужных вам функций/команд и т.д.
Код диалога данного:
CMD:dialog(playerid)
{
        ShowPlayerDialog(playerid,555,DIALOG_STYLE_LIST,"Пример диалога","Содержимое списка 1\nСодержимое списка 2\nСодержимое списка 3","Кнопка 1","Кнопка 2");
        return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        if(dialogid == 555)
        {
            if(response)
            {
                    if(listitem == 0) return SendClientMessage(playerid,0x88AA88AA,"Вы нажали на кнопку 'Содержимое списка 1'");
                    if(listitem == 1) return SendClientMessage(playerid,0x88AA88AA,"Вы нажали на кнопку 'Содержимое списка 2'");
                    if(listitem == 2) return SendClientMessage(playerid,0x88AA88AA,"Вы нажали на кнопку 'Содержимое списка 3'");

                }
                else
                {
                    SendClientMessage(playerid,0x88AA88AA,"Вы нажали на 'Кнопка 2' либо Esc");
                    return 1;
                }
        }
        return 1;
}
754725_m.png

 

 

Ну нажмём к примеру первую кнопку из списка (а видя по коду мы видим, что при нажатии любой кнопки выводиться текст.)
Идём дальше.
DIALOG_STYLE_MSGBOX - данный тип диалога используется для красивого вывода информации (замена чата). Покрайне мере я так его использую))
Еще его можно использовать в регестрации к примеру выбор 1 из двух "Мужчина/женщина" и т.д.
Код нашего диалога:
CMD:dialog1(playerid)
{
        ShowPlayerDialog(playerid,556,DIALOG_STYLE_MSGBOX,"Пример диалога","Содержимое(текст)","Кнопка 1","Кнопка 2");
        return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        if(dialogid == 556)
        {
            if(response)
                {
                    SendClientMessage(playerid,0x88AA88AA,"Вы нажали на 'Кнопка 1' либо Enter");
                    return 1;
                }
                else
                {
                    SendClientMessage(playerid,0x88AA88AA,"Вы нажали на 'Кнопка 2' либо Esc");
                    return 1;
                }
        }
        return 1;
}

754727_m.png

 

Как мы видим там две кнопки. Для разъяснения: if(response) { содержимое(код) первой кнопки } else { содержимое(код) второй кнопки }
DIALOG_STYLE_INPUT либо DIALOG_STYLE_PASSWORD - И третий, последний вид диалогов -- это диалоги с функцией ввода данных в них и вывода их на экран(не обязательно в общем то :))
DIALOG_STYLE_INPUT и DIALOG_STYLE_PASSWORD ничем практически не отличается кроме того, что в DIALOG_STYLE_PASSWORD вводимое сразу же скрывается звёздочками на экране, а в DIALOG_STYLE_INPUT не скрывается. По этому далее у нас пойдёт разговор как об одном виде диалогов т.к. они можно сказать идентичны
Код нашего диалога:
CMD:dialog2(playerid)
{
        ShowPlayerDialog(playerid,557,DIALOG_STYLE_INPUT,"Пример диалога","Содержимое(текст)","Кнопка 1","Кнопка 2");
        return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
        if(dialogid == 557)
        {
            if(response)
            {
                new str[100]; format(str,sizeof(str),"Вы ввели: %s",inputtext);
                SendClientMessage(playerid,0x88AA88AA,str);
                return 1;
                }
                else
                {
                    SendClientMessage(playerid,0x88AA88AA,"Вы нажали на 'Кнопка 2' либо Esc");
                    return 1;
                }
        }
        return 1;
}

754729_m.png

 

Введем к примеру текст: "Текст введенный в окошко". И видим что в игре высвечивается текст который мы ввели
Наверное вы заметили такое, как inputext. Так вот при вводе текста(любого содержимого короче) в окошко DIALOG_STYLE_INPUT это всё записывается на переменную inputtext и выводиться (при вашем желании) в чат. Элементарно в принципе) 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[/hr]

Вопрос 1. Как сделать одну кнопку вместо двух?
Делаем так:
Вместо такого:
ShowPlayerDialog(playerid,557,DIALOG_STYLE_INPUT,"Пример диалога","Содержимое(текст)","Кнопка 1","Кнопка 2");

Ставим такое:

ShowPlayerDialog(playerid,557,DIALOG_STYLE_INPUT,"Пример диалога","Содержимое(текст)","Кнопка 1","");
Вопрос 2. Как вместо длинных DIALOG_STYLE_..... сделать использование цифр к примеру 0,1,2,3
А так и использовать. Вот в a_samp.inc
#define DIALOG_STYLE_MSGBOX  0
#define DIALOG_STYLE_INPUT  1
#define DIALOG_STYLE_LIST  2
#define DIALOG_STYLE_PASSWORD 3

Теперь можно использовать так:

ShowPlayerDialog(playerid,dialogid,2,"Название","1й пункт\n2й пункт","Ok","Cancel");
Вопрос 3. Можно ли использовать ID диалога несколько раз?
Да, можно с учётом того что на него не будет прописаны функции. Но всё-таки не желательно использование одного ID диалога много раз т.к. можно нагрузить сильно мод)
Вопрос 4. Можно ли удалить название диалога либо сменить его цвет?
Да можно. Удаление названия:
ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_LIST," ","1й пункт\n2й пункт","Ok","Cancel");

Сменить цвет названия:

ShowPlayerDialog(playerid,dialogid,DIALOG_STYLE_LIST,"{ffffff}Название белого цвета","1й пункт\n2й пункт","Ok","Cancel");
Вопрос 5. При вводе %s в DIALOG_STYLE_INPUT происходит крэш сервера, с чем это связано?
Связано это с тем, что это баг SA:MP. Желательно, а точнее нужно поставить замену % к примеру на #. Замену я постараюсь выложить в "Готовые Решения"
Вопрос 6. Как вместо цифр ида диалога (dialogid) использовать буквы?
Вставляете в начало мода такое:
#define iddialoga 100//ид диалога у нас будет к примеру 100

И можно использовать так:

ShowPlayerDialog(playerid,iddialoga,DIALOG_STYLE_LIST,"Название","1й пункт\n2й пункт","Ok","Cancel");
Вопрос 7. Какие есть дополнительные функции для работы с текстом (3D и в диалогах)
Список:
\n - new line - новая строка 
\b - backspace
\f - Form feed - перевод страницы 
\' - одиночная кавычка 
\" - двойные кавычки 
\? - вопросительный знак
\t - табуляция 
Я нашёл этот список в интернете, но я абсолютно не понимаю зачем такое: \' и \? Ведь можно поставить просто знаки без слэша)

 

Автор:sOflY

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
SHOROOP

Я терпимо отношусь к копипасте мануалов в принципе, но копипасту говноуроков не выношу.

 

DIALOG_STYLE_LIST - вид диалога для так сказать вывода списка нужных вам функций/команд и т.д.

Сказать "окно со списком из нескольких элементов", видимо, было нельзя.

DIALOG_STYLE_MSGBOX - данный тип диалога используется для красивого вывода информации (замена чата). Покрайне мере я так его использую))

Какая замена чата на месседж-боксах? И потом, никому не интересно, как ты его используешь, если новичку нужна конкретная инфа "как это работает". Объяснения "простое окно-предупреждение" хватило бы за глаза.

Как мы видим там две кнопки. Для разъяснения: if(response) { содержимое(код) первой кнопки } else { содержимое(код) второй кнопки }

Напомню, что в остальных видах диалоговых окон есть те же самые две кнопки, и по-хорошему, о них надо было рассказать еще ДО типов окон.

DIALOG_STYLE_INPUT либо DIALOG_STYLE_PASSWORD - И третий, последний вид диалогов -- это диалоги с функцией ввода данных в них и вывода их на экран(не обязательно в общем то :))

Так если не обязательно, на кой черт вообще об этом упоминать?Окна с полем для ввода пользовательских данных - вот и все объяснение.

Наверное вы заметили такое, как inputext. Так вот при вводе текста(любого содержимого короче) в окошко DIALOG_STYLE_INPUT это всё записывается на переменную inputtext и выводиться (при вашем желании) в чат. Элементарно в принципе)

Да что ты так к чату-то примотался. И, коли уж на то пошло, inputtext - не переменная, а массив.

 

Перейдем к вопросам.

Первый и часть четвертого вопроса ("как удалить название") можно было объяснить на порядок проще - оставить пустым параметр, задающий нужный элемент.

По третьему - вызов диалогов с одинаковым ID ничем по выделению ресурсов не отличается от вызова диалогов с разными ID. По факту, единственное, зачем диалогу нужен уникальный идентификатор - это для создания конкретных действий для каждого из диалогов при вызове OnDialogResponse. Если после вызова диалогового окна никаких действий вообще не планируется - никто не мешает присвоить всем таким диалогам один и тот же ID.

По пятому - это, пардон, не SA:MP косяк, а неумех-программистов, не умеющих фильтровать данные на входе. А сервер после таких приколов падает исключительно потому, что данные на входе никто не проверял. Достаточно простейшим циклом проверить символы в строке - впрочем, проще же сказать "эта сампа касяк, я ахриненый скриптир". То же самое к седьмому вопросу - если ты задаешь вопрос "зачем такое: \' и \? Ведь можно поставить просто знаки без слэша", значит, ты ничего не слышал про экранирование символов. А хорошо бы.

 

Резюмируя вышесказанное.

Обучающая часть - никакая, полезного контента - мизер, обработчик OnDialogResponse не описан вообще. "Вопросы" высосаны из пальца, ответы на них не менее ужасны.

Вывод - такой копипасте в туториалах не место.

  • Like 4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.