[RMMV] Пишем плагин для отображения портретов
С вами опять я (Mur), и мои очумелые ручки вновь не дают мне покоя. Ну и собственно по этой причине я спешу поделиться с вами своим новыми изысканиями.
Изыскивать мы сегодня будем как с помощью нескольких изменений, вывести на экран большие аватарки. На подобии « Message busts » от Galv. Стой лишь разницей, что у него скрипт написан для VX Ace, ну а мы соответственно будем изыскивать для RPG Maker MV.
Для начала общая идея, как я себе это представляю:
В обычном редакторе текстовых диалогов, мы выбираем файл с группой аватаров, выбираем один из них и задаём текст сообщения. Всё как обычно.
Затем, находим место где выводится на экран аватарка. Изменяем скрипт на то что нам нужно, а именно выбрать картинку из папки img\bigfaces\ загрузить её вместо стандартной и вуаля, всё готово. На практике оказалось не всё так просто. Дело в том, что размеры окна (в данном случае с текстом сообщения) жестко задают границы и если попробовать загрузить другую (большую) картинку, то всё что попадает за пределы окна попросту обрезается.
Довольно неожиданно, но мысль не давала мне покоя. Ну хорошо, а что если нам сделать новое своё окошко, убрать к примеру все декорации, и загрузить в него нашу большую картинку. Отличная идея, как мне тогда казалось, но не совсем,… Да, новое большое окно у меня получилось вывести, но тут меня ждало разочарование. Дело в том, что как только новое окно перекрыло часть окна с сообщением, всё что находилось под ним попросту исчезло.
Мдяя,… как говорится, а праздник был близко. Ну что ж, мы не отчаиваемся и самое время перестать маяться дурью и наконец посмотреть, а как же эту проблему решает Galv в своём скрипте? Всё оказалось просто. Скрипт который выводит обычную аватарку убирается, а вместо него с помощью Sprite спокойно отображается картинка поверх всех окошек. Алллилуйя! Вот оно!
Итак идея ясна, осталось только всё сделать.
Начнём мы как и в прошлый раз с описания нашего скрипта. На деталях я останавливаться уже не стану, скажу только что нам понадобится одна переменная в настройках, а именно сколько отступить тексту с левого края. Картинки у нас большие и если оставить настройки по умолчанию, то текст будет накладываться поверх персонажа, что не всегда хорошо читается. Впрочем кто-то может в этом узреть особенность дизайна
Начало нашего скрипта:
Если имя не задано, то просто ничего не делаем.
Как видно из рисунка, «Тест» название нашего проекта «img\bigfaces» это где хранятся наши картинки «Package1» одноимённое название файла с аватарами и дальше собственно от 1 до 8 картинки.
Думаю комментарии тут излишни. Так же как и в первом уроке мы «дублируем» основную функцию системы Window_Base.prototype.close и добавляем после всех основных команд системы, команду удалить наш спрайт с экрана this.removeChild(spr).
Так же как и с предыдущей функцией, мы делаем «дубликат» системной функции Window_Base.prototype.update. После того как отработает система, мы проверяем координату X нашего спрайта, и если она меньше 0, то увеличиваем её на 5 точек. Никаких дополнительных действий для загрузки изображения не требуется, достаточно обновить координату спрайта spr.x и оно сместиться на новое место автоматически.
Стоит обратить внимание, что получившийся у нас плагин это всего лишь маленькая не законченная часть. Вывод аватара используется в совершенно неожиданных местах. И если например при отображении результатов битвы или списка персонажей в меню, это ещё не так фатально выглядит:
то при выборе, например экипировки:
уже выглядит не столь оптимистично.
Понятно, что все эти нюансы ещё стоит учесть. Но минимальную задачу мы на сегодня выполнили. Разобрались как устроен вывод аватарок. Как загрузить свою картинку в спрайт и вывести на экран. И собственно как сделать минимальную анимацию (выезд картинки из-за края экрана).
На этом всё. Всем спасибо за внимание и до новых встреч. В следующий раз думаю мы ещё что-нибудь интересное расковыряем
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- strelokhalfer
-
- Не в сети
- Живу я здесь
-
- Знатный грамотей
- Сообщений: 1640
- Спасибо получено: 1080
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 1597
- Спасибо получено: 1522
vinurd пишет: не совсем понятно, зачем скрипт если можно в меню добавить картинку и разместить где надо.
И будет выглядеть это как-то так:
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
vinurd пишет: не совсем понятно, зачем скрипт
А для чего вообще нужны уроки?
vinurd пишет: если можно в меню добавить картинку и разместить где надо.
Ну и действительно, сначала попробуй. Затем получишь результат как у Демий
и в дополнение ещё текст который будет залазить на аватарки
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Code:}.bind(bitmap));
Заканчивается загрузка картинки такой вот странной конструкцией. С радостью послушаю EvilCat для чего оно нужно
У меня тоже в своё время манипуляции с bind попили много крови... Это связано с интересной и вообще-то очень удобной особенностью Яваскрипта, которая просто оказывается неожиданной для новичков (я начала изучать Яваскрипт прошлым летом). Когда происходит вызов метода, скажем, a.b(arg1, arg2), то будет ли в этом методе this (контекстный объект) и каким он будет? Вы скажете - это будет объект a, которому принадлежит метод. И будете правы наполовину. Это действительно будет объект a, но потому, что он стоит слева от точки.
Если мы сделаем так:
То this в методе будет пустым! Потому что он вызывается не через точку, и слева от точки, следовательно, ничего нет. А если мы сделаем так:
В этот раз в this будет объект callbacks, хотя метод как будто бы отобрали у объекта a и он скорее всего предназначен работать с его данными и товарищами по объекту.
Этот эффект называется "потеря this" или "потеря контекста". Казалось бы, нафиг такое в языке? Особенно в языке, одно из основных действий которого - это передача функции как аргумента, например, когда инициируешь загрузку файла и подписываешь вызов метода на момент, когда загрузка будет завершена. Методы и функции, передаваемые таким образом, называются callback 'ами.
Эта фишка была рассчитана на то, что в Яваскрипте можно конструировать любой объект на лету, не прибегая к классам и даже прототипам. Соответственно, ты можешь любому объекту приделать одну и ту же функцию: obj1.some_method=obj2.some_method=function() { alert('Я '+this.constructor.name); } - и получить вразумительный ответ "Я Object", "Я Sprite" и так далее, опрашивая их с помощью obj1.some_method(), obj2.some_method(). В плагинах вы увидите задание метода через присваивание фукнции повсюду. Однако в Руби и ряде других языков для это реализуется через специальные подходы: в Руби , в PHP ... а то и вовсе не реализовано.
Итак, в Яваскрипте все функции не привязаны к объектам и содержание this определяется при вызове... Но что тогда делать с потерей контекста? Раньше прибегали к хитростям, которые теперь интересны только любителям истории, но как-то раз авторы библиотеки Prototype.js (раньше вообще было много библиотек, добавляющих в Яваскрипт недостающие возможности, отсюда его дурная слава как неполноценного языка) изобрели метод bind. Теперь метод bind есть в стандарте Яваскрипта.
Метод bind есть у любой функции. Он создаёт вызов, у которого уже прописано this и, если надо, аргументы!
Например:
В результате будет вызван искомый метод, и в this у него будет объект obj, а в аргументах - 'meow' и 'woof' (именно в таком порядке). В качестве callback'а почти всегда передаётся результат bind(this), если только функция не предельно простая.
Подробнее о bind .
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Спасибо огромное за разъяснение. Хотя конечно что было понять придётся перечитать твой ответ и ещё не раз.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
EvilCat пишет: В двух словах: когда передаёте метод, имеющий this в теле своего кода (а не вызываете его через точку у родного объекта), то добавляйте в конце .bind(obj), где obj - объект-"владелец", иначе this внутри метода будет непредсказуемым.
Если я правильно тебя понимаю, можно написать было:
Тогда получается внутри у нас this будет указывать на bitmap, а в face будет то что было в this до вызова? Или так нельзя?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
AnnTenna пишет: ух ты, круто! Но перенесла тему в раздел Академии и переименовала более информативно, а то будет потом сложно найти, если в заголовке не отражена суть плагина, а только его номер
Хорошо, буду более информативно называть темы
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
А вообще, думаю, что лучше всей подойдет в раздел Академии на факультете Скриптов
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
AnnTenna пишет: Спасибо! Здорово, что еще будут подобные уроки. Кстати, можно номеровать, как Урок1 урок2 , чтоб оставить эту нумерацию.
Ну уроки это ты уж слишком круто взяла
AnnTenna пишет: А вообще, думаю, что лучше всей подойдет в раздел Академии на факультете Скриптов
Хорошо, буду знать.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Mur пишет: Тогда получается внутри у нас this будет указывать на bitmap, а в face будет то что было в this до вызова?
Абсолютно верно.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
EvilCat пишет: Абсолютно верно.
Суууууупер!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Для того, что бы большие аватарки показывались только в сообщениях, собственно и нужно «трогать» только функцию сообщений, а не вообще всех аватарок.
Поэтому вместо кусочка:
Перед «if (faceName != '') {» надо написать:
Вот теперь будут заменяться аватарки только в сообщениях.
Исправленная версия ниже:
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Вопрос такой - как сделать аватарку за текстовым сообщением (оно не на весь экран)?
И как задать ей положение на экране (допустим по х и по у я хочу сделать отступы 5 пикселей)
Спасибо за скрипт и урок!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- BlackLevel
-
- Не в сети
- Бывалый
-
- Сообщений: 63
- Спасибо получено: 24
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
BlackLevel пишет: Ну это можно и прямо в диалогах сделать , с помощью изображений . Но ... ГДЕ ты достала такие классные изображения то ?!
это ДЛС Cover Art Characters которое шло по пред заказу MV, теперь его можно купить store.steampowered.com/app/403870/RPG_Ma...Art_Characters_Pack/
ну или же найти тут где ни будь в разделе графика, возможно в общем облаке графики на майле
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
ReyKa пишет: Вопрос такой - как сделать аватарку за текстовым сообщением (оно не на весь экран)?
Ну оно как бы и так за «текстовым сообщением», или имеется в виду за оформлением окна?
ReyKa пишет: И как задать ей положение на экране (допустим по х и по у я хочу сделать отступы 5 пикселей)
Для этого нужно немного доработать скрипт. По хорошему конечно бы эти параметры нужно вынести в секцию настроек, но в качестве урока пока можно оставить и так.
Создадим две переменные pX и pY, сразу после:
Значение pX будет указывать, что мы хотим выводить аватарку со смещением по оси X (и в данном случае это будет на 155 точек левее), а значение pY соответственно будет указывать смещение по оси Y и будет равняться 50.
Теперь нужно поменять пару строк в блоке Window_Message.prototype.drawMessageFace:
Заменим:
А в фунции Window_Base.prototype.update, заменим условие проверки:
А так же, чуть ниже, окончательно положение аватарки:
Вот собственно и всё. Получается вот такая вот картинка:
Ну и в архиве готовый (доработанный) вариант.
ReyKa пишет: Спасибо за скрипт и урок!
Всегда пожалуйста.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
