Уроки от DK
Среда разработки
Плагины можно писать, где угодно, даже в блокноте! Вопрос лишь в удобстве. Я использую Notepad++
Основные возможности:
- Подсветка синтаксиса
Для отладки программ необходимо включить консоль в RPG Maker MV. Есть следующие способы это сделать:
- При запуске проекта нажать F8 (не рекомендуется). Надоест каждый раз нажимать
- Использовать плагин YEP_CoreEngine (включить соответствующий параметр)
- Использовать код (взят из плагина YEP_CoreEngine)
Чтобы вывести информацию в консоль, нужно вызвать функцию: console.log(Object). Object – что выводить. Для удобства напишите следующую функцию:
Вызывать функцию p удобнее, чем писать console.log. В дальнейших примерах будет использоваться p(object);
Сохраните файл с разрешением .js и включите его в вашем проекте.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Существует 3 типа переменных: локальные, глобальные, переменные класса (о них поговорим позже).
Локальные переменные – переменные, которые существуют только в функции, объявлены внутри нее и видны только в них.
Глобальные переменные – переменные, которые существуют все время работы программы/плагина и доступны везде.
Пример:
Типы данных
Существуют простые и сложные типы данных.
Простые – числа (Number), строки (String)
Сложные – массив (Array), объекты (Object)
Почему одни простые, а другие – сложные? Все дело в том, как программа взаимодействует с ними.
Когда мы передаем простые данные в функцию, то перед началом работы функции создается локальная переменная с именем, указанным в параметрах (пример: function func(a) {}. a – локальная переменная для этой функции). В эту переменную копируется значение передаваемого параметра в случае работы с простыми данными, а в случае со сложными данными – копируется ссылка на объект. Что это значит? Когда мы скопировали значение, то мы не изменим первичную переменную. Если мы скопировали ссылку, то мы будем работать с одним и тем же объектом.
Пример:
Null и глобальные свойства
null – специальный объект, который обозначает отсутствие объекта (подробнее будет рассмотрен позднее)
arguments - Локальная переменная arguments доступна внутри функций. Вы можете обращаться к аргументу по номеру, начиная от 0. При этом arguments содержит не объявленные, а реально переданные аргументы.
Пример:
Таким образом, в функцию можно передать больше параметров, чем она принимает, но получить доступ к этим параметрам можно только с помощью arguments.
NaN - Не-Числовое значение. Как правило, оно используется для обозначения ошибки при математических операциях. Вместо генерации исключения, функция возвращает NaN. Значение NaN не равно никакому другому числу, включая само NaN. Чтобы проверить переменную на NaN, используйте специальную функцию isNaN.
Важно! Эта функция полезна, так как значение NaN не может быть проверено операторами эквивалентности. Значение x == NaN и x === NaN всегда false для любого x, даже если x=NaN.
undefined - Эта глобальная переменная содержит элементарное неопределенное значение - то, которое имеет переменная, значение которой не указано.
Пример:
Условия
Разница между операторами
== и === различаются по своей работе.
== используется для сравнения данных с преобразованием типов данных
=== используется для сравнения без преобразования типов данных
Явное и неявное преобразование данных
Явное преобразование – можно конкретно увидеть в коде (пример: var a = Number(‘1’); String ‘1’ преобразуется в 1 с помощью конструктора Number)
Неявное преобразование – нельзя увидеть в коде
Пример:
Разница сравнения null и undefined
Но
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Сцены
Из сцен состоит вся игра на RPG Maker. Когда Вы находитесь на карте игры или в меню, или еще где – Вы находитесь в сцене. Сцена отображает окна, спрайты, изображения. Она управляет всеми взаимодействиями окон, изображений и др.
Список всех сцен находится в файле rpg_scenes.js
Открытие сцены:
Немного о «наследовании» и объявлении сцен
Создание простой сцены:
Добавим простое окно:
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Объекты и оператор new
В JavaScript все состоит из объектов (как в нашем мире). Переменная – объект, функция – тоже объект! Мы даже можем записывать функции в переменные.
Создание объекта с помощью оператора new
В предыдущем уроке мы создавали окно (создали объект)
Оператор new создает новый объект, используя функцию-конструктор (функция initialize), которая может быть как встроенной в javascript (Date, String), так и определенной пользователем.
Когда наш плагин будет выполнять эту строчку, то оператор new создаст окно (объект), вызвав функцию initialize (передав параметры x, y, width, height) и объект запишется в переменную.
Функция initialize окна Window_Base
Оператор new всегда вызывает первой функцию initialize у создаваемого объекта.
У окна Window_Base явно определена функция initialize, но можно и не определять ее.
В данном случае функция func сама по себе является initialize. Также можно заметить, что без оператора new значение переменной a неопределенно.
Договоримся о понятиях
В JavaScript нет понятия класс, но мы будем использовать его для обозначения сцен, окон, спрайтов и т.д.
Что такое класс? Класс – коробка. Коробка, в которую мы можем положить вещи (какие-то данные), также мы можем производить различные действия с коробкой (открыть, посмотреть и т.д.) – это функции.
Итак, класс – это набор данных и функций для взаимодействия с этими данными.
Что такое класс в RPG Maker MV, и как он объявляется?
Классом мы будем называть функции, которые хранят переменные и имеют встроенные функции, и явно определенную функцию initialize.
Существует два типа классов: динамические и статические (о статических классах поговорим позже). Забегая вперед, скажу, что при описании функции в динамическом классе используется ключевое слово prototype, но это не все отличия
Статический класс:
Пример динамического класса и разница функции и класса:
Третий тип переменных – переменные класса
Итак, переменная класса – переменная, которая объявляется внутри любой функции класса через указатель this.
Эти переменные доступны через созданный объект с помощью . (точки), как и функции класса.
Когда мы создали объект new classA(), в object записался наш объект, и он будет существовать до конца работы программы, то есть в переменной a будет храниться значение ‘class’, пока мы его не изменим или программа не завершит работу, либо пока мы принудительно не уничтожим объект.
Уничтожить объект мы можем так: object = null; // в прошлом уроке мы говорили, что null – объект, означающий пустоту. Теперь мы не сможем вызвать функцию object.changeA() или обратиться к переменной а - object.a.
Если мы записали объект в локальную переменную, то после выхода из функции этот объект уничтожается.
Итак, благодаря этому типу переменных игра знает на какой вы сейчас карте, сколько у вас денег и т.д., потому что в глобальной переменной хранится объект, в котором определены все эти переменные (номер карты, золото и прочее). В своих плагинах вы можете получить доступ к этой информации в любой момент.
Важно! Нельзя давать одинаковые имена переменным класса и функциям класса.
Функции с параметрами по умолчанию
По умолчанию значение любой переменной неопределенно, то есть принимает значение undefined
Этим можно пользоваться для создания более гибких и универсальных функций
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Одно важное уточнение на счет сцен. Когда мы открываем сцену, то сначала вызывается функция initialize (создается объект), потом вызывается функция create. Обе функции должны быть определены.
Теперь изменим нашу сцену и создадим свой класс окна
Класс Window_Test
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Класс окна с командами
Протестируйте заливку экрана и попробуйте изменить функцию standardPadding
Добавим пару команд нашему окну, а также уберем функцию заливки
Сейчас у нас вертикальный список. Одновременно будет отображаться одна команда. Изменим количество столбцов, чтобы отображались все команда, а также изменим выравнивание текста по центру
Сейчас при нажатии на команды ничего не происходит. Чтобы это исправить, нужно добавить в сцену обработчик нажатия команд.
Теперь создадим окно, в котором будет отображаться простенький таймер. Этим окном мы сможем управлять с помощью только что созданного окна команд
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Разберем подробнее функцию update
В функции initialize мы установили переменную this.paused = true
Зачем? Тем самым мы сказали, что «таймер остановлен». Функция update будет возвращаться в первом же условии.
Если же у нас идет таймер, то мы увеличиваем переменную для счета кадров в секунду. В идеале эта функция должна вызывать 60 раз в секунду, поэтому, когда счетчик доходит до 60, то мы можем сказать, что прошла 1 секунда и изменить наш таймер. Это в идеале. На самом деле FPS не стабилен и нельзя быть уверенным, что секунда в игре равна секунде в жизни, но для примера сойдет.
Итак, у нас прошла секунда, мы вызвали функцию обновления таймера. Она нам увеличила время и вывела новое значение.
Как я говорил в прошлом уроке не стоит нагружать функцию update лишними вычислениями. Мы это и сделали. При паузе мы вообще возвращаемся из функции, а при работе таймера значение рисуется раз в секунду, а не 60 раз в секунду.
Добавим возможность управлять нашим таймером и небольшая правка функций
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ранее мы говорили о том, что существуют динамические и статические классы. Поговорим подробнее о статических классах.
Статический класс создается всего один раз в самой программе. Создать объект статического класса через оператор new невозможно. Статический класс, как и глобальная переменная, живет всю программу и виден везде.
Статические классы используются для хранения информацию и осуществления функциями над ними.
Пример статических классов в игре:
DataManager – управляет загрузкой и сохранением игровых данных.
ConfigManager – хранит и управляет данными настройки игры (уровень звука и др.)
StorageManager – сохраняет и загружает данные из файлов на компьютере или на сервере.
ImageManager – управляет загрузкой изображений.
AudioManager – управляет проигрыванием звуков
SoundManager – вызывает проигрывание звуков с помощью AudioManager.
TextManager – хранит все текстовые переменные, что редактируются в Базе Данных.
SceneManager – управляет сценами.
BattleManager – управляет битвами.
PluginManager – управляет плагинами.
Создание собственного статического класса на примере класса DataManager
При попытке создать объект с помощью оператор new мы получим ошибку с текстом, указанным на изображении. Соответственно функция initialize не вызывается у таких классов, но может присутствовать (ее нужно будет вызывать самостоятельно)
Функции объявляются следующим образом:
Игровые данные
Все, что вы редактируете в Базе Данных в игре можно найти в глобальных переменных.
DataManager загружает всю информацию при запуске игры.
$dataActors - персонажи
$dataClasses - классы
$dataSkills - навыки
$dataItems - вещи
$dataWeapons - оружие
$dataArmors - броня
$dataEnemies - враги
$dataTroops – группы врагов
$dataStates - состояния
$dataAnimations - анимации
$dataTilesets - тайлсеты
$dataCommonEvents – общие события
$dataSystem - система
$dataMapInfos – информация о картах
$dataMap – карты
Эти данные хранятся в файлах в вашем проекте. При сохранении игры они не сохраняются. Изменяются только в Базе Данных. Тип данных у этих переменных – массивы. Причем учтите, что нулевой элемент равен null !
Также существуют данные, которые также создаются в начале игры, но они меняются по ходу игры и сохраняются, когда пользователь сохраняет игру.
$gameTemp – временные данные
$gameSystem – системные данные
$gameScreen – данные экрана
$gameTimer – данные таймера
$gameMessage – данные сообщений
$gameSwitches - переключатели
$gameVariables - переменные
$gameSelfSwitches – локальные переключатели
$gameActors - персонажи
$gameParty - партия
$gameTroop – отряд врагов
$gameMap - карта
$gamePlayer – игрок
Из этих данных не сохраняются $gameTemp, $gameMessage и $gameTroop.
Тип данных у этих переменных – классы. Определение этих классов можно посмотреть в файле rpg_objects.js
В следующем уроке мы подробно рассмотрим спрайты и битмапы.
Существует два наиболее используемых класса спрайтов: Sprite_Base и Sprite_Button
Sprite_Button – поддерживает нажатие мышью или пальцами на телефонах.
Спрайт – контейнер для управления битмапами.
Битмап (Bitmap) – область для рисования или рисунок, загруженный из файла. Поддерживает рисование текста, заливку цветом и др. функции (подробнее в справке или посмотрите класс Bitmap в файле rpg_core.js).
Спрайт используется для хранения битмапов и управления ими. Например, есть функции перемещения, возможность установить расположение рисунка (x, y), повернуть, увеличить/уменьшить, скрыть/показать и др.
Рекомендуется
Пролистайте файлы rpg_objects.js и rpg_managers.js
Посмотрите, какие у них есть переменные и функции
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Как было сказано в прошлом уроке – спрайты служат для отображения и управления битмапами. Битмапы – рисунки.
Изменим наше окно таймера и сделаем из него спрайт, а также добавим фон в нашу сцену
Таймер
На наш таймер можно будет нажимать мышкой или пальцами на телефоне, потому что мы используем Sprite_Button.
В окнах битмап хранится в переменной this.contents. В спрайтах битмапы хранятся в this.bitmap.
Также обратите внимание на изменения в функции drawTimer
Мы дополнили метод update, потому что оригинальная функция отслеживает нажатия мыши или нажатия на экран. В Sprite_Base можно оставлять update пустым, если нужно. Также часто можно увидеть, что используют просто Sprite вместо Sprite_Base. Если посмотреть файл rpg_sprites.js, то можно увидеть, что различия минимальны. Добавлены методы анимации и скрыть/показать спрайт).
Изменения в сцене
Теперь мы можем управлять таймером из окна команд или нажатием мыши на таймер.
Функция setClickHandler аналогичная setHandler у окон, только не нужно указывать символ. Происходит привязка функции-обработчика сцены к нашему спрайту и при нажатии на него, вызывается привязанная функция. В функции мы меняем значение переменной paused.
В следующих уроках поговорим о том, как загружать изображения в битмапы
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Когда начинается новая игра, все игровые объекты создаются в функции DataManager.createGameObjects, поэтому стоит переопределять ее, чтобы создавать собственные объекты.
Сохраняются данные в функции DataManager.makeSaveContents
Важное замечание: нельзя сохранять объекты, которые имеют графическую составляющую (окна, спрайты, битмапы). Но вы можете сохранять переменные этих объектов и после загрузки снова присваивать их.
Загружаются данные в функции DataManager.extractSaveContents
Важное замечание: если вы написали плагин, который сохраняет/загружает свои данные, и у вас есть старые сохранения, то они могут не работать, потому что в них нет этих новых данных. Вы можете добавить условие проверки существуют ли данные в сохранении
Пример на основе плагина Время (Game_Time):
В функции DataManager.createGameObjects создаются несколько объектов, при этом не нарушается создание игровых объектов (функции дополнена).
В функции DataManager.makeSaveContents мы записали в переменную contents игровые данные, которые были сохранены до нашей функции, затем сохраняются объекты плагина. Объект $Game_Time_Tint – спрайт. Мы не можем его сохранить, но мы можем сохранить его переменные, которые нужны для правильной работы при загрузке игры.
В функции DataManager.extractSaveContents мы сначала проверяем загрузили игровые данные, затем начали загружать свои данные. Условия нужны для совместимости плагина со старыми сохранениями, но в таком случае для этих объектов будут применены значения по умолчанию, которые определены в классах объектов.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Чтобы задать плагину информацию, напишите комментарий следующего вида:
/*:
* @plugindesc – Описание плагина
* @author – Автор
* @help – Информация о плагине, которая отображается при нажатии кнопки справка
* @param – Название параметра
* @desc – Описание параметра
* @default – Стандартное значение
*/
Использование ваших параметров
Параметры вашего плагина можно получить из функции PluginManager.parameters(Plugin);
Где Plugin – название вашего плагина в ковычках. Название плагина – название js файла
Получаемый тип параметров – Таблица или Hash (массив, в котором используются не индексы, а ключи в виде строки)
Пример на основе плагина Время (Game Time)
Итак, в переменной GameTimeParam.param находятся все наши параметры. Далее запишем каждый параметр в отдельную переменную.
Обращаемся к нашей таблице, указывая ключ в виде названия нашего параметра. Так же здесь присутствует преобразование к Number. Все значения параметров в таблице имеют тип String.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Скачайте плагин и попробуйте разобраться, что он делает, как устроен и напишите свои комментарии к коду. Затем скиньте мне. Если что-то не получится, то ничего страшного. Будем разбираться вместе!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Я вот почитал несколько постов, но ничего не вкурил..вообще.
Если уроки для новичков, то может стоит начать совсем с основ?
Канал: www.youtube.com/channel/UC_dv6JJsCYtMvAkjjQwbUhw
Зловещая тень: rpg-maker.info/forum/proekty/59684-mortu...pes-zloveshchaya-ten
Phantasy Star III rpg-maker.info/forum/igry-i-roliki/60085...tory-of-orakio#79128
Phantasy star Наследие rpg-maker.info/forum/projects/60615-phantasy-star-nasledie
Доблесть воина rpg-maker.info/forum/projects/50869-dobl...na-trpg?limitstart=0
Персона rpgmaker.ru/forum/projects/61435-persona...-storona-dushi#94488
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
I_LORD пишет: Я вот немного не понимаю для кого эти уроки? Для тех кто понимает в языках программирования?
Я вот почитал несколько постов, но ничего не вкурил..вообще.![]()
Если уроки для новичков, то может стоит начать совсем с основ?
Наверное для тех, кто знает js на уровне новичка, но при этом не знает какое устройство самого мейкера.
Я например на "кодакадеми" до темы "функции" дошел,мне первые три поста более менее понятны, кроме некоторых моментов. Остальные посты пока не читал
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- tvorimvsevmeste
-
- Не в сети
- Давно я тут
-
- Сообщений: 250
- Спасибо получено: 50
Поживем — увидим,
доживем — узнаем,
переживем — научимся…
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
tvorimvsevmeste пишет: Денис, а вы могли бы показать пример с чтением из свойства note? Особенно интересно у героев (в базе данных) и у событий. Пожалуйста!
Пример на основе плагина Редкие Вещи . Можете скачать и посмотреть код.
Чтобы обработать заметки вещей, оружия или чего еще, нужно дополнить функцию DataManager.isDatabaseLoaded, которая отвечает за проверку загружена ли база данных или нет. Если база данных загружена, то мы можем приступить к обработке объектов из базы данных.
Код функции DataManager.isDatabaseLoaded выглядит так:
Функция обязательно должна возвращать значение типа Bool, отвечающее за загрузку базы данных.
if (!Rare_Items_DataManager_isDatabaseLoaded.call(this)) return false;
Если база данных не загружена, то возвращаем значение false;
this.processRareItemsNotetags($dataItems);
this.processRareItemsNotetags($dataWeapons);
this.processRareItemsNotetags($dataArmors);
Вызываем функцию обработки заметок для предметов, оружия и брони
return true;
Возвращаем true - база данных загружена
Далее переходим к функции обработки заметок: DataManager.processRareItemsNotetags
Функция принимает один параметр - массив, содержащий объекты предметов, оружия и т.д.
В функции нужно сделать цикл for от 1 до количества элементов в массиве
for(var i = 1; i < database.length; i++)
Внутри цикла создаем 2 переменные:
1. var item = database[ i ];
2. var notedata = item.note.split(/[\r\n]+/);
item - объект, в котором хранится информация о предмете, оружии и т.д.
notedata - массив, который мы получаем из разделения заметок item-объекта с помощью регулярного выражения.
Теперь мы можем обрабатывать каждую строчку заметок, используя цикл for от 0 до количества элементов в массиве
for(var j = 0; j < notedata.length; j++)
notedata[j] - j-ая строка заметок
Полный код функции DataManager.processRareItemsNotetags:
Для героев нужно посылать в функцию $dataActors
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
