- Сообщений: 277
- Спасибо получено: 247
Модификация скрипта HUD-а
rpg-maker.info/forum/649-uluchshajushhie...krane-mini-pak-vxace
Взял оттуда доработанный HUD из скрипта боёвки R.E. Weapons System и модифицировал его:
Переименовал функции, переписал подсказки под более короткие и ёмкие, убрал показ здоровья и хотел сделать так, что бы скрипт вызывался методом qhud_start(setvar,setmaxvar,color1,color2), где
setvar - переменная для вывода
setmaxvar - максимальное значение переменной
color1,color2 - цвета для вывода полоски.
Однако застопорился, и прошу помощи в модификации, при попутном разъяснении моих ошибок.
P.S. Правильно ли я понял, что, в отличии от С++ в Руби переменная может выступать и в качестве функции? Просто я вот сейчас вчитался в описание attr_accessor и def...end и заметил, что результаты, в случае вывода значения, не имеют отличий.
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
1. Алиасы в Scene_Map таки надо вернуть, а конкретно для update и terminate. В первом мы будет проводить проверку на то создан ли ХУДыч. А во втором ХУДыч таки надо ликвидировать вместе с уничтожаемым Scene_Map. Конкретно зачем – не знаю, но очень советуют в мейкере уничтожать все, что не нужно. На крайняк, если мы захотим ликвидировать только ХУД, то свой qhud_terminate оставляй (но удали его повторный вызов), а в алиасном terminate вызывай эту же терминацию ХУДа.
2. Скорее всего, чтобы создать тебе ХУД с указываемыми параметрами - тебе нужно их передать непосредственно при создании экземпляра класса, а в initialize нашего QHud все это принимать и сохранять локально, после чего все это позовем в refresh.
3. Самое проблемное – это то, что переданные переменные не будут обновляться при refresh, а постостоянно будут статичны. Дело в том, что ты в qhud_start передаешь не ссылки, а значения. Таким макаром у тебя постоянно будет ХУД висеть с одним и тем же значением. Как это исправить в мейкере? Легко – юзай игровую переменную как в оригинале и с каждым refresh извлекай из нее значение для текущего и максимального значения.
Если кодом, то я попытался это сделать так:
Вызываю через SceneManager.scene.qhud_start(21,22,Color.new(255,0,0),Color.new(255,255,0))
Но весь этот код полная туфта, так как ХУД удаляется при любой смене сцены. То есть если мы выйдем, к примеру, в меню, то наш ХУД уверенно исчезнет и придется его перевызывать вручную. Так что, думаю, где-то нужно хранить настройки нашего ХУДа постоянно, к примеру - в глобалке $game_map.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Жуть болотная, на лапках, в тапках и с пулемётом...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Я ещё буду перепиливать этот скрипт, к примеру, я тут подумал, что легче не писать каждый раз при вызове Color.new, а передавать при вызове по три кода цвета, а в самом скрипте при инициализации создавать две переменные цвета. Маленькая оптимизация 
С пропажей худа при выходе в меню ещё надо разобраться... Думаю, надо описать или наследовать update и refresh.
Cerberus, спасибо за совет, при переделке кода я всё изменю как надо
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Код скрипта:
Подправил координаты вывода, настроил HUD под свои нужды и вкусы. Однако ещё хочу сделать так, что бы он инициализировался под любые размеры окна и принимал в качестве значения ещё и id триггера (9-ым значением, выходит), что бы можно было тонко контролировать его появление.
Сейчас он выглядит так:
Ещё допишу значения по умолчанию для цвета, что бы можно было его вызывать более короткой строкой, и добавлю параметр видимости / невидимости подложки HUD-а.
Если что - для меня вся эта возня в качестве тренировки, после многолетнего отлынивания от кодинга.
P.S. А копирайты исходного кода сохранять, если я этот код хочу здесь выложить в теме скриптов? Имхо, надо.
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- strelokhalfer
-
- Не в сети
- Живу я здесь
-
- Знатный грамотей
- Сообщений: 1640
- Спасибо получено: 1080
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Моя не понимать, моя код в тег обернутьstrelokhalfer пишет: Для кода просьба использовать спец тег Код
ВНИМАНИЕ: Спойлер!RGB код (красный, синий, жёлтый) - удивился![]()
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Если код не целиком и полностью твой - оставлять определенно. Может поставить среди копирайтов пометку, что код модифицировал ты и дописать изменения в change log (если он есть в шапке скрипта).А копирайты исходного кода сохранять, если я этот код хочу здесь выложить в теме скриптов?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
В секции Scene_Map отметил в комментах к строкам что приводит к ошибке. Типичная моя ситуация - знаю звон, но не знаю где он
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Жуть болотная, на лапках, в тапках и с пулемётом...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Пробовал проследить цепочку наследования, что бы докопаться до изначальной функции Update, но след быстро потерялся на Window классе. Его исходный код в скриптах найти не смог... Однако я заметил, что в половине ошибок интерпретатор ссылается на функцию Update, так что, думаю, надо что-то сделать с ней.
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- strelokhalfer
-
- Не в сети
- Живу я здесь
-
- Знатный грамотей
- Сообщений: 1640
- Спасибо получено: 1080
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Это я уже знаю, Цербер выше написал про это. Этот скрипт меня всё больше запутывает... Сейчас он выдаёт disposed window, ссылаясь в коде ошибки на Window_base, 63-ю строку. По опыту C++ я знаю, что такая ссылка намекает либо на конечный переопределённый метод, либо на ошибку в наследовании метода. Хотя при чём тут худыч и мигание курсора (я про описание оригинально функции в хелпе) - я не пойму.strelokhalfer пишет: Смотри:
Ты в своем terminate вызываешь оригинальный метод, до его переопределения. А он уже содержит метод super.Code:b = 0 def a b = 0 b = b + 1 end p b #1 alias c a def a c# Оригинальный метод b = b + 1 end p b #2
Текущий код
terminate, имхо, тоже может быть виноват. Суть в том, что, насколько я понял, при повторном создании худа, либо при входе-выходе из меню при созданном худе, происходит обращение к переменной @hud, из которой функция пытается вытащить данные худа, однако обнаруживает, что она освобождена и почему-то ничего не делает. Я уже думаю костыль с проверкой вставить, но не сильно охота...
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
В общем, ты внутри класса наследника от Scene_Base записываешь инстанс класса наследника от Window_Base в инстанс переменную, а это значит сей стандартный код (Scene_Base) будет работать
А именно - автоматически вызывать update у твоего окошка на апдейт сцены, и автоматически вызывать dispose у твоего окошка на dispose сцены. Но сам посебе dispose НЕ УДАЛЯЕТ переменную @hud, он просто высвобождает ресурсы. Т.е. @hud.nil? вернет истину, а внутри уже будет окошко с disposed спрайтом, поэтому при @hud.dispose ты будешь пытаться высвободить окошко со спрайтом, который уже освобожден, и получишь эксепшн.
В общем
1. Удали свой метод hud_terminate. Он не делает ничего. (В последнем варианте ты вообще начал странные вещи делать через alias и super
2. Удали все проверки на @hud.nil?, в твоем случае это бесполезно. Вообще не проверяй .nil?, это не принято, т.к. nil сам по себе - булева лож. Просто делай unless @my_var, когда хочешь проверить, установлена ли переменная, или нет. Когда же ты в переменной хранишь ложь - можно юзать defined?(@my_var).
3. У окошек можно спросить @window.sprite.disposed? (А может и напрямую, не уверен). Но лучше так тоже не делать.
4. И используй нормальные имена для переменных. Мы, слава богу, в 21 веке живем, никто уже на именах переменных память не экономит.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Сообщений: 277
- Спасибо получено: 247
Iren_Rin пишет: Прости, забыл про твою проблему.
В общем, ты внутри класса наследника от Scene_Base записываешь инстанс класса наследника от Window_Base в инстанс переменную, а это значит сей стандартный код (Scene_Base) будет работать
ВНИМАНИЕ: Спойлер!Code:#-------------------------------------------------------------------------- # * Update All Windows #-------------------------------------------------------------------------- def update_all_windows instance_variables.each do |varname| ivar = instance_variable_get(varname) ivar.update if ivar.is_a?(Window) end end #-------------------------------------------------------------------------- # * Free All Windows #-------------------------------------------------------------------------- def dispose_all_windows instance_variables.each do |varname| ivar = instance_variable_get(varname) ivar.dispose if ivar.is_a?(Window) end end
А именно - автоматически вызывать update у твоего окошка на апдейт сцены, и автоматически вызывать dispose у твоего окошка на dispose сцены. Но сам посебе dispose НЕ УДАЛЯЕТ переменную @hud, он просто высвобождает ресурсы. Т.е. @hud.nil? вернет истину, а внутри уже будет окошко с disposed спрайтом, поэтому при @hud.dispose ты будешь пытаться высвободить окошко со спрайтом, который уже освобожден, и получишь эксепшн.
В общем
1. Удали свой метод hud_terminate. Он не делает ничего. (В последнем варианте ты вообще начал странные вещи делать через alias и super)
2. Удали все проверки на @hud.nil?, в твоем случае это бесполезно. Вообще не проверяй .nil?, это не принято, т.к. nil сам по себе - булева лож. Просто делай unless @my_var, когда хочешь проверить, установлена ли переменная, или нет. Когда же ты в переменной хранишь ложь - можно юзать defined?(@my_var).
3. У окошек можно спросить @window.sprite.disposed? (А может и напрямую, не уверен). Но лучше так тоже не делать.
4. И используй нормальные имена для переменных. Мы, слава богу, в 21 веке живем, никто уже на именах переменных память не экономит.
Исправления доставлены, однако disposed window при активном худе и входе-выходе из escape-меню остаётся...
Я что-то не понимаю? =_= Демка
Ленивый волчонок с большими амбициями
Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.
Покой нальёт
Людям всем, и сбежит морок...
Но пока в нём живут,
Но пока в нём растут,
Не видать нам вины
Как неба в крови.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
