Войти на сайт

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

ТЕМА: MV 1.6: Что нового?

MV 1.6: Что нового? 6 года 8 мес. назад #102675

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
Как многие уже заметили, на днях в Steam обновился RPG Maker MV до версии 1.6. Авторы настоятельно рекомендовали сохранить копию своего проекта и как оказалось не зря.

Помимо того, что ПРИНУДИТЕЛЬНО обновились базовые скрипты в «старом» проекте, выяснился один не ОЧЕНЬ приятный (лично для меня) момент. Изменилась область видимости переменных в скрипте плагина и как следствие практически все мои скрипты «встали колом». :ohmy:

Например раньше можно было написать:
(function() {
	var params = PluginManager.parameters('MUR_PLUGIN');
	var aaa = params["aaa"];
})();

И наша переменная aaa была доступна в любой части проекта, в том числе к ней можно было обратиться внутри базовых классов rpg maker. После обновления переменная более недоступна и единственный способ либо выносить её за пределы function() и делать глобальной, либо не ставить в начале var.

С чем это связано я не знаю, возможно EvilCat или DK смогут объяснить, но факт остаётся фактом. Шанс того что глобальная переменная с таким же именем перетрётся другим плагином 50 на 50 :silly:

Видимо придётся меня стиль написания, отказываться от простых function и оформлять в виде своего класса *facepalm*



Предлагаю собрать в теме какие ещё «нововведения» затронули ваши проекты? :blush:
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: AnnTenna, poca

MV 1.6: Что нового? 6 года 8 мес. назад #102677

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист Ruby2 место Даритель СтимкеяРазработчикОраторПроект месяца 2 местоПроект месяца 3 местоПаладинПроект месяца 1 местоВетеран
Все нововведения связаны с поддержкой ES6: habrahabr.ru/post/305900/
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Mur

MV 1.6: Что нового? 6 года 8 мес. назад #102701

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель2 место 3 место Готв
Mur, разве так было? Ведь оборачивание в самовызываемую анонимную функцию всегда служило лишь предотвращению засорения глобального пространства временными переменными. Нет никакой другой необходимости писать такую неуклюжую конструкцию вместо простого
var params = PluginManager.parameters('MUR_PLUGIN');
var aaa = params["aaa"];

Иначе говоря, (function() {...})() - это не какое-то хитрое заклинание, чтобы строчки кода запустились. Без него прекрасно всё запустится. Но переменные, объявленные как var, будут все глобальными, а если их обернуть в функцию - то они будут ограничены рамками этой функции.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Lekste

MV 1.6: Что нового? 6 года 8 мес. назад #102704

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 913
  • Спасибо получено: 566
  • ВетеранОраторПрограммист JavaScript Программист RubyДаритель Стимкея
Я так понял, у Mur переменная стала не видна при использовании в дополнениях к мейкеровским классам, которые(дополнения) объявлены внутри function() { дополнения }()?

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

MV 1.6: Что нового? 6 года 8 мес. назад #102705

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
EvilCat пишет:
Mur, разве так было?

В каком смысле было? Работало раньше? Ну как бы да.
EvilCat пишет:
Ведь оборачивание в самовызываемую анонимную функцию всегда служило лишь предотвращению засорения глобального пространства временными переменными.

Ну собственно да, именно для этого обёртку и делали.

EvilCat пишет:
Иначе говоря, (function() {...})() - это не какое-то хитрое заклинание, чтобы строчки кода запустились. Без него прекрасно всё запустится. Но переменные, объявленные как var, будут все глобальными, а если их обернуть в функцию - то они будут ограничены рамками этой функции.

Да не, по function() у меня вопросов нет, вопрос был в другом:

Для наглядности пример:
(function() {
	var aaa = "Test!";
 
	var Game_Event_setupPageSettings = Game_Event.prototype.setupPageSettings;
	Game_Event.prototype.setupPageSettings = function() {
		Game_Event_setupPageSettings.call(this);
		console.log("aaa=" + aaa);
	}
})();

До версии 1.6, при запуске мы получим в отладчике сообщение:
aaa=Test!

Начиная с 1.6 мы получаем сообщение об ошибке, что aaa undefined

Но! Если мы уберём в начале var:
(function() {
	aaa = "Test!";

То и версии 1.6 получим желаемый результат.

Сейчас я вообще делаю по другому, не знаю насколько это правильно, но подсмотрено у Galv:
 
var Imported = Imported || {};
Imported.MUR_NPC = true;
 
var MUR = MUR || {};			// Глобальный object
MUR.NPC = MUR.NPC || {};		// object плагина NPC
 
MUR.NPC.npc_current_id = 0;		// Храню свои переменные плагина
 
MUR.NPC.showText = function (actorName) {
	// Функция плагина итд.
}
 
// Ну и соответственно внутри базовых классов тоже обращение такое:
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
	_Game_Interpreter_pluginCommand.call(this, command, args);
 
	MUR.NPC.npc_current_id = 1;
};
 

Ну как я понимаю в такой конструкции больше обёртка (function() { ... })(); не нужна?
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102706

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
Lekste пишет:
Я так понял, у Mur переменная стала не видна при использовании в дополнениях к мейкеровским классам, которые(дополнения) объявлены внутри function() { дополнения }()?

Ну собственно выше всё и рассказано.
Lekste пишет:
Или в других плагинах?

не не не, от других плагинов мы собственно и экранировались с помощью function()
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102711

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист Ruby2 место Даритель СтимкеяРазработчикОраторПроект месяца 2 местоПроект месяца 3 местоПаладинПроект месяца 1 местоВетеран
Мур, пожалуйста, записывай в Imported версию плагина, не булевую переменную :)
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102714

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 913
  • Спасибо получено: 566
  • ВетеранОраторПрограммист JavaScript Программист RubyДаритель Стимкея
Зач м вобще нужно это Imported, если пожно проверить переменную с объектом NPC?
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102716

  • Amphilohiy
  • Amphilohiy аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 547
  • Спасибо получено: 666
  • 2 место ГотвПобедитель Сбитой кодировкиУчительОраторПрограммист Ruby
Только что скачал MV, проверил что версия 1.6.0, проверил твой пример для наглядности и... работает. Может кто подтвердить что я особенный баг воспроизводится?
Я верю, что иногда компьютер сбоит, и он выдает неожиданные результаты, но остальные 100% случаев это чья-то криворукость.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: sinder

MV 1.6: Что нового? 6 года 8 мес. назад #102717

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист Ruby2 место Даритель СтимкеяРазработчикОраторПроект месяца 2 местоПроект месяца 3 местоПаладинПроект месяца 1 местоВетеран
Lekste пишет:
Зач м вобще нужно это Imported, если пожно проверить переменную с объектом NPC?
Ты о чем ?
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102718

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
DK пишет:
Мур, пожалуйста, записывай в Imported версию плагина, не булевую переменную :)

А в чём разница? Я могу и внутри своего класса хранить версию в переменной?

Я просто к чему это, так многие делаю, вот тот же Yanfly например:
var Imported = Imported || {};
Imported.YEP_BattleAICore = true;
 
var Yanfly = Yanfly || {};
Yanfly.CoreAI = Yanfly.CoreAI || {};
Lekste пишет:
Зач м вобще нужно это Imported, если пожно проверить переменную с объектом NPC?

Рискну предположить, что по этому Imported проверяется, что модуль уже загружен. Я так понимаю это когда у тебя есть несколько различных библиотек и одни зависят от других, и что бы не было каши делается такая проверка.
Последнее редактирование: 6 года 8 мес. назад от Mur.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102719

  • sinder
  • sinder аватар
  • Вне сайта
  • Мастер
  • Сообщений: 159
  • Спасибо получено: 154
  • 2 место ГотвРазработчик3 место ГотвПрограммист JavaScript Проект месяца 2 место
Не знаю, что у тебя там не так, но твой пример нормально работает в 1.6 версии мейкера. Создал для тест новый проект на версии 1.6, скопировал твой пример и

И это логично, такой метод написания плагинов использовали многие, если бы проблема была, то умерло бы просто 50%+ всех плагинов. На деле же, проблемы буквально в десятке-другой плагинов и то не из-за этого.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102722

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
Amphilohiy пишет:
Только что скачал MV, проверил что версия 1.6.0, проверил твой пример для наглядности и... работает. Может кто подтвердить что я особенный баг воспроизводится?

Ээээ… :ohmy:

А вот это уже странно ибо действительно стало работать :unsure:

Ну тут два варианта, либо что-то обновили втихоря, либо как-то у меня «совпали звёзды», ибо точно не работало :blush:
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102723

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 913
  • Спасибо получено: 566
  • ВетеранОраторПрограммист JavaScript Программист RubyДаритель Стимкея
Dk, я о том, что почему бы не проверять на Mur.NPC != undefined и не использовать лишний объект Imported?
А версию, как было сказано Mur, брать из самого плагина.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: EvilCat

MV 1.6: Что нового? 6 года 8 мес. назад #102724

  • Mur
  • Mur аватар
  • Вне сайта
  • Светлый дракон
  • Мур? Мур! Мур.
  • Сообщений: 574
  • Спасибо получено: 1448
  • ОраторУчитель2 место Организатор конкурсовПрограммист JavaScript Даритель Стимкея
Lekste пишет:
Dk, я о том, что почему бы не проверять на Mur.NPC != undefined и не использовать лишний объект Imported?

Хм, как показал поиск по зарубежным форумам, на самом деле этот Import не нужен. Это пришло из Ruby и по сути в JavaScript не используется. А проверить загружен ли плагин, можно спросив PluginManager._scripts и он вернёт список загруженных плагинов :silly:

Другой вопрос это с
var MUR = MUR || {};

я так понимаю, что это сделано для того, что бы иметь доступ ко всем своим (загруженным) плагинам из любого другого плагина?

Lekste пишет:
А версию, как было сказано Mur, брать из самого плагина.

А в каком случае эта версия может вообще понадобится? Если только оооочень что-то глобально поменялось в модуле?

Но даже если и так, и например не найден метод BBB в библиотеке AAA, то не важно какая версия, главное обработать эту ошибку и как-то сообщить, нэ? :unsure:

И да, раз уже пошел разговор про структуры, я так понимаю, что теперь можно делать просто:
MUR.NPC.set_block = function (blockId, restart_blocks) {
...
}

Без всяких prototype именно благодаря ES6? или я опять что-то путаю?
Последнее редактирование: 6 года 8 мес. назад от Mur.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102729

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель2 место 3 место Готв
Ещё что нового: после апдейта Аваст, довольный как кот, сообщил, что впервые за много лет наконец-то остановил угрозу: страшный файл nw.exe из папки Мейкера... %)
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: DK

MV 1.6: Что нового? 6 года 8 мес. назад #102730

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель2 место 3 место Готв
Mur пишет:
И да, раз уже пошел разговор про структуры, я так понимаю, что теперь можно делать просто:
MUR.NPC.set_block = function (blockId, restart_blocks) {
...
}

Без всяких prototype именно благодаря ES6? или я опять что-то путаю?

Мне не хватает знания об устройстве плагина, чтобы ответить точно... Просто перескажу, как работают прототипы.

Возьмём объект Кот и вызовем у него метод Мяу. У объекта Кот либо есть поле под названием "Мяу", либо нет. Если его нет или если оно не исполняемое (не функция), то получится ошибка.

Но что если мы создали Кота с помощью функции "СемействоКошачьих"? Тогда объект Кот будет считать, что у него есть конструктор - функция СемействоКошачьих. Функции - тоже объекты, и если у СемействаКошачьих есть поле под названием "прототип", то прежде чем отчаяться найти поле Мяу, Кот обратится к полю "прототип" своего конструктора. Если в этом поле объект, у которого есть поле под названием "Мяу", то это всё равно, как если бы у самого Кота было такое поле.

Таким образом, когда мы вызываем "MUR.NPC.set_block(...)", то либо у самого объекта MUR.NPC должно быть поле под названием "set_block"... Либо MUR.NPC должно быть создано с помощью какого-нибудь конструктора (функции), у которого есть поле под названием prototype, и в этом поле лежит объект с полем под названием "set_block"... Если MUR.NPC не создано с помощью конструктора, но само имеет поле prorotype, в котором записаны какие-то функции под какими-то названиями - то вызов MUR.NPC.set_block(...) даже и не подумает к ним обратиться.

Как и в случае с (function() {...})(), запись с prototype - это не какой-то извращённый способ добавлять методы классу вместо простого def, а механизм, имеющий определённую логику и назначение.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102732

  • Lekste
  • Lekste аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 913
  • Спасибо получено: 566
  • ВетеранОраторПрограммист JavaScript Программист RubyДаритель Стимкея
Если верить тому, что написано по ссылке DK, теперь можно писать вобще:
MUR.NPC.set_block() {
    ...
}

Ну и еще, возможно будет очень удобно вместо такого:
var GameScene_update = MyScene.prototype.update
MyScene.update = function() {
    GameScene_update()
    ...
}

можно сделать:
MyScene.update = function() {
    super.update()
    ...
}
Последнее редактирование: 6 года 8 мес. назад от Lekste.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102733

  • EvilCat
  • EvilCat аватар
  • Вне сайта
  • Просветлённый
  • Сообщений: 469
  • Спасибо получено: 850
  • Учитель2 место 3 место Готв
Mur пишет:
Для наглядности пример:
(function() {
	var aaa = "Test!";
 
	var Game_Event_setupPageSettings = Game_Event.prototype.setupPageSettings;
	Game_Event.prototype.setupPageSettings = function() {
		Game_Event_setupPageSettings.call(this);
		console.log("aaa=" + aaa);
	}
})();

До версии 1.6, при запуске мы получим в отладчике сообщение:
aaa=Test!

Начиная с 1.6 мы получаем сообщение об ошибке, что aaa undefined

Но! Если мы уберём в начале var:
(function() {
	aaa = "Test!";

То и версии 1.6 получим желаемый результат.

Если убрать в начале var, переменная будет объявлена как глобальная и будет доступна с таким названием отовсюду (где нет локальной переменной с таким же названием).

Что касается того, доступна ли локально объявленная переменная в функциях, созданных в той же области (как в данном примере функция "Game_Event.prototype.setupPageSettings"... То ответ - "да": это как раз раньше был неуклюжий единственный способ иметь "приватные" поля объекта, а также лишние данные, которые вечно оставались привязаны к создаваемым функциям, занимая память - следовало обращаться с этим осторожнее во избежание утечек.

Я сильно сомневаюсь, чтобы это изменилось в ES6, поскольку на этом нюансе реализации (псевдо приватных полях) были основаны многие веб-сайты. Разве что там могли добавить какое-нибудь ключевое слово (let? не уверена), инструктирующее не давать доступ к данной переменной дочерним функциям области.
Последнее редактирование: 6 года 8 мес. назад от EvilCat.
Администратор запретил публиковать записи гостям.

MV 1.6: Что нового? 6 года 8 мес. назад #102734

  • DK
  • DK аватар
  • Вне сайта
  • Светлый дракон
  • DKPlugins
  • Сообщений: 946
  • Спасибо получено: 1129
  • Программист Ruby2 место Даритель СтимкеяРазработчикОраторПроект месяца 2 местоПроект месяца 3 местоПаладинПроект месяца 1 местоВетеран
Lekste, второй вариант неправильно написан, потому что надо писать GameScene_update.call(this), чтобы у функции был привязан контекст.
На счет третьего варианта не уверен. Скорее всего не будет работать, потому что стандартные "классы" не написаны через классы ES6.
Первый вариант вроде как рабочий.
Администратор запретил публиковать записи гостям.
  • Страница:
  • 1
  • 2
Время создания страницы: 0.342 секунд