Войти на сайт

Авторизация, ждите ...
×
Правила раздела:
1 Задавайте конкретные вопросы. Для болтовни есть свободный раздел.
2 По возможности давайте конкретные ответы.
3 Один вопрос=одна тема. Если хотите задать ещё вопрос, то начинайте новую тему.
4 Название темы должно составлять сам вопрос, и быть максимально конкретным. Рекомендуется начинать тему словами "Как", "Что", "Почему". А первый пост повторяет вопрос и даёт расширенные сведения.
5 Рекомендуется указывать версию мейкера (2000, 2003, RMXP, RMVX, ACE, IGM, и.т.д.. Это важно, и всё равно ведь спросят.
6 Темы "Пара вопросов", "Помогите", и подобные им - самый лёгкий путь к бану.
7 Поиск находится вверху справа.
А. Названия подразделов этого раздела уточняются. Советы принимаются.

ТЕМА: Вопрос про .update()

Вопрос про .update() 5 года 7 мес. назад #105881

  • Noxmils
  • Noxmils аватар
  • Вне сайта
  • Мастер
  • Сообщений: 186
  • Спасибо получено: 349
  • Программист JavaScript ТестерОрганизатор конкурсов
Здесь у меня не работает .update() :wall: . Как заставить работать?
 
(function () {
    function CameraZoom (zoom, period) {
        console.log('CameraZoom');
        this.initialize.apply (this, arguments);
    };
 
    CameraZoom.prototype.initialize = function (zoom, period) {
        this.Z = 0;
        this.ZoomSpeed = (zoom - SceneManager._screenHeight) / period;
        console.log('init ' + zoom);
    };
 
    CameraZoom.prototype.update = function (zoom, period) {
        console.log ('update');
    };
 
    Zooming = function (zoom, period) {
        new CameraZoom(zoom, period);
    };
 
Администратор запретил публиковать записи гостям.

Вопрос про .update() 5 года 7 мес. назад #105887

  • Dmy
  • Dmy аватар
  • Вне сайта
  • Заблокирован
  • Сообщений: 1142
  • Спасибо получено: 2477
  • Поддержка ФондаДаритель СтимкеяПаладин2 место Программист RubyОраторРазработчикУчительВетеранЗа 2 место на конкурсе маппинга
update() сама по себе не вызывается. Тебе надо прописать её в чьём-то чужом update(). Чтобы прописать код в чужой функции, в RPG Maker MV принято делать так:
//Сохраняем оригинальный метод update в переменную
var Scene_Map_update = Scene_Map.prototype.update;
//Заменяем метод update своим методом
Scene_Map.prototype.update = function() {
  //Делаем тут что что-то своё (например, вызываем update своего объекта)
  //...
 
  //А теперь вызываем оригинальный update, который мы сохранили
  Scene_Map_update.call(this);
}
Теперь, когда Scene_Map вызывает свой метод .update, она на самом деле вызывает наш метод update! :)

Примечание. С названиями Scene_Map_update надо быть осторожным: названия такого типа легко могут совпасть в разных модулях. Чтобы не случалось совпадений, обязательно нужно делать пременную локальной — var в var Scene_Map_update нужен именно для этого — и окружить весь свой код в большую самовызываемую функцию (function () { ... })() — потому что var’ы локальны только в пределах функции.

Noxmils пишет:
    Zooming = function (zoom, period) {
        new CameraZoom(zoom, period);
    };
Этот кусочек скорее всего неправильный. В нём ты создаёшь новый класс Zooming, в инициализаторе которого создаётся CameraZoom... И сразу же выбрасывается. Потому что ты никуда его не сохраняешь.

Вместо этого надо переписать какие-то функции стандартных объектов RPG Maker MV и сделать, чтобы CameraZoom создавалась в них. Какие именно функции и каких объектов надо переписать — не знаю.

Я не знаю, что ты пытаешься сделать и поэтому не знаю, какую функцию тебе надо переписать. Я могу только примерно показать, как можно переписать функции, чтобы добавить твой объект:
//Пример, как переписывать функции
//Я не знаю, какие функции ты будешь переписывать и что тебе вообще надо сделать
 
//Во-первых надо где-то хранить этот cameraZoom: либо в переменной,
//либо в каком-то из стандартных объектов типа Scene_Map; зависит от того,
//сколько у тебя должно быть этих CameraZoom’ов. Предположим, что он у
//тебя один на всю игру — тогда можно сделать так:
var cameraZoom;
 
//Создадим его в какой-то момент. Допустим, при использовании
// команды плагина ‘create_camera_zoom zoom period’, где zoom и period — числа.
// В RPG Maker MV есть готовая функция для команд плагина, которая разбивает
// введённый пользователем текст по пробелам и передаёт первое слово как
// command, а остальное — как массив args (т.е. если выбрать команду
// Команда плагина в событии и ввести create_camera_zoom 10 20,
// то нам передастся command = 'create_camera_zoom' и args = ['10', '20'].
// Вот её и используем:
var Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
  if (command == 'create_camera_zoom' && args.length >= 2) {
    //если команда наша — обрабатываем её сами
    var zoom = parseFloat(args[0]);
    var period = parseFloat(args[1]);
    if (!isNaN(zoom) && !isNaN(period)) {
      //создаём cameraZoom, только если нам передали числа, а не какую-то
      //пакость типа текста
      cameraZoom = new CameraZoom(zoom, period)
    }
  }
  else {
    //если команда не наша — вызываем сохранённую функцию, пусть
    //другие плагины свои команды отработают
    Game_Interpreter_pluginCommand.call(this, command, args)
  }
}
 
//И перепишем чем-то update, чтобы вызывал update нашего CameraZoom. Если CameraZoom
//будет использоваться на карте, кажется логичным переписать метод update объекта
//Scene_Map, отвечающего за отрисовку экрана хождения по карте:
var Scene_Map_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function() {
  if (cameraZoom) {
    //проверим, что cameraZoom вообще существует, чтобы не было ошибки
    cameraZoom.update();
  }
 
   //А потом выполним стандартные действия при update Scene_Map
  Scene_Map_update.call(this);
}

Если непонятно, спрашивай!
Последнее редактирование: 5 года 7 мес. назад от Dmy.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol, Cabbit, Doctor_Bug, Noxmils

Вопрос про .update() 5 года 7 мес. назад #105892

  • Noxmils
  • Noxmils аватар
  • Вне сайта
  • Мастер
  • Сообщений: 186
  • Спасибо получено: 349
  • Программист JavaScript ТестерОрганизатор конкурсов
Спасибо за очень развернутый ответ!

По поводу Zooming, у меня есть строка window.Zooming = Zooming, которую я почему-то не вставил в пост.

Тогда я не понимаю, почему у ДК в примерах update срабатывал как надо.

Из-за DK_Primer.prototype = Object.create(window_Base.prototype)? Но я к себе тоже такую строку ставил и не работало.
Администратор запретил публиковать записи гостям.

Вопрос про .update() 5 года 7 мес. назад #105894

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • ПаладинПроект месяца 2 местоПрограммист JavaScript РазработчикУчитель2 место Проект месяца 3 местоОраторВетеранДаритель Стимкея
Потому что это окно было добавлено в сцену с помощью вызова функции addWindow. Сцена сама стала вызывать update функцию после добавления окна.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Dmy, Noxmils

Вопрос про .update() 5 года 7 мес. назад #105896

  • Noxmils
  • Noxmils аватар
  • Вне сайта
  • Мастер
  • Сообщений: 186
  • Спасибо получено: 349
  • Программист JavaScript ТестерОрганизатор конкурсов
Я, кажется, понял. addWindow вызывается в Window_Base.prototype.initialize.call?
Администратор запретил публиковать записи гостям.

Вопрос про .update() 5 года 7 мес. назад #105897

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • ПаладинПроект месяца 2 местоПрограммист JavaScript РазработчикУчитель2 место Проект месяца 3 местоОраторВетеранДаритель Стимкея
Нет, в сцене, где - то в методе create.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Noxmils
Время создания страницы: 0.382 секунд