Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: Уроки от DK

  1. #1

    По умолчанию Уроки от DK

    Приступая к работе

    Среда разработки

    Плагины можно писать, где угодно, даже в блокноте! Вопрос лишь в удобстве. Я использую Notepad++
    Основные возможности:
    • Подсветка синтаксиса
      Спойлер Скриншот:
    • Автозавершение слов и автозакрытие скобок (включается в настройках)
      Спойлер Скриншот:
    • Работа с несколькими документами
      Спойлер Скриншот:
    • Поиск информации по одному или нескольким документам
    • Замена текста
      Спойлер Скриншот:


    Для отладки программ необходимо включить консоль в RPG Maker MV. Есть следующие способы это сделать:
    1. При запуске проекта нажать F8 (не рекомендуется). Надоест каждый раз нажимать
    2. Использовать плагин YEP_CoreEngine (включить соответствующий параметр)
    3. Использовать код (взят из плагина YEP_CoreEngine):


    Код:
    function openConsole () {
        if (Utils.isNwjs() && Utils.isOptionValid('test')) {
          var _debugWindow = require('nw.gui').Window.get().showDevTools();
          _debugWindow.moveTo(0, 0);
          window.focus();
        }
    };
    openConsole();
    Чтобы вывести информацию в консоль, нужно вызвать функцию: console.log(Object). Object – что выводить. Для удобства напишите следующую функцию:
    Код:
    function p(object) {
    	console.log(object);
    };
    Вызывать функцию p удобнее, чем писать console.log. В дальнейших примерах будет использоваться p(object);
    Сохраните файл с разрешением .js и включите его в вашем проекте.

    Переменные

    Существует 3 типа переменных: локальные, глобальные, переменные класса (о них поговорим позже).

    Локальные переменные – переменные, которые существуют только в функции, объявлены внутри нее и видны только в них.
    Глобальные переменные – переменные, которые существуют все время работы программы/плагина и доступны везде.

    Пример:
    Спойлер Скриншот:

  2. #2

    По умолчанию

    Типы данных

    Существуют простые и сложные типы данных.

    Простые – числа (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; // a будет undefined
    var a = undefined; // a будет undefined

    Условия

    Разница между операторами
    == и === различаются по своей работе.
    == используется для сравнения данных с преобразованием типов данных
    === используется для сравнения без преобразования типов данных

    Явное и неявное преобразование данных
    Явное преобразование – можно конкретно увидеть в коде (пример: var a = Number(‘1’); String ‘1’ преобразуется в 1 с помощью конструктора Number)
    Неявное преобразование – нельзя увидеть в коде

    Пример:
    Спойлер Скриншот:


    Разница сравнения null и undefined
    Спойлер Скриншот:


    Но
    Спойлер Скриншот:

  3. #3

    По умолчанию

    Общие понятия и структура плагинов

    Сцены

    Из сцен состоит вся игра на RPG Maker. Когда Вы находитесь на карте игры или в меню, или еще где – Вы находитесь в сцене. Сцена отображает окна, спрайты, изображения. Она управляет всеми взаимодействиями окон, изображений и др.
    Список всех сцен находится в файле rpg_scenes.js

    Открытие сцены:
    Спойлер Скриншот:


    Немного о «наследовании» и объявлении сцен
    Спойлер Скриншот:


    Создание простой сцены:
    Спойлер Скриншот:


    Добавим простое окно:
    Спойлер Скриншот:

  4. #4

    По умолчанию

    Объекты, функции и «классы»

    Объекты и оператор 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 нет понятия класс, но мы будем использовать его для обозначения сцен, окон, спрайтов и т.д.
    Что такое класс? Класс – коробка. Коробка, в которую мы можем положить вещи (какие-то данные), также мы можем производить различные действия с коробкой (открыть, посмотреть и т.д.) – это функции.
    Итак, класс – это набор данных и функций для взаимодействия с этими данными.

  5. #5

    По умолчанию

    Что такое класс в RPG Maker MV, и как он объявляется?

    Классом мы будем называть функции, которые хранят переменные и имеют встроенные функции, и явно определенную функцию initialize.

    Существует два типа классов: динамические и статические (о статических классах поговорим позже). Забегая вперед, скажу, что при описании функции в динамическом классе используется ключевое слово prototype, но это не все отличия
    Спойлер Скриншот:


    Статический класс:
    Спойлер Скриншот:


    Пример динамического класса и разница функции и класса:
    Спойлер Скриншот:


    Третий тип переменных – переменные класса.

    Итак, переменная класса – переменная, которая объявляется внутри любой функции класса через указатель this.

    Эти переменные доступны через созданный объект с помощью . (точки), как и функции класса.

    Когда мы создали объект new classA(), в object записался наш объект, и он будет существовать до конца работы программы, то есть в переменной a будет храниться значение ‘class’, пока мы его не изменим или программа не завершит работу, либо пока мы принудительно не уничтожим объект.

    Уничтожить объект мы можем так: object = null; // в прошлом уроке мы говорили, что null – объект, означающий пустоту. Теперь мы не сможем вызвать функцию object.changeA() или обратиться к переменной а - object.a.

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

    Итак, благодаря этому типу переменных игра знает на какой вы сейчас карте, сколько у вас денег и т.д., потому что в глобальной переменной хранится объект, в котором определены все эти переменные (номер карты, золото и прочее). В своих плагинах вы можете получить доступ к этой информации в любой момент.

    Важно! Нельзя давать одинаковые имена переменным класса и функциям класса.


    Функции с параметрами по умолчанию
    Спойлер Скриншот:


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

  6. #6

    По умолчанию

    Продолжим создавать нашу сцену Scene_Test

    Одно важное уточнение на счет сцен. Когда мы открываем сцену, то сначала вызывается функция initialize (создается объект), потом вызывается функция create. Обе функции должны быть определены.
    Спойлер Скриншот:


    Теперь изменим нашу сцену и создадим свой класс окна
    Спойлер Скриншот:


    Класс Window_Test
    Спойлер Скриншот:

  7. #7

    По умолчанию

    Статический класс

    Ранее мы говорили о том, что существуют динамические и статические классы. Поговорим подробнее о статических классах.

    Статический класс создается всего один раз в самой программе. Создать объект статического класса через оператор 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), повернуть, увеличить/уменьшить, скрыть/показать и др.

  8. #8

    По умолчанию

    Поговорим подробнее о спрайтах и битмапах

    Как было сказано в прошлом уроке – спрайты служат для отображения и управления битмапами. Битмапы – рисунки.

    Изменим наше окно таймера и сделаем из него спрайт, а также добавим фон в нашу сцену

    Таймер
    Спойлер Скриншот:


    На наш таймер можно будет нажимать мышкой или пальцами на телефоне, потому что мы используем Sprite_Button.

    В окнах битмап хранится в переменной this.contents. В спрайтах битмапы хранятся в this.bitmap.

    Также обратите внимание на изменения в функции drawTimer

    Спойлер Скриншот:


    Мы дополнили метод update, потому что оригинальная функция отслеживает нажатия мыши или нажатия на экран.
    В Sprite_Base можно оставлять update пустым, если нужно.
    Также часто можно увидеть, что используют просто Sprite вместо Sprite_Base.
    Если посмотреть файл rpg_sprites.js, то можно увидеть, что различия минимальны.
    Добавлены методы анимации и скрыть/показать спрайт).

    Изменения в сцене
    Спойлер Скриншот:


    Теперь мы можем управлять таймером из окна команд или нажатием мыши на таймер.

    Функция setClickHandler аналогичная setHandler у окон, только не нужно указывать символ.
    Происходит привязка функции-обработчика сцены к нашему спрайту и при нажатии на него, вызывается привязанная функция.
    В функции мы меняем значение переменной paused.

    В следующих уроках поговорим о том, как загружать изображения в битмапы

  9. #9

    По умолчанию

    Новая игра, сохранение и загрузка

    Когда начинается новая игра, все игровые объекты создаются в функции DataManager.createGameObjects, поэтому стоит переопределять ее, чтобы создавать собственные объекты.

    Сохраняются данные в функции DataManager.makeSaveContents

    Важное замечание: нельзя сохранять объекты, которые имеют графическую составляющую (окна, спрайты, битмапы). Но вы можете сохранять переменные этих объектов и после загрузки снова присваивать их.

    Загружаются данные в функции DataManager.extractSaveContents

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

    Пример на основе плагина Время (Game_Time):
    Спойлер Скриншот:


    В функции DataManager.createGameObjects создаются несколько объектов, при этом не нарушается создание игровых объектов (функции дополнена).

    В функции DataManager.makeSaveContents мы записали в переменную contents игровые данные, которые были сохранены до нашей функции, затем сохраняются объекты плагина. Объект $Game_Time_Tint – спрайт. Мы не можем его сохранить, но мы можем сохранить его переменные, которые нужны для правильной работы при загрузке игры.

    В функции DataManager.extractSaveContents мы сначала проверяем загрузили игровые данные, затем начали загружать свои данные. Условия нужны для совместимости плагина со старыми сохранениями, но в таком случае для этих объектов будут применены значения по умолчанию, которые определены в классах объектов.

  10. #10

    По умолчанию

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

    Чтобы задать плагину информацию, напишите комментарий следующего вида:
    /*:
    * @plugindesc – Описание плагина
    * @author – Автор
    * @help – Информация о плагине, которая отображается при нажатии кнопки справка

    * @param – Название параметра
    * @desc – Описание параметра
    * @default – Стандартное значение

    */

    Использование ваших параметров

    Параметры вашего плагина можно получить из функции PluginManager.parameters(Plugin);
    Где Plugin – название вашего плагина в ковычках. Название плагина – название js файла
    Получаемый тип параметров – Таблица или Hash (массив, в котором используются не индексы, а ключи в виде строки)

    Пример на основе плагина Время (Game Time)
    Спойлер Скриншот:


    Итак, в переменной GameTimeParam.param находятся все наши параметры. Далее запишем каждый параметр в отдельную переменную.
    Код:
    GameTimeParam.start_sec = Number(GameTimeParam.param['Стартовые секунды']);
    Обращаемся к нашей таблице, указывая ключ в виде названия нашего параметра. Так же здесь присутствует преобразование к Number. Все значения параметров в таблице имеют тип String.
    Последний раз редактировалось DK; 04.05.2016 в 14:22.

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Уроки от DK