Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Как создать окно сообщения в собственной сцене?

Как создать окно сообщения в собственной сцене? 3 года 2 нед. назад #122044

  • mayday_45
  • mayday_45 аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
  • Спасибо получено: 4
Всем привет, форумчане:) Допустим, у меня есть своя сцена. В ней есть кнопочка, которая по идее должна начинать открывать серию последовательных окон с сообщениями и картинками говорящих, как по команде $gameMessage.add("мой текст"). Проблема в том, что данная команда начинает работать только когда я закрываю свою сцену. Как это фиксить, есть у кого соображения? Если я не ошибаюсь, нужно создавать новое окно в своей сцене с прототипом window_message, или нет? Но как это правильно сделать? Долго искал примеры, но не нашел :wall:
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy

Как создать окно сообщения в собственной сцене? 3 года 2 нед. назад #122047

  • Marganec
  • Marganec аватар
  • Вне сайта
  • Заблокирован
  • пффф
  • Сообщений: 362
  • Спасибо получено: 265
  • Разработчик
чего...?извини,но...можно попонятнее?



Администратор запретил публиковать записи гостям.

Как создать окно сообщения в собственной сцене? 3 года 2 нед. назад #122049

  • 123th
  • 123th аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 438
  • Спасибо получено: 99
  • УчительПобедитель конкурса
mayday_45 пишет:
Всем привет, форумчане:) Допустим, у меня есть своя сцена. В ней есть кнопочка, которая по идее должна начинать открывать серию последовательных окон с сообщениями и картинками говорящих, как по команде $gameMessage.add("мой текст"). Проблема в том, что данная команда начинает работать только когда я закрываю свою сцену. Как это фиксить, есть у кого соображения? Если я не ошибаюсь, нужно создавать новое окно в своей сцене с прототипом window_message, или нет? Но как это правильно сделать? Долго искал примеры, но не нашел :wall:

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

Как создать окно сообщения в собственной сцене? 3 года 2 нед. назад #122050

  • Dmy
  • Dmy аватар
  • Вне сайта
  • Заблокирован
  • Сообщений: 1142
  • Спасибо получено: 2477
  • РазработчикЗа 2 место на конкурсе маппингаПоддержка ФондаПрограммист RubyДаритель Стимкея2 место ПаладинУчительВетеранПроект месяца 3 место
mayday_45 пишет:
Как это фиксить, есть у кого соображения? Если я не ошибаюсь, нужно создавать новое окно в своей сцене с прототипом window_message, или нет? Но как это правильно сделать? Долго искал примеры, но не нашел :wall:
Да, $gameMessage — это модель. Она не отображает текст, а лишь хранит его (вместе с лицами, оформлением, информацией о том, что нужно показать выбор, ввод числа и т.п.).

За отображение действительно отвечает класс Window_Message (это основное окно с текстом) и его помощники:
  • Window_ChoiceList (окно выбора вариантов),
  • Window_NumberInput (окно ввода числа),
  • Window_EventItem (окно выбора предмета),
  • Window_Gold (окно показа денег — используется для кода \$ в сообщении),
  • а в MZ ещё и Window_NameBox (окно имени возле сообщения)

Соответственно, нужно создать эти окна. Как это делается, можно подглядеть в Scene_Map и Scene_Base.

Здесь важно отметить, что окна создаются по-разному в MV и MZ:
  • В RPG Maker MV за создание всех окон отвечает окно Window_Message. Оно создаёт все остальные окна-помощники, и их нужно только добавить на сцену.
  • В RPG Maker MZ сцены, в которых есть стандартный функционал сообщений, наследуются от Scene_Message. Scene_Message создаёт все окна: и Window_Message, и окна-помощники. И само добавляет их на сцену.

Это раздел про RPG Maker MV, поэтому ниже я пишу про RPG Maker MV. (Если нужна поддержка MZ, создайте отдельную тему, я отвечу.)

В RPG Maker MV для создания окна сообщения нужно выполнить такие действия:

1. Создать слой для окон (без этого вызовы addWindow будут возвращать ошибку) вызовом this.createWindowLayer(); — эта функция определена в Scene_Base.

2. Создать объект Window_Message, добавить его на сцену через this.addWindow. Желательно сохранить этот экземпляр Window_Message куда-то (например, в this._messageWindow, как в стандартных сценах), т.к. он понадобится в будущем.

3. А также добавить все окна-помощники на сцену (метод subWindows() у экземпляра Window_Message возвращает массив окон-помощников). Пример можно посмотреть в функции createMessageWindow класса Scene_Battle (собственно, её можно прямо в свой код прихватизировать).

Всё! После этого сообщения будут отображаться. Но ещё такой момент — нужно, чтобы в остальной сцене не выполнялись действия в то время, пока активно окно сообщения. Иначе окажется, что кнопка Enter выполняет сразу два действия: и переходит к следующему сообщению, и делает что-то на сцене. Т.е. нужно добавить проверку.

Проверки такие:
  • Функция $gameMessage.isBusy() показывает, хранится ли в $gameMessage какой-то ещё не показанный текст.
  • Функция isClosing() у экземпляра Window_Message проверяет, что окно находится в процессе закрывания (если это не проверить, то кнопка Enter или Escape, закрывшая окно, сразу же может выполнить какое-то другое действие в том же кадре).

Почти всегда нужно делать сразу обе проверки — и $gameMessage.isBusy(), и this._messageWindow.isClosing() (вместо this._messageWindow подставьте своё, если вы сохранили экземпляр Window_Message в другом месте).

Вот код-пример:
function Scene_Example() {
    this.initialize.apply(this, arguments);
}
 
Scene_Example.prototype = Object.create(Scene_Base.prototype);
Scene_Example.prototype.constructor = Scene_Example;
 
Scene_Example.prototype.create = function() {
    Scene_Base.prototype.create.call(this);
    this.createWindowLayer();
    this.createMessageWindow();
};
 
Scene_Example.prototype.start = function () {
  Scene_Base.prototype.start.call(this);
 
  //Просто пример, чтобы был какой-то текст. Вероятно, в вашем случае текст надо
  //будет создать иначе.
  $gameMessage.add('Строка для проверки.')
  $gameMessage.add('Просто чтобы проверить, что что-то выводится.')
}
 
Scene_Example.prototype.update = function() {
  Scene_Base.prototype.update.call(this);
 
  //Если нажат Escape или X, закрыть сцену. Просто чтобы был способ из неё выйти
  //(в вашем примере, вероятно, нужно будет какое-то другое условие закрытия)
  if (this.isActive() && !$gameMessage.isBusy()
          && !this._messageWindow.isClosing() && Input.isPressed('escape')) {
    this.popScene();
  }
}
 
Scene_Example.prototype.createMessageWindow = function() {
    this._messageWindow = new Window_Message();
    this.addWindow(this._messageWindow);
    this._messageWindow.subWindows().forEach(function(window) {
        this.addWindow(window);
    }, this);
};

NB. Чтобы перейти на эту сцену-пример, можно поставить событие с командой «Скрипт», и в ней написать код SceneManager.push(Scene_Example)


Marganec пишет:
чего...?извини,но...можно попонятнее?
Это вопрос по программированию. Если ты не разбираешься в программировании, то ты не поймёшь вопроса — это нормально. Если хочешь научиться программировать, можешь попробовать начать с уроков Mur. А вопросы по ним (и по другим урокам) можно задавать на форуме.



123th пишет:
всё делается через вывод картинок, в том числе текст. так что не извращайся и сразу выводи всё картинками.
всмысле картинками через скрипт.
паузу до стирания картинки можно сделать выведя пустое текстовое сообщение.
Картинками задолбаешься делать показ сообщения по буквам и парсинг текстовых кодов, как в стандартном Window_Message. Если нужен «нативный» внешний вид сообщения, то лучше всё-таки создать Window_Message.

Да и проще это.
Последнее редактирование: 3 года 2 нед. назад от Dmy.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Cabbit, mayday_45

Как создать окно сообщения в собственной сцене? 3 года 2 нед. назад #122068

  • mayday_45
  • mayday_45 аватар
  • Вне сайта
  • Познающий
  • Сообщений: 10
  • Спасибо получено: 4
0_0 Я даже не ожидал, что тут могут так развернуто ответить 0_0
Спасибо огромное за такие подробные разъяснения!) с этим вопросом разобрался только благодаря ответу Dmy) Но от себя еще добавлю, что для того, чтобы текст выходил с разных последовательно выходящих окнах, нужно между командами прописать $gameMessage.newPage(). Пример:
$gameMessage.add('первое сообщение');//выводится первое окно с текстом
$gameMessage.newPage();
$gameMessage.add('второе сообщение');//после закрытия первого окна выходит второе окно, но с другим текстом
Вдруг кому пригодится. По крайней мере, у меня это работает:)
Последнее редактирование: 3 года 2 нед. назад от mayday_45.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.225 секунд