Переменные, простые скрипты, функции rpg maker MV

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 7 мес. назад - 7 года 7 мес. назад #106129 от yuryol
Движение события "вперед" по диагонали.

Как известно, при указания в маршруте события движения "вперед", событие будет двигаться только туда, куда оно направлено. При этом команд "повернуться по-диагонали" нет, хотя движение по-диагонали задать можно.

Функция ниже исправляет этот недочет. Теперь можно задать событию "поворот по-диагонали" в маршруте движения через скриптовую команду:
Code:
this.diagonalDirect = 1; // 1 - поворот вниз-влево,3 - вниз-вправо, 7 - влево-вверх, 9 - вправо-вверх

или в другом событии через скриптовую команду:
Code:
$gameMap.event(id).diagonalDirect = 9;

После этого при указании в маршруте "вперед" событие будет двигаться по диагонали

Сама функция:
Code:
var YuryolMoveForward= Game_Character.prototype.moveForward; Game_Character.prototype.moveForward = function() { switch (this.diagonalDirect) { case 1: this.moveDiagonally(4, 2); break; case 3: this.moveDiagonally(6, 2); break; case 7: this.moveDiagonally(4, 8); break; case 9: this.moveDiagonally(6, 8); break; default: YuryolMoveForward.call(this); break; } };
Последнее редактирование: 7 года 7 мес. назад пользователем yuryol.
Спасибо сказали: Dmy, Cabbit, NeKotZima

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
7 года 7 мес. назад #106139 от DK
Зачем сохранил старую функцию, если не вызываешь ее в новой?
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 7 мес. назад #106140 от yuryol

DK пишет: Зачем сохранил старую функцию, если не вызываешь ее в новой?


невнимательность мое всё :( постоянно забываю
поправил

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 7 мес. назад - 7 года 7 мес. назад #106374 от yuryol
Добавление чего-либо сразу после загрузки карты

Бывает, что после загрузки новой карты требуется сделать постоянно одно и тоже. Например, обнулять одни и те же переменные или проверять день или ночь в игре. Вместо того, чтоб на каждую новую карту вставлять автособытие, можно просто всё это добавить в скрипт:
Code:
var YuryolStart = Scene_Map.prototype.start; Scene_Map.prototype.start = function() { YuryolStart.call(this); //вставляем что хотим: $gameVariables.setValue(1, 0); //например, обнуляем 1-ую переменную };

Сейчас вспомнил еще один вариант - вставить ту строчку в "terminate". Этот вариант мне подсказал кто-то умный, поэтому наверное так будет правильнее
Code:
var YuryolTerminate = Scene_Map.prototype.terminate ; Scene_Map.prototype.terminate = function() { YuryolTerminate.call(this); $gameVariables.setValue(1, 0); //например, обнуляем 1-ую переменную };
Последнее редактирование: 7 года 7 мес. назад пользователем yuryol.
Спасибо сказали: NeKotZima, Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 5 мес. назад #107300 от yuryol
Изменение рендеринга:

Чтобы при увеличении окна игры или развороте ее на весь экран не было мыла, вставляем между тегов <head> и </head> в файл index.html в корневой папке игры следующую строчку:
Code:
<style type="text/css"> CANVAS{image-rendering: pixelated;}</style>

Подсказал Dirge на нейтралке. Подойдет для пиксельных игр. Стоит учитывать, что шрифт также станет рендериться по другому, а потому лучше заменить его на более "квадратный", а в идеале опять же пиксельный.

Пример (слева с вставкой этой строчке, справа - с обычным рендерингом. Мыло справа видно невооруженным глазом):

Спасибо сказали: Lekste, SeaWolf, Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 4 мес. назад #107777 от yuryol
Недавно наткнулся на статью про очередной фреймворк JS по названием Imba . Сначала приводится примеры кода на JS, а затем то же самое на этом очередном фреймворке:

ВНИМАНИЕ: Спойлер!


Затем, соответственно, автор указывает на преимущества Imba перед чистым JS:
- длинное слово "function",
- куча скобок,
- частое употребление return

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

Сокращение кода

1. if...else

Давайте и начнем с вышеупомянутой функции и попробуем ее сократить:
Code:
function findGreatest(a, b) { if (a > b) { return a } else if (b > a){ return b } else { return false } }

1) Выражение в скобках состоят из одной строки, а потому мы их можем убрать:
Code:
function findGreatest(a, b) { if (a > b) return a else if (b > a) return b else return false }

2) Избавляемся от "else". Зачем они здесь, если return и так не дает пройти дальше?
Code:
function findGreatest(a, b) { if (a > b) return a if (b > a) return b return false }

3) Используем сокращенную запись конструкции if...else, тем самым оставив один return
Code:
function findGreatest(a, b) { return (a > b) ? a : (b > a) ? b : false }

4) Знак ">" выше по приоритету, чем "?", а потому мы можем опустить скобки
Code:
function findGreatest(a, b) { return a > b ? a : b > a ? b : false }

5) Перепишем ее как анонимную функцию, т.е. записав в переменную
Code:
const findGreatest = function(a, b) { return a > b ? a : b > a ? b : false }

6) Это позволит следующим шагом записать ее как стрелочную функцию, т.е. избавившись от длинного ненавидимого некоторыми программистами слова "function"
Code:
const findGreatest = (a, b) => { return a > b ? a : b > a ? b : false }

7) Еще одно преимущество стрелочной функции - возможность убрать return совсем, для чего мы должны написать функцию в круглых скобках
Code:
const findGreatest = (a, b) => (a > b ? a : a < b ? b : false)

ВНИМАНИЕ: Спойлер!


Таким образом первоначальную функцию мы сократили до одной строки. Удобно ли для него это или нет - выбор автора, а выбора, как видим, немало. Лично мне нравится 2 вариант как самый читаемый и 7 - как самый короткий.

2. Switch

Одна из самых непривычных конструкций js. Многими считается устаревшей, кажется чужеродной, а постоянные вставки "break" бесят чуть ли не всех. Тем не менее в том же мейкере он часто используется для считывания направления персонажа. К примеру в этом посте используется подобная функция:
Code:
const move = function (direction) { let code; switch(direction) { case 2: code = 'Game_Character.ROUTE_MOVE_DOWN'; break; case 4: code = 'Game_Character.ROUTE_MOVE_LEFT'; break; case 6: code = 'Game_Character.ROUTE_MOVE_RIGHT'; break; case 8: code = 'Game_Character.ROUTE_MOVE_UP'; break; } return code }

1) Мы конечно можем записать брейки в одну строчку, при этом читаемость упадет не сильно
Code:
const move = function (direction) { let code; switch(direction) { case 2: code = 'Game_Character.ROUTE_MOVE_DOWN'; break; case 4: code = 'Game_Character.ROUTE_MOVE_LEFT'; break; case 6: code = 'Game_Character.ROUTE_MOVE_RIGHT'; break; case 8: code = 'Game_Character.ROUTE_MOVE_UP'; break; } return code }

2) Но можно вообще отказаться от свитча и использовать объект
Code:
const move = function (direction) { let code = { '2': 'Game_Character.ROUTE_MOVE_DOWN', '4': 'Game_Character.ROUTE_MOVE_LEFT', '6': 'Game_Character.ROUTE_MOVE_RIGHT', '4': 'Game_Character.ROUTE_MOVE_UP' } return code[direction]; }

3) А уже этот объект можем сразу возвращать
Code:
const move = function (direction) { return { '2': 'Game_Character.ROUTE_MOVE_DOWN', '4': 'Game_Character.ROUTE_MOVE_LEFT', '6': 'Game_Character.ROUTE_MOVE_RIGHT', '8': 'Game_Character.ROUTE_MOVE_UP' }[direction]; }

Для кого-то это может показаться непривычным, но по мне так подобный вариант не менее чужероден, чем switch

3. if ... else с объектами

В мейкере у игрока и событий похожие методы, а потому часто можно встретить подобную конструкцию
Code:
function setParam (params, player) { if (player) { ...; } else { ...; } return; }

Давайте сократим подобную запись взяв как пример подобие функции из этого поста
Code:
function setParam (params, value, player) { if (player) { player[params] = value; } else { $gamePlayer[params] = value; } return; }

которую мы вызываем, указывая третий параметр, если мы хотим изменить свойство у события
Code:
setParam('_opacity', 0.5, $gameMap.event(1))
и не указываем, если хотим вызвать изменение свойств у героя
Code:
setParam('_opacity', 0.5)

1) Перепишем функцию в краткую запись
Code:
function setParam (params, value, player) { (player) ? player[params] = value : $gamePlayer[params] = value; }

2) Мы можем переписать выражение
Code:
(player) ? player[params] = value
как
Code:
(player)[params] = value
а значит подобным образом можем переписать и всю функцию:
Code:
function setParam (params, value, player) { (player || $gamePlayer)[params] = value; }

Итог:

Чем хорошо JS? Тем, что синтаксис дает выбор писать так, как нравится. Можно писать в одну строчку, а можно топорно но читаемо. Можно через стандартные старые конструкции, а можно через функции. Это я еще не говорил о "new Function" , о котором можно почитать самостоятельно
Спасибо сказали: AnnTenna, ZX_Lost_Soul, Seibur, Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Организатор конкурсов Тестер Программист JavaScript
Больше
7 года 1 мес. назад #109582 от Noxmils
Такой короткий код позволяет пропускать титульный экран, автоматически начиная новую игру.
Code:
Scene_Title.prototype.start = function() { this.commandNewGame(); };
Спасибо сказали: yuryol, PringOva

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
7 года 1 день назад - 7 года 1 день назад #111817 от yuryol
Как поменять иконку курсора в RPG Maker MV

1) Берем картинку в формате PNG с иконкой курсора (например можно скачать здесь )

2) Вставляем в корневую папку игры (там где находится файл index.html)

3) заходим в файл index.html через редактор кода или например блокнот, внутри тега "<head>" вставляем строчку:
Code:
<style type="text/css"> CANVAS{cursor: crosshair; cursor: url(/name.png) 53 53, crosshair;}</style>

где name - имя файла нашей иконки, без кавычек.

получится что-то типа
Code:
<head> <meta charset="UTF-8"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="viewport" content="user-scalable=no"> <link rel="icon" href="icon/icon.png" type="image/png"> <link rel="apple-touch-icon" href="icon/icon.png"> <link rel="stylesheet" type="text/css" href="fonts/gamefont.css"> <style type="text/css"> CANVAS{cursor: crosshair; cursor: url(1.png) 53 53, crosshair;}</style> <title>Отвязанный проект</title> </head>

4) Радуемся! Теперь при наводке курсора в окно игры он меняется на закачанную нами картинку
Последнее редактирование: 7 года 1 день назад пользователем yuryol.
Спасибо сказали: PanzerCat, SeaWolf, Noxmils, Okorok.S

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 11 мес. назад #111991 от yuryol
Запись текста в файл

Вместо 'Hello, mukerist!' пишем текст который нам нужен (в кавычках)
Вместо '1.txt' пишем любое название файла,а затем через точку тип файла. В данном случае файл называет "1", и это текстовый файл. Файл будет находиться в корне игры
Code:
const name = '1.txt'; let text = 'Hello, mukerist!'; const fs = require('fs'); fs.appendFile(name, text, function(err) { if (err) throw err; });

Зачем оно надо?

Например, для тестирования можно записать в файл значения всех переменных
Code:
const name = '1.txt'; let text; const fs = require('fs'); $gameVariables._data.forEach(function(num, i, nums) { text = `переменная ${i} = ${num}\n`; fs.appendFile(name, text, function(err) { if (err) throw err; }); });

Чтение из текстового файла
Code:
const name = '1.txt'; const xhr = new XMLHttpRequest(); let content; xhr.open("GET", name, false); xhr.send(null); content = xhr.responseText;

Затем можно например записать текст в переменную путем добавления в конце строчки
Code:
$gameVariables.setValue(1, content);

Зачем оно надо?

Можно, например, легко вставлять длинные тексты в игру, например отрывки из книг, записав в текст в переменную а потом написав "\V[1]" в сообщении мейкер

Интересно, что мейкер сам разобьет длинный текст на несколько сообщений а не будет обрезать и оставлять только первые строки, как это делает редактор
Спасибо сказали: Lekste, DK, VarVarKa, WhitePaper, PringOva, Okorok.S, nirion

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 11 мес. назад #111996 от yuryol
Логирование

Для теста своей АБС набросал простенькое логирование.

В try вставляем код своего плагина и при ошибке будет создан файл 'error.log', в котором будет ее описание с датой и временем. Время ставится отдельно для каждой ошибки, а дата - один раз в день.

На днях добавлю также отображение нужных переменных, переключателей, нужных мне свойств событий.

Вот так выглядит записи в логе (скрин из IDE Visual studio code):




Сам код:
Code:
try{ //ваш код } catch (err) { const name = 'error.log'; const fs = require('fs'); const data = new Date().toLocaleDateString(); const time = new Date().toLocaleTimeString(); let text; let content; const xhr = new XMLHttpRequest(); xhr.open("GET", name, false); try { xhr.send(null); } catch (err) { console.log(err); }; content = xhr.responseText; text = (!content || content && !content.includes(data)) ? `\n${data}\n ` : ''; text = `${text} \n ${time} \n ${err.stack} \n`; fs.appendFile(name, text, function(err) { if (err) throw err; }); }
Спасибо сказали: DK

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
6 года 11 мес. назад - 6 года 11 мес. назад #111998 от DK

yuryol пишет: Логирование

Для теста своей АБС набросал простенькое логирование.

В try вставляем код своего плагина и при ошибке будет создан файл 'error.log', в котором будет ее описание с датой и временем. Время ставится отдельно для каждой ошибки, а дата - один раз в день.

На днях добавлю также отображение нужных переменных, переключателей, нужных мне свойств событий.

Вот так выглядит записи в логе (скрин из IDE Visual studio code):




Сам код:
Code:
try{ //ваш код } catch (err) { const name = 'error.log'; const fs = require('fs'); const data = new Date().toLocaleDateString(); const time = new Date().toLocaleTimeString(); let text; let content; const xhr = new XMLHttpRequest(); xhr.open("GET", name, false); try { xhr.send(null); } catch (err) { console.log(err); }; content = xhr.responseText; text = (!content || content && !content.includes(data)) ? `\n${data}\n ` : ''; text = `${text} \n ${time} \n ${err.stack} \n`; fs.appendFile(name, text, function(err) { if (err) throw err; }); }


у тебя на скрине 2 даты...

Предлагаю не маяться с try catch, а переопределить SceneManager.onError, как я сделал в DKTools:
Code:
const DKTools_SceneManager_onError = SceneManager.onError; SceneManager.onError = function(error) { DKTools_SceneManager_onError.call(this, error); DKTools.Utils.logError(error); };

Еще уточни, что запись в файл работает только на ПК.
Последнее редактирование: 6 года 11 мес. назад пользователем DK.
Спасибо сказали: yuryol, Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 11 мес. назад #112006 от yuryol

DK пишет: у тебя на скрине 2 даты...

Предлагаю не маяться с try catch, а переопределить SceneManager.onError, как я сделал в DKTools:

Code:
const DKTools_SceneManager_onError = SceneManager.onError; SceneManager.onError = function(error) { DKTools_SceneManager_onError.call(this, error); DKTools.Utils.logError(error); };

Еще уточни, что запись в файл работает только на ПК.


про даты - точно,старый скрин вставил. потом исправил,все работает :laugh:

за SceneManager.onError спасибо! поизучаю, пока не знаю чем лучше

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 8 мес. назад - 6 года 8 мес. назад #113250 от yuryol
Базовое, но с появлением ES6 некоторым незнакомое решение задачки сложения массивов:

Сложение двух массивов:

1 способ - используем метод concat:
Code:
Arr1=Arr1.concat(Arr2)
2 способ - используем оператор spread (…):
Code:
Arr1 = [...Arr1, ...Arr2]
3 способ - используем метод push:
Code:
Arr1.push(...Arr2)

Сложение двух массивов с удалением дубликатов:

1 способ - используем методы concat, filter и indexOf:
Code:
Arr1 = Arr1.concat(Arr2.filter(function(el) {return Arr1.indexOf(el) === -1;}))
2 способ - то же самое но стрелочной функцией
Code:
Arr1.concat(Arr2.filter((el) => Arr1.indexOf(el)<0))
3 способ - используем методы concat, filter и includes:
Code:
Arr1 = Arr1.concat(Arr2.filter((el) => !Arr1.includes(el)))
4 способ - используем оператор spread (…) и Set объект:
Code:
Arr1=[...new Set([...Arr1 ,...Arr2])]
5 способ - используем метод concat, оператор spread (…) и Set объект:
Code:
Arr1 = [...new Set(Arr1.concat(Arr2))]
Последнее редактирование: 6 года 8 мес. назад пользователем yuryol.
Спасибо сказали: Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
6 года 8 мес. назад #113253 от DK
1 способ - используем методы concat, filter и indexOf:
А почему не через includes ?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 8 мес. назад #113259 от yuryol

DK пишет: 1 способ - используем методы concat, filter и indexOf:
А почему не через includes ?


да вообще добавлять не хотел,громоздко. хотя если со стрелочками то в принципе норм. добавил
Code:
Arr1 = Arr1.concat(Arr2.filter((el) => !Arr1.includes(el))) Arr1.concat(Arr2.filter((el) => Arr1.indexOf(el)<0))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 7 мес. назад #113757 от yuryol
Если плагин большой, то постоянно мотать его вверх-вниз неудобно. Поэтому рано или поздно встает вопрос раскидать каждый класс плагина на разные файлы.

Во время разработки я пользовался пакетом Gulp, но на выходе получал все же один файл. Поэтому когда решил раскидать свой плагин боёвки на несколько файлов, чтобы пользователь мог выбирать - нужны ли ему разрушаемость тайлов, сложный худ-бар, собственное меню для АБС или пиксельное движение, то решил что все же лучше сделать плагин модульным не только на входе но и на выходе.

Export и import которые я использовал при создании приложений и сайтов, как оказалось, реализованы в браузерах не так как хотелось бы, поэтому вот небольшая

функция для подключения в плагин других файлов:

Сама функция:
Code:
function include(path) { var script = document.createElement("script"); script.type = "module"; script.src = path; document.body.appendChild(script); }

Подключения файла YuryolTest.js при помощи нее
Code:
include("/js/plugins/YuryolTest.js");
Спасибо сказали: Noxmils

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Программист Ruby Ветеран Даритель Стимкея Оратор Программист JavaScript
Больше
6 года 7 мес. назад - 6 года 7 мес. назад #113759 от Lekste
Неплохо. Как dll какие-то :)
Главное, чтоб у них не было общих глобальных переменных
Последнее редактирование: 6 года 7 мес. назад пользователем Lekste.
Спасибо сказали: yuryol

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 7 мес. назад #113760 от yuryol

Lekste пишет: Неплохо. Как dll какие-то :)
Главное, чтоб у них не было общих глобальных переменных


спасибо!
ага, я в каждом из подобных файлов создаю класс с названием как у файла и вызываю его, чтобы этого избежать =З
типа:
Code:
class YuryolAudio { soundShot(se) { if (se) AudioManager.playSe({name: se, volume: 10, pitch: 100, pan: 0}); } } let yuryolAudio = new YuryolAudio();

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Разработчик Программист JavaScript Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место Учитель Оратор Ветеран Даритель Стимкея 2 место Программист Ruby Паладин
Больше
6 года 7 мес. назад #113761 от DK
А почему этот класс не сделать статическим?
Спасибо сказали: Lekste

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Оратор 1 место в Готв 3 место Готв 2 место Учитель Композитор Победитель конкурса Организатор конкурсов
Больше
6 года 7 мес. назад #113763 от yuryol

DK пишет: А почему этот класс не сделать статическим?


а разве в жс можно делать классы статическими?
если ты про методы, то да, некоторые методы класса делаю статическими.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.180 секунд
Работает на Kunena форум