Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Популярная настольная игра

Длинные Нарды Турнир

Настольные, Мидкорные, Для двоих

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

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

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
5
Olek.Olegovich
Olek.Olegovich
Лига Разработчиков Видеоигр
Серия RPG Maker

RPG Maker MV/MZ - Как можно в переменную взять игровое время (время, проведённое в игре) с последнего сохранения?⁠⁠

4 месяца назад

Это можно сделать с помощью команды Выполнить скрипт в событии. Ниже скрипт для MZ с комментариями.

// Для красоты вынес перевод строки времени в кол-во секунд в отдельную функцию.

function convertStringToSeconds(time) {

const array = time.split(":");

return (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10)

}

// Устанавливаем номер переменной, в которую хотим записать значение.

const varId = 1;

// Фиксируем текущее игровое время.

const currentSeconds = $gameSystem.playtime();

// Проверяем, есть ли сохранения.

if (!DataManager.isAnySavefileExists()) {

$gameVariables.setValue(varId, currentSeconds);

} else {

// Определяем индекс последнего сохранения.

const lastSaveFileId = DataManager.latestSavefileId();

// Получаем данные об этом сохранении (нам даже не нужно грузить всё сохранение).

const saveInfo = DataManager._globalInfo[lastSaveFileId];

// Вычисляем, сколько секунд игры было в последнем сохранении.

const lastSeconds = convertStringToSeconds(saveInfo.playtime);

// Вычисляем разницу.

const deltaSeconds = currentSeconds - lastSeconds;

// Записываем в переменную.

$gameVariables.setValue(varId, deltaSeconds);

}

Учтите, что так мы можем получить отрицательное число. К примеру, если поиграем час, запишем сохранение, а потом начнём новую игру, текущее игровое время будет меньше времени в последнем сохранении.

Версия для MV:

function convertStringToSeconds(time) { const array = time.split(":"); return (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10) }

const varId = 1; const currentSeconds = $gameSystem.playtime();

if (!DataManager.isAnySavefileExists()) { $gameVariables.setValue(varId, currentSeconds); }

else {

const lastSaveFileId = DataManager.latestSavefileId();

const saveInfo = DataManager.loadGlobalInfo()[lastSaveFileId];

const lastSeconds = convertStringToSeconds(saveInfo.playtime);

const deltaSeconds = currentSeconds - lastSeconds;

$gameVariables.setValue(varId, deltaSeconds);

}

Если нужны какие-то данные, которых нет в информации о сохранении, придётся грузить файл сохранения. Это можно сделать так:

// Устанавливаем номер переменной, в которую хотим записать значение.

const varId = 1;

// Проверяем, есть ли сохранения.

if (!DataManager.isAnySavefileExists()) {

$gameVariables.setValue(varId, 0);

} else {

// Определяем индекс последнего сохранения.

const lastSaveFileId = DataManager.latestSavefileId();

// Получаем имя файла этого сохранения.

const saveName = DataManager.makeSavename(lastSaveFileId);

// Загружаем данные из файла.

StorageManager.loadObject(saveName).then(contents => {

// Данные в contents. Обрабатываем их, как нужно.

return 0;

});

}

На смежные и схожие вопросы могу ответить в этом треде.

Показать полностью
[моё] Разработка Gamedev Программирование Javascript RPG Maker Rpg maker mv Плагин Текст Урок Статья Обучение Гайд
0
3
Olek.Olegovich
Olek.Olegovich
Лига Разработчиков Видеоигр
Серия RPG Maker

RPG Maker MV/MZ - Добавление языковых локализаций в завершённый проект⁠⁠

4 месяца назад

Вступление

Я разработал плагин для языковых локализаций, здесь описание поподробнее. Постепенно буду добавлять в него функционал. Если вам нужна какая-то конкретная функция, напишите идею в теме плагина. Также обращу внимание, что в плагине есть функционал по экспорту языковых данных в Excel-таблицу и импорту из неё.

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

Тем не менее, иногда может потребоваться внедрить локализации в уже готовую игру.

Как-то раз я выполнил такой заказ для игры на RPG Maker MV. Вероятно, решение прокатит и на MZ. Если не сработает, напишите в этой теме.

Задача

  1. Экспортировать текст из игры в JSON.

  2. Сконвертировать JSON в XLSX и отправить получившуюся таблицу переводчику.

  3. Дождаться готового перевода в XLSX формате.

  4. Конвертировать новую таблицу в JSON и внедрить новый язык в проект.

Формат JSON поддерживает произвольную структуру данных. Объекты, массивы, любой уровень вложенности. При этом переводчик с JSON работать не хотел, нужно было ему обеспечить таблицу. Поэтому я решил для хранения данных локализации использовать один JSON-файл с плоским объектом. То есть был только один объект в корне файла, и каждое его свойство было текстовым. Никаких вложенных объектов.

Инструкция

  • Сначала нужно экспортировать текст из проекта. Я написал скрипт, который находит все диалоги (команда "Показать сообщение"), извлекает из них текст и сразу генерирует JSON-файл с нужной структурой. Вот он.

  • Этот скрипт написан на JS. Чтобы его исполнить, можно установить Node.js и запустить скрипт командой node export-localization.js

  • Можно также переписать скрипт на python, bash или другой язык и исполнить удобными вам инструментами. В принципе, скрипт несложный (даже примитивный).

  • В результате мы получим файл с таким содержимым:

{

"<тег>": "<реплика>"

}

  • Теперь забиваем в поисковик: "json to xlsx". Берём любой понравившийся сервис. Например, этот.

  • Скорее всего, мы получим таблицу с 2 строками и большим количеством столбцов. Переводчику будет неудобно работать с такой. Он ожидает 2 столбца: в одном теги, в другой - текст, который нужно перевести (переводчик либо будет редактировать этот столбец, либо добавит новый).

  • Если у вас получилось так, то просто транспонируйте получившуюся таблицу. Это можно сделать и в Esxcel, и в LibreOffice, и в Google Sheets. Не знаете, как? Поищите в интернете, это несложно (конкретная кнопка зависит от инструмента, поэтому тут не пишу, но она точно есть).

  • Отправляем таблицу переводчику, ждём перевода.

  • Теперь новый XLSX нужно конвертировать в JSON. Сначала транспонируем таблицу, чтобы у нас было 2 строки и множество столбцов.

  • Вбиваем в поисковик: "xlsx to json". Опять берём любой подходящий сервис, вроде этого. Конвертируем, получаем новый json-файл.

  • Переименовываем новый JSON-файл, как нам нужно ("en.json", "ru.json" и т.д.).

  • Вставляем в проект, добавляем язык в параметры плагина локализации (здесь конкретные действия зависят от используемого плагина).

Заключение

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

Самое ценное в этой статье - скрипт на экспорт текста, обратите на него внимание. У DK есть инструмент, который извлекает весь текст из игры, но он не генерирует JSON-файл с нужной структурой и уникальными тегами (очень важно, чтобы теги были уникальными).

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

Показать полностью
[моё] Разработка Gamedev Программирование Javascript RPG Maker Плагин Текст Урок Статья Обучение Гайд Rpg maker mv
0
3
Olek.Olegovich
Olek.Olegovich
Лига Разработчиков Видеоигр
Серия RPG Maker

RPG Maker MV/MZ - Обработка нажатий на клавиатуру и мышь⁠⁠

4 месяца назад

Предисловие

Иногда при разработке механик или мини-игр хочется нестандартно обрабатывать нажатия на клавиши клавиатуры или мыши. Например, совершать игровое действие по нажатию на произвольную клавишу (стрельба, прыжок, лечение), управлять интерфейсом (открывать игровую карту, ещё какое-то меню) и много что ещё.

Существует несколько способов это делать.

Способ 0

Возможно, вам достаточно будет назначить стандартные действие на нестандартные клавиши. Например, сделать ходьбу по WASD. Для подобного достаточно расширить словарь Input.keyMapper, об этом подробнее в другом гайде.

Способ 1

Небольшая справка: событие - это сообщение, которое возникает при выполнении определённых условий. Например, если пользователь пошевелил мышь или тыкнул по клавише - в системе происходит соответствующее событие.

С помощью функции document.addEventListener(<событие, <функция>) можно назначить функции-обработчики на различные события.

Можно обрабатывать нажатие на клавишу:

document.addEventListener("keydown", keyDownHandler);

function keyDownHandler(event) {

if (Input.keyMapper[event.keyCode] == "ok") {

// Ваш код

}

};

"keydown" - это название события нажатия на клавишу клавиатуры. Внутри функции обработчика мы проверяем, не помечена ли нажатая клавиша, как "ok" в Input.keyMapper.

Однако мы можем действовать свободнее и сверять напрямую с числовым кодом клавиши:

document.addEventListener("keydown", keyDownHandler);

function keyDownHandler(event) {

// 70 - это код клавиши F

if (event.keyCode == 70) {

// Ваш код

}

};

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

// Нажатие на клавишу клавиатуры:

document.addEventListener("keydown", keyDownHandler);

// Нажатие на клавишу мыши:

document.addEventListener("click", mouseClickHandler);

// Двойное нажатие на клавишу мыши:

document.addEventListener("dblclick", mouseDoubleClickHandler);

// Игрок пошевелил мышкой:

document.addEventListener("mousemove", keyDownHandler);

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

document.body.addEventListener("mousedown", event => {

if (event.button == 0) {

// Нажата левая кнопка

}

else if (event.button == 2) {

// Правая кнопка

}

else {

// Другая кнопка

}

}

Способ 2

В коде движка есть функции, которые обрабатывают нажатия на клавиши мыши (сюда же относится обработка сенсорного интерфейса).

Во-первых, в rmmz_core.js можно найти функции, которые делают примерно то, о чём я писал выше:

TouchInput._setupEventHandlers = function() {

const pf = { passive: false };

document.addEventListener("mousedown", this._onMouseDown.bind(this));

document.addEventListener("mousemove", this._onMouseMove.bind(this));

document.addEventListener("mouseup", this._onMouseUp.bind(this));

document.addEventListener("wheel", this._onWheel.bind(this), pf);

document.addEventListener("touchstart", this._onTouchStart.bind(this), pf);

document.addEventListener("touchmove", this._onTouchMove.bind(this), pf);

document.addEventListener("touchend", this._onTouchEnd.bind(this));

document.addEventListener("touchcancel", this._onTouchCancel.bind(this));

window.addEventListener("blur", this._onLostFocus.bind(this));

};

TouchInput._onMouseDown = function(event) {

if (event.button === 0) {

this._onLeftButtonDown(event);

} else if (event.button === 1) {

this._onMiddleButtonDown(event);

} else if (event.button === 2) {

this._onRightButtonDown(event);

}

};

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

const Origin_TouchInput_onCancel = TouchInput._onCancel;

TouchInput._onCancel = function(x, y) {

// Ваш код

Origin_TouchInput_onCancel.apply(this, [x, y])

};

Сначала вы выполняем код, после (что важно!) вызываем оригинальный метод. Можно ваш код выполнять после кода движка. Но обязательно вызывайте Origin_TouchInput_onCancel, иначе стандартная обработка нажатия движком не выполнится.

Ещё момент. Напрямую это не относится к тему, но может быть полезно.

$gameTemp.reserveCommonEvent(N);

С помощью этой функции можно вызвать общее событие. N - номер события в Базе данных проекта. К примеру, вы можете по нажатию на какую-то клавишу вызывать общее событие, где и описана ваша уникальная игровая логика.

Вот здесь демо-проект с реализацией такой идеи.

После запуска новой игры попробуйте нажать на F и ПКМ мыши.

Буду дополнять этот гайд по необходимости, пишите ваши предложения и замечания.

Каталог моих бесплатных плагинов для RPG Maker

Показать полностью
[моё] Разработка Gamedev Программирование Javascript RPG Maker Rpg maker mv Плагин Текст Урок Статья Обучение Гайд Длиннопост
0
9
Olek.Olegovich
Olek.Olegovich
Лига Разработчиков Видеоигр
Серия RPG Maker

RPG Maker MV/MZ - Управление по WASD⁠⁠

4 месяца назад

Добавить поддержку клавиш W, A, S, D клавиатуры легко в MV и MZ.

Для этого достаточно добавить в проект такой код:

(function () {

var replacedKeyMapper = {

87: 'up',

65: 'left',

83: 'down',

68: 'right',

69: 'pagedown',

};

for (code in replacedKeyMapper) {

Input.keyMapper[code] = replacedKeyMapper[code];

}

})();

Здесь мы также "перекинули" стандартный функционал клавиши W на E.

Вы можете скачать файл тут и добавить его в проект, как плагин.

У каждой клавиши есть числовой код. Представим, что в движке они помечаются маркерами. Например, стрелка вверх помечена маркером 'up'. Если игрок нажимает на эту стрелку, движок видит срабатывание маркера 'up' и обрабатывает это событие.

Маркеры задаются через словарь. Эта структура данных состоит из пар ключ-значение. Здесь ключ - числовой код клавиши, а значение - маркер. Все ключи уникальные, они не могут повторятся. Значения - могут.

Таким образом, несколько клавиш могут быть помечены одинаковым маркером. Это позволяет нам одновременно поддерживать движение как по стрелкам, так и по WASD.

При желании, вы можете добавлять свои пары ключ-значение в объект replacedKeyMapper из кода выше.

Вот код из файла движка rmmz_core.js:

Input.keyMapper = {

9: "tab", // tab

13: "ok", // enter

16: "shift", // shift

17: "control", // control

18: "control", // alt

27: "escape", // escape

32: "ok", // space

33: "pageup", // pageup

34: "pagedown", // pagedown

37: "left", // left arrow

38: "up", // up arrow

39: "right", // right arrow

40: "down", // down arrow

45: "escape", // insert

81: "pageup", // Q

87: "pagedown", // W

88: "escape", // X

90: "ok", // Z

96: "escape", // numpad 0

98: "down", // numpad 2

100: "left", // numpad 4

102: "right", // numpad 6

104: "up", // numpad 8

120: "debug" // F9

};

Здесь вы можете увидеть все доступные по умолчанию маркеры. Это полезно знать, если вы хотите добавить какой-то клавише маркер.

Есть аналогичный словарь для геймпада:

Input.gamepadMapper = {

0: "ok", // A

1: "cancel", // B

2: "shift", // X

3: "menu", // Y

4: "pageup", // LB

5: "pagedown", // RB

12: "up", // D-pad up

13: "down", // D-pad down

14: "left", // D-pad left

15: "right" // D-pad right

};

Можно также создать обработчик нажатий на клавиатуру и там смотреть на непосредственно код нажатой клавиши. Полезно, если у движка нет подходящего стандартного маркера. Но это уже для продвинутых пользователей ;) Пишите, если нужен гайд по этому.

Коды клавиш легко находятся в интернете. Можно смотреть их, к примеру, тут. Нужны DEC-коды (то есть десятичные).

Ещё важный совет. Не меняйте код движка, не редактируйте стандартные файлы. Мало того, что это запрещено правообладателем, это также неудобно и небезопасно. Что, если вы ошибётесь или захотите откатить изменения? JavaScript позволяет переопределять всё, что удобно. Поэтому для изменения кода движка используйте плагины.

Пишите ваши вопросы в этом треде, если остались.

Каталог моих бесплатных плагинов для RPG Maker

Показать полностью
[моё] Разработка Gamedev Программирование Javascript RPG Maker Rpg maker mv Плагин Текст Урок Статья Обучение Гайд
2
1
tablepedia
Лига программистов
Серия Визуализация данных

Графики самых больших городов в мире (1950-2025)⁠⁠

4 месяца назад

Уважаемые пикабушники!

Я создал микросайт с графиками населения крупнейших городов в мире (1950-2025).

Показываю ПОШАГОВОЕ использование:

1. Зайти на https://tablepedia.com/cities2025/

Кстати, весь микросайт в архиве ZIP занимает 14 килобайт и его можно скачать по адресу: https://tablepedia.com/cities2025.zip

Если вы немного пролистнёте сайт вниз, вы увидите таблицу, а пониже неё - графики населения Токио, Дели, Шанхая и Сан-Паулу:

Рис. 1. Графики населения Токио, Дели, Шанхая и Сан-Паулу (1950-2025).

Рис. 1. Графики населения Токио, Дели, Шанхая и Сан-Паулу (1950-2025).

2. Вы можете изменить года, вот один из результатов:

Рис. 2. Графики населения городов с изменёнными годами.

Рис. 2. Графики населения городов с изменёнными годами.

3. В нижней части сайта вы видите графики Мехико, Каира, Мумбаи и Пекина:

Рис. 3. Графики населения Мехико, Каира, Мумбаи и Пекина.

Рис. 3. Графики населения Мехико, Каира, Мумбаи и Пекина.

Думаю, очевидно, что можно менять не только года, но и города, которые показаны на графике.

Если интересно, можете посмотреть этот сайт на GitHub: https://github.com/yaroslav1982/tablepedia-microsite-cities2025

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

Если есть вопросы, напишите их, пожалуйста, в комментариях.

Показать полностью 3
[моё] Сайт IT Программа Javascript Svg Визуализация Визуализация данных Криптовалюта Валюта Золото Население Токио Пекин Дели Шанхай Мехико Каир Сан-паулу Мумбаи Zip файл
7
7
Olek.Olegovich
Olek.Olegovich
Лига Разработчиков Видеоигр
Серия RPG Maker

Новые фичи в моих плагинах для RPG Maker MZ!⁠⁠

4 месяца назад
Phileas's Input Sub Windows in Message

Phileas's Input Sub Windows in Message

Phileas's Input Sub Windows in Message - 1.1.0: теперь можно ограничить максимальное кол-во отображаемых опций выбора. Подробнее на форуме.

Phileas`s Audio Manager - 1.1.0: добавлены команды для управления плейлистом. Подробнее на форуме.

Здесь вы можете найти каталог всех моих бесплатных плагинов для RPG Maker по категориям.

Показать полностью 1
[моё] RPG Maker Плагин Разработка Программирование Javascript Gamedev
1
2
Olek.Olegovich
Olek.Olegovich
Серия RPG Maker

Разработка на RPG Maker. Приветствие⁠⁠

4 месяца назад

Привет, я Олег, также известен как Phileas.

Scottside

Scottside

На досуге занимаюсь инди-разработкой игр:

  • В Steam опубликовано демо нелинейной визуальной новеллы Scottside, над которой я работал программистом.

  • Остальные опубликованные проекты можно найти тут.

  • Актуальные новости и опросы игроков тут.

  • Поддержать меня можно на Boosty. Также вы можете сделать перевод через СБП по номеру телефона или на карту (данные сообщу в ЛС). Или любым другим удобным вам способом - пишите. Пока не могу включить монетизацию на Пикабу, низкий рейтинг.

1/4

Каталог моих бесплатных плагинов

Мой основной движок - RPG Maker. Для него я разрабатываю плагины. Какие-то для себя, какие-то под заказ, но многие публикую бесплатно для всех на GitHub.

Здесь каталог всех моих бесплатных плагинов по категориям.

Если вам нужен плагин/скрипт для RPG Maker, можете написать мне в Telegram или на почту (olek.olegovich@gmail.com). Если я посчитаю плагин сравнительно простым в реализации и универсальным (т.е. его можно будет вставить в любой проект без модификаций), то я могу опубликовать его бесплатно для всех и попросить вас задонатить комфортную для вас сумму. Если плагин будет сложным, специфичным для вашего проекта или вы сами запросите эксклюзивность, договоримся о заказе.

Перейти к видео

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

Показать полностью 5 1
[моё] Gamedev Разработка Программирование RPG Maker Javascript RPG JRPG Визуальная новелла Плагин Видео Короткие видео Длиннопост Без звука
4
RafGal
RafGal
Лига программистов

Есть простой путь в настоящее программирование, но не в профессиональное⁠⁠

4 месяца назад

Бывают инди-разработчики у которых нет цели работать в профессиональной индустрии. Им не нужно соответствовать стандартам индустрии.

Язык ЖивоСкрипт это визуальный блочный скриптовый язык программирования который транслируется в JS и PHP. Достаточно знать один язык ЖС чтобы писать код для клиента и сервера.

Язык ЖС разработан специально для детей 12+, но его могут использовать взрослые программисты-любители которым нужен простой инструмент.

[моё] Программирование Javascript PHP Визуальное программирование Текст
4
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии