Войти на сайт
×
ТЕМА: Плагиню карту
Плагиню карту 5 года 11 мес. назад #107564
|
Нахожусь в процессе написания маленького плагинца для показа карты местности . Первая версия выложена в качестве д\з к уроку от Юриола, тут вторая версия. Я добавил справку, возможность выбора способа вызова и скрытия карты, и настройку ее прозрачности.
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ][ Нажмите, чтобы скрыть ] //=============================================================================
// LookAtMap v0.2
//=============================================================================
/*:
*@plugindesc При нажатой клавише М показывает карту, если игрок на глобальной карте
*@author Noxmils
*@help ВНИМАНИЕ! Данный плагин затрагивает следующие стандартные функции RPG Maker MV:
Scene_Map.prototype.update, Game_Player.prototype.moveByInput и
Scene_Map.prototype.terminate, а также добавляет новую активную клавишу М (Ь),
используемю для открытия карты.
WorldMaps - Укажите здесь ID всех игровых локаций, для которых будет
открываться карта. Для остальных локаций при нажатии М(Ь) будет выводится
название локации;
Press or hold - Выберите, карта будет показываться и скрываться по нажатию
клавиши М(Ь), или же карта будет видна только при удерживании клавиши;
Opacity - Укажите непрозрачность изображения карты в процентах. Особенно
полезно, если карта видна только при удерживании клавиши, т.к. при таком
типе вывода персонажами по прежнему можно управлять;
BackgroundPicture - Введите название графического файла с расширением png,
в котором хранится изображение для заднего фона карты. Задний фон один для
всех карт. Если карта нарисована в виде контура, то задним фоном может
выступать текстура бумаги, если же карта уже нарисована на текстурах, то
в качестве заднего фона можно выбрать края объекта, на котором изображена
карта, например, рваные края бумаги;
BackgroundX и BackgroundY - Укажите здесь координаты на игровом поле для
заднего фона;
MapPictures - Укажите здесь названия графических файлов с расширением png
с изображениями карт. Для каждой карты требуется отдельный файл. Порядок
перечисления файлов должен соответствовать порядку, в котором были
перечислены ID соответствующих локаций;
Map_X и Map_Y - Перечислите здесь соответствующие координаты в том же
порядке, в котором были перечислены названия графических файлов с картами;
MapWidth и MapHeight - Перечислите здесь ширину и высоту карт в пикселях.
Эти данные Вы можете получить открыв изображение карты в Photoshop, открыв
вкладку Изображение и выбрав пункт Размер холста, или иным методом для
других графических редакторов;
PlayerMarker - Укажите название графического файла с расширением png,
в котором хранится изображение маркера для отметки положения игрока на карте.
Это изображение одно для всех карт и положению игрока соответствует его центр.
*
*@param WorldMaps
*@desc ИД карт мира
*@type number[]
*
*@param Press or hold
*@desc Показ и скрытие карты по нажатию клавиши, или по ее удерживанию и отпусканию
*@default true
*@type boolean
*@on Нажать для показа/скрытия
*@off Удерживать для показа
*
*@param Opacity
*@desc Непрозрачность карты в процентах
*@default 100
*@type number
*
*@param BackgroundPicture
*@desc Название файла с задним фоном для карты
*@default Paper
*@type text
*
*@param BackgroundX
*@desc Положение заднего фона для карты по оси Х
*@default 48
*@type number
*
*@param BackgroundY
*@desc Положение заднего фона для карты по оси У
*@default 48
*@type number
*
*@param MapPictures
*@desc название изображений карт
*@type text[]
*
*@param Map_X
*@desc Положение карт по оси Х
*@type number[]
*
*@param Map_Y
*@desc Положение карт по оси У
*@type number[]
*
*@param MapWidth
*@desc Ширина карт
*@type number[]
*
*@param MapHeight
*@desc Высота карт
*@type number[]
*
*@param PlayerMarker
*@desc Название файла с иконкой маркера игрока
*@default Marker
*@type text
*
*/
(function () {
var WorldMaps = PluginManager.parameters('LookAtMap')['WorldMaps'];
var PoH = PluginManager.parameters('LookAtMap')['Press or hold'];
var Opacity = PluginManager.parameters('LookAtMap')['Opacity'] * 2.55;
var Background = PluginManager.parameters('LookAtMap')['BackgroundPicture'];
var BackgroundX = PluginManager.parameters('LookAtMap')['BackgroundX'];
var BackgroundY = PluginManager.parameters('LookAtMap')['BackgroundY'];
var MapPictures = PluginManager.parameters('LookAtMap')['MapPictures'];
var Place_X = PluginManager.parameters('LookAtMap')['Map_X'];
var Place_Y = PluginManager.parameters('LookAtMap')['Map_Y'];
var MapWidth = PluginManager.parameters('LookAtMap')['MapWidth'];
var MapHeight = PluginManager.parameters('LookAtMap')['MapHeight'];
var PlayerMarker = PluginManager.parameters('LookAtMap')['PlayerMarker'];
Input.keyMapper[77] = 'M'; // M
var MapActive = false;
const MapUpdate = Scene_Map.prototype.update;
if (eval(PoH)) { // В update вместо условия будет одна из двух функций, чтобы не проодилась проверка условия при каждом срабатывании update
Scene_Map.prototype.update = function () {
MapUpdate.call(this);
this.PressMap();
}
} else {
Scene_Map.prototype.update = function () {
MapUpdate.call(this);
this.HoldMap();
}
}
const GamePlayer_moveByInput = Game_Player.prototype.moveByInput;
Scene_Map.prototype.PressMap = function () {
if (Input.isTriggered('M') && !$gameMessage.isBusy() && !MapActive){
this.TryToLook();
if (MapActive) {
Game_Player.prototype.moveByInput = function () {return};
}
} else if (Input.isTriggered('M') && MapActive) {
this.HideMap();
Game_Player.prototype.moveByInput = function (x, y) {
GamePlayer_moveByInput.call(this);
};
}
}
Scene_Map.prototype.HoldMap = function () {
if (Input.isPressed('M') && !$gameMessage.isBusy()){
this.TryToLook();
} else if (MapActive && this.SelectMap() != undefined) {
this.HideMap();
} else if (MapActive && this.SelectMap() == undefined){
$gameMessage.clear();
MapActive = false;
}
}
Scene_Map.prototype.TryToLook = function () {
if (this.SelectMap() != undefined) {
MapActive = true;
$gameScreen.showPicture(1, Background, 0, BackgroundX, BackgroundY, 100, 100, Opacity, 0); // Бэкграунд карты
this.ShowMap();
this.ShowPosition();
} else {
this._mapNameWindow.open();
}
}
Scene_Map.prototype.SelectMap = function () {
var WorldMapsArr = eval(WorldMaps);
for (let i = 0; i < WorldMaps.length; i++) {
if ( WorldMapsArr[i] == $gameMap.mapId()) {
return i;
}
};
return undefined;
}
Scene_Map.prototype.ShowMap = function () {
var MapPicturesArr = eval(MapPictures);
var Place_X_Arr = eval(Place_X);
var Place_Y_Arr = eval(Place_Y);
$gameScreen.showPicture(2, MapPicturesArr[this.SelectMap()], 0, Place_X_Arr[this.SelectMap()], Place_Y_Arr[this.SelectMap()], 100, 100, Opacity, 0);
}
Scene_Map.prototype.HideMap = function () {
for (var j = 1; j < 100; j++) {
$gameScreen.erasePicture(j);
};
MapActive = false;
}
Scene_Map.prototype.ShowPosition = function () {
var MapWidthArr = eval(MapWidth);
var MapHeightArr = eval(MapHeight);
var Place_X_Arr = eval(Place_X);
var Place_Y_Arr = eval(Place_Y);
let PosX = +Place_X_Arr[this.SelectMap()] + ($gamePlayer.x + 0.5) * MapWidthArr[this.SelectMap()] / $gameMap.width();
let PosY = +Place_Y_Arr[this.SelectMap()] + ($gamePlayer.y + 0.5) * MapHeightArr[this.SelectMap()]/ $gameMap.height();
$gameScreen.erasePicture(3);
$gameScreen.showPicture(3, PlayerMarker, 1, PosX, PosY, 100, 100, Opacity, 0);
}
const SceneMap_terminate = Scene_Map.prototype.terminate;
Scene_Map.prototype.terminate = function() { // Для удаления карты, если осществляется перемещение между локациями с открытой картой
SceneMap_terminate.call(this);
if (MapActive) {
this.HideMap();
}
}
})() Буду благодарен за любые комментарии, критику и предложения!!! |
Последнее редактирование: 5 года 11 мес. назад от Noxmils.
Администратор запретил публиковать записи гостям.
|
Плагиню карту 5 года 11 мес. назад #107574
|
В результате обсуждения в чате я сделал выводы, которые здесь и приведу.
Mur рекомендовала использовать выбор файлов вместо ввода названия файла с картинкой, заменив тип параметра плагина с @type text на @type file, и указала на сложность для понимания описания параметров, а также дала ряд советов по правильному выкладыванию плагинов (здесь я их опущу, но на ус намотал, спасибо!). DK подсказал возможность указать папку с графикой: @dir img/system Dmy и DK рекомендовали заменить eval() на JSON.parse(), и предложили применить этот метод при объявлении переменных от параметров плагина, а не внутри функций. DK предоставил для ознакомления код. Спасибо всем большое! И по-прежнему рад буду любой критике и рекомендация |
Последнее редактирование: 5 года 11 мес. назад от Noxmils.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Mur
|
Время создания страницы: 0.204 секунд