Как сделать свой диалог в фнф

Обновлено: 08.07.2024

Прошу советов и подсказок! Проблема такова: Решил скоротать свободное время, в бессоннице, и написать кодик, что бы было, типа "диалог". Например, задаётся вопрос, на него даются два варианта ответа "да" или "нет", далее переходит к другому вопросу, либо прерывает беседу. (Это в зависимости от ответа.) Ну так вот, что то голова не варит от недосыпа. У меня после первого ответа, выдаёт и следующий вопрос с результатом, данным в первом вопросе. Следовательно, надо разделить условия. (желательно что бы при выводе нового вопроса, пропадал предыдущий. находил, что то похожее в поиске, но увы, все попытки четны, и жаль потерянное время. ) Так же надо прописать, что бы в ответах "да" или "нет" автоматом выставлялось "-" перед ними, если даже, тот кто проходит тест, не ставил его сам. Делал как cin >>"-">> a; Но выдавало ошибку. возможно вина недосыпа, прошу прощения. Пока что буду пытаться сделать сам, всё равно спать не охото.. Пример кода бросил..Заранее спасибо за помощь.

Создание диалога из MDI
Здрасте.Решил учится по книжке Программирование на Visual C++ 6 автор Глушаков.Решил сделать пример.


Javafx создание диалога
Салют! Хочу создать диалог, при этом в него отдельная fxml, загружает css. В нете рекомендуют или.

Создание элементов и диалога
Помогите пожалуйста разобраться WindowsAPI я незнаю, в этом вся проблема , разрабатываю БД на.

Создание диалога в Windows Forms на C++
Вот пример кода private: void button1_Click(System::Object ^ sender, System::EventArgs ^.

Диалоговые Окна Виды/функции Оценка: 4 Голосов

Пользователь офлайн

Mike

Изображение

2) Диалог с полем, в которое можно ввести что-либо
Ид: 1
Название: DIALOG_STYLE_INPUT
Скриншот:
Код диалога:

Изображение

3) Диалог, со списком
Ид: 2
Название: DIALOG_STYLE_LIST
Скриншот:
Код диалога:

Изображение

4) Диалог, с полем ввода(используется для ввода пароля) он просто шифрует введеные символы точками
Внимание: диалог был добавлен в версию клиента samp 0.3d (я его не тестировал, поэтому и скрин с офф сайта)
Ид: 3
Название: DIALOG_STYLE_PASSWORD
Скриншот:
Код диалога:

Использование:
• Диалог 1 ( DIALOG_STYLE_MSGBOX )

• Диалог 2 ( DIALOG_STYLE_INPUT )

• Диалог 3 ( DIALOG_STYLE_LIST )

• Диалог 4 ( DIALOG_STYLE_PASSWORD )

Автор: Mike

Пользователь офлайн

Erick

Диалоги — это одно из самых проблемных мест в рукописях начинающих писателей.

Наиболее распространенный тип ошибок — избыточность: ненужная атрибуция, ненужные реплики, ненужные украшательства.

Затянутость

Непрерывный диалог не должен быть слишком длинным, иначе это замедляет динамику произведения. Разговор героев подразумевает реальное течение времени, тогда как в целом сюжет развивается намного быстрее. Если продолжительный диалог все же необходим, то его следует разбавлять — например, описанием действий, эмоций героя и т.п.

Бессодержательность

Не засоряйте диалог фразами, не несущими полезной информации.

Девушки попрощались:
— До свидания!
— Всего хорошего!
— Очень рада была вас видеть!
— Приходите к нам в гости!
— Непременно придем. В прошлый раз нам очень у вас понравилось.
— Ну, право же, не стоит. Ну что ж, прощайте!

Можно было бы ограничится одной фразой: Девушки попрощались.

Аналогичная проблема — повторы одной и той же мысли:

— Неужели так и сказала: уходи?
— Да, именно так.
— Я не могу поверить.
— Клянусь! Я тебе передал все слово в слово. Так и сказала: уходи.
— Я не верю. Ты, верно, что-то перепутал.

Исключения из этого правила, разумеется, могут быть, но все же следует помнить, что пустой диалог — это скучно, а скучное читатель пропускает.

Неестественность

Диалог должен звучать естественно. Не стоит употреблять в разговоре сложносочиненные предложения на пять строк или выражения, которые не используются в живой речи.

— Тебе нужно регулярно поливать ростки, потому что иначе им неоткуда будет взять влагу, столь необходимую для их питания и полноценного развития.

Так не говорят. Предложение лучше перефразировать:

— Не забывай поливать ростки, а то они засохнут.

Исключение из этого правила: герой нарочно пытается говорить по-книжному, и видно, что это не стилистическая ошибка, а авторская задумка.

Устаревшие выражения

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

— Тысяча чертей! — воскликнул офис-менеджер, выключая компьютер. — Ах, будь я проклят, если я не отомщу этим канальям!

Чтобы проверить диалог на естественность звучания, читайте его вслух. Лишние слова будут резать ухо.

Несоответствие диалога ситуации или характеру героев
В романах новичков сплошь и рядом встречаются сцены, в которых злодеи в пылу битвы беседуют с героями о Добре и Зле — длинными предложениями с деепричастными оборотами.

Если вы думаете, что это нормально, попробуйте в течение пяти минут колотить подушку и одновременно пересказывать сказку о Колобке.

Получилось нечто связное? Снимаю шляпу.

Перебор с атрибуцией

Иван взглянул в лицо Маше.
— Какая ты все-таки молодец, — сказал он.
— Если бы не ты, у меня бы ничего не получилось, — отозвалась она.
— Да брось, не стоит, — проговорил Иван.

Лишние наречия и прочие уточнения

Еще хуже смотрятся штампы:

— Сейчас я с тобой расправлюсь! — зловеще ухмыльнулся Император.
— Умоляю, отпустите меня! — душераздирающе закричала девушка, заламывая руки.

Однотипная атрибуция

— Я пошла в магазин, — сказала Маша.
— Не забудь купить сушек, — сказала бабушка, отсчитав ей деньги.
— А мне конфет! — сказал папа из-за двери.

Не стоит раз за разом повторять одинаковые атрибутивные глаголы, иначе внимание читателя зафиксируется именно на этих словах. Если вам сложно подобрать атрибутивный глагол, вставьте фразу, которая будет описывать действие героя, а потом — его реплику.

— Я пошла в магазин, — сказала Маша.
Бабушка отсчитала ей деньги.
— Не забудь купить сушек.
— А мне конфет! — послышался папин голос из-за двери.

Говорящие глаголы и ярлыки

По возможности старайтесь не снабжать реплики героев излишне говорящими атрибутивными глаголами. Эмоции должны передаваться самой сутью сцены, а не приклеенными ярлыками.

— Брось пушку, Аттерсон! — проскрежетал Джекил.

— Целуй меня, целуй! — задохнулась Шайна.

— Ты меня дразнишь! — отдернулся Билл.

Длинный диалог из коротких предложений

— Ты куда?
— В деревню.
— А что там?
— Ничего.
— А зачем?
— Надоело.
— Почему?
— Ты не поймешь.

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

Акцент и искажение речи

Употребление имени в диалоге

— Здравствуй, Маша!
— Здравствуй, Петя! Как я рада тебя видеть!

Что неправильно? Во время разговора мы редко называем людей по имени, особенно, если рядом никого нет. Поэтому данный диалог звучит фальшиво.

Пересказ чужих слов

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

— Сегодня Машу встретил. Она спросила, куда я пропал, а я соврал, что у меня нет времени.

Пересказ того, что герои и так знают

Часто начинающие авторы пытаются ввести читателя в курс дела с помощью диалога. И вот два эльфа заходят в таверну и пересказывают друг другу историю Срединного королевства:

— Ты же знаешь, пару лет назад орки напали на наши северные границы и сожгли пять городов. И тогда король Сигизмунд Пятнадцатый выделил триста тысяч воинов на боевых драконах…
— Да, эта битва недаром вошла в летописи. Помнишь, как они захватили Волшебный Камень Всезнания?
— Конечно, помню.

Некорректное использование иностранных выражений

Иностранцы в романах новичков нередко говорят на своем родном языке с дикими ошибками. Если вы не уверены, как правильно пишется фраза, проконсультируйтесь у профессионального переводчика или у носителя языка.

Перебор со сленгом и матом

Помним, что никто нас не осудит за отсутствие ненормативной лексики, а вот растерять читателей из-за обилия мата вполне возможно.

Какими свойствами должен обладать хорошо прописанный диалог?

2. Каждый из героев должен разговаривать на своем собственном языке. Его надо наделить любимыми словечками, заранее продумать, как он будет строить фразы, каков у него лексический запас, какой уровень грамотности и т.п. Этот прием позволит не только проговорить нужную по сюжету информацию, но и создать достоверный образ.

При этом следует помнить, что герои не могут вести себя со всеми одинаково и разговаривать в одной манере и с королевой, и с портовым грузчиком.

3. Герои не должны беседовать в вакууме. Создайте вокруг них живой мир — с запахами, звуками, обстановкой, погодой, освещением и т.п.

4. Пусть герои не только говорят, но и жестикулирует, передвигается, гримасничает и т.п.

6. Длина предложений в диалогах должна соотноситься со скоростью развития событий. В кризисных ситуациях человек говорит кратко; дома у камина может позволить себе цветистые обороты и поэтические сравнения.


Итак, на дворе шёл 2019 год, а мы всё ещё не умеем нормально показывать диалоги.

Давайте всё по порядку, и начнем с постановки задачи:

Я бы назвал этот способ джуниорским, потому что не первый раз сталкиваюсь с непониманием, почему нельзя просто использовать AlertDialog, как показано ниже:

Довольно распространенный способ для начинающего разработчика, он очевиден и интуитивно понятен. Но, как и во многих случаях при работе с Android, этот способ совершенно неправильный. На ровном месте мы получаем утечку памяти, достаточно повернуть устройство, и вы увидете в логах такую ошибку:

На Stackoverflow вопрос по этой проблеме один из самых популярных. Если коротко, то проблема в том, что мы либо показываем диалог, либо не закрываем диалог после завершения работы активити.

Можно, конечно, вызывать dismiss у диалога в onPause или onDestroy активити, как советуют в ответе по ссылке. Но это не совсем то, что нам нужно. Мы хотим, чтобы диалог восстанавливался после поворота устройства.

До появления фрагментов в Android диалоги должны были отображаться через вызов метода активити showDialog. В этом случае активити правильно управляет жизненным циклом диалога и восстанавливает его после поворота. Создание самого диалога нужно было реализовать в коллбэке onCreateDialog:

Вообще, эта проблема типична для Android, когда нужно что-то сделать после асинхронной операции, а активити или фрагмент уже уничтожен в этот момент. Наверное, поэтому MV*-паттерны более популярны в Android-сообществе, чем среди iOS-разработчиков.

В Android Honeycomb появились фрагменты, и описанный выше способ устарел, а метод showDialog у активити помечен как deprecated. Нет, AlertDialog не устарел, как ошибаются многие. Просто теперь появился DialogFragment, который оборачивает объект диалога и управляет его жизненным циклом.

Родные фрагменты тоже устарели начиная с 28 API. Теперь следует использовать только реализацию из Support Library(AndroidX).

Давайте реализуем нашу задачу, как это предписывает официальная документация:

  1. Для начала нужно наследоваться от DialogFragment и реализовать создание диалога в методе onCreateDialog.
  2. Описать интерфейс событий диалога и инстанцировать слушатель в методе onAttach.
  3. Реализовать интерфейс событий диалога в активити или фрагменте.

Если читателю не очень понятно, почему нельзя передавать слушатель через конструктор, то он может почитать подробнее об этом тут

Код фрагмента диалога:

Достаточно много кода получилось, не так ли?

Как правило, в проекте есть какой-нибудь MVP, но я решил, что вызовы презентера можно опустить в данном случае. В примере выше стоит ещё добавить статический метод создания диалога newInstance и передачу параметров в аргументы фрагмента, всё как полагается.

И это всё ради того, чтобы диалог вовремя скрывался и правильно восстанавливался. Не удивительно, что появляются такие вопросы на Stackoverflow: один и два.

Текущее положение дел нас не устраивало, и мы стали искать способ, как сделать работу с диалогами более комфортной. Было ощущение, что можно сделать проще, почти как в первом способе.

Ниже сформулированы соображения, которыми мы руководствовались:

Мы учли все вышеописанные требования и придумали способ реактивного показа диалогов, который успешно реализовали в нашей библиотеке RxPM (про нее есть отдельная статья).

Я покажу, как исходная задача решается в RxPM, но сначала пару слов о ключевых понятиях из библиотеки:

  • PresentationModel — хранит реактивный стейт, содержит UI-логику, переживает повороты.
  • State — реактивный стейт. Можно воспринимать как обертку над BehaviorRelay.
  • Action — обертка над PublishRelay, служит для передачи событий от View в PresentationModel.
  • State и Action имеют observable и consumer.

В DialogControl есть следующие методы:

  • show(data: T) — просто отдает команду на отображение.
  • showForResult(data: T): Maybe — показывает диалог и открывает поток для получения результата.
  • sendResult(result: R) — отправляет результат, вызывается со стороны View.
  • dismiss() — просто скрывает диалог.

В DialogControl хранится состояние — есть диалог на экране или нет (Displayed/Absent). Вот так это выглядит в коде класса:

Создадим простую PresentationModel:

Обратите внимание, что обработка кликов, получение подтверждения и обработка действия реализованы в одной цепочке. Это позволяет сделать код сфокусированным и не раскидывать логику по нескольким коллбэкам.

Далее просто привязываем DialogControl во View с помощью экстеншена bindTo.
Собираем обычный AlertDialog, а результат отправляем через sendResult:

При типичном сценарии под капотом происходит примерно следующее:

Стоит отметить, что диалог закрывается и в момент, когда View отвязывается от PresentationModel. В этом случае состояние остается Displayed. Оно будет получено при следующей привязке и диалог будет восстановлен.

Как видите, необходимость в DialogFragment пропала. Диалог показывается, когда View привязывается к PresentationModel и скрывается, когда View отвязывается. За счёт того, что состояние хранится в DialogControl, который в свою очередь хранится в PresentationModel, диалог восстанавливается после поворота устройства.

Мы с вами рассмотрели несколько способов отображения диалогов. Если вы все ещё показываете первым способом, то прошу вас, не делайте больше так. Для любителей MVP ничего не остается, как использовать стандартный способ, который описан в официальной документации. К сожалению, склонность к императивности этого паттерна не позволяет сделать по-другому. Ну, а фанатам RxJava рекомендую присмотреться к реактивному способу и нашей библиотеке RxPM.

Читайте также: