mayday_45 пишет:
Как это фиксить, есть у кого соображения? Если я не ошибаюсь, нужно создавать новое окно в своей сцене с прототипом window_message, или нет? Но как это правильно сделать? Долго искал примеры, но не нашел
Да,
$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.
Да и проще это.