Модификация скрипта HUD-а

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81241 от Волчонок
Воспользовался демкой из этой темы:
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 и заметил, что результаты, в случае вывода значения, не имеют отличий.

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!
Последнее редактирование: 10 года 11 мес. назад пользователем Волчонок. Причина: озарение или тупняк

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

Победитель конкурса Писатель 2 место Проект месяца 2 место Разработчик
Больше
10 года 11 мес. назад #81299 от Rude
Я, конечно, так себе скриптер, но раз никто другой не ответил, то попробую я:
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.
Спасибо сказали: Волчонок

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

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 11 мес. назад #81304 от Cerberus
Логичнее не в $game_map, а в $game_system, чтобы он ещё и при сохранении оставался, и при смене карты.

Жуть болотная, на лапках, в тапках и с пулемётом...
Спасибо сказали: Волчонок

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад #81306 от Волчонок
Спасибо за помощь =) Я ещё буду перепиливать этот скрипт, к примеру, я тут подумал, что легче не писать каждый раз при вызове Color.new, а передавать при вызове по три кода цвета, а в самом скрипте при инициализации создавать две переменные цвета. Маленькая оптимизация =)

С пропажей худа при выходе в меню ещё надо разобраться... Думаю, надо описать или наследовать update и refresh.

Cerberus, спасибо за совет, при переделке кода я всё изменю как надо =)

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

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

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81404 от Волчонок
Я тут продолжаю грейдить скрипт, от него изначального сейчас мало что осталось. Попутно понял, что HUD исчезает из-а отсутствия описания того, что надлежит исполнять после паузы (если я правильно понял), то есть после вкл.-выкл. меню. Как это исправить - пока не догадался. Если кто подскажет - буду рад опыту...
Код скрипта:
ВНИМАНИЕ: Спойлер!

Подправил координаты вывода, настроил HUD под свои нужды и вкусы. Однако ещё хочу сделать так, что бы он инициализировался под любые размеры окна и принимал в качестве значения ещё и id триггера (9-ым значением, выходит), что бы можно было тонко контролировать его появление.
Сейчас он выглядит так:
ВНИМАНИЕ: Спойлер!

Ещё допишу значения по умолчанию для цвета, что бы можно было его вызывать более короткой строкой, и добавлю параметр видимости / невидимости подложки HUD-а.

Если что - для меня вся эта возня в качестве тренировки, после многолетнего отлынивания от кодинга.

P.S. А копирайты исходного кода сохранять, если я этот код хочу здесь выложить в теме скриптов? Имхо, надо.

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!
Последнее редактирование: 10 года 11 мес. назад пользователем Волчонок.

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

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81405 от strelokhalfer
Для кода просьба использовать спец тег Код
ВНИМАНИЕ: Спойлер!

"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Последнее редактирование: 10 года 11 мес. назад пользователем strelokhalfer.

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад #81408 от Волчонок

strelokhalfer пишет: Для кода просьба использовать спец тег Код

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

Моя не понимать, моя код в тег обернуть :blink:

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

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

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

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

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81409 от DeadElf79

А копирайты исходного кода сохранять, если я этот код хочу здесь выложить в теме скриптов?

Если код не целиком и полностью твой - оставлять определенно. Может поставить среди копирайтов пометку, что код модифицировал ты и дописать изменения в change log (если он есть в шапке скрипта).
Последнее редактирование: 10 года 11 мес. назад пользователем DeadElf79.
Спасибо сказали: Волчонок

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81420 от Волчонок
В общем, по аналогии с другими скриптами пробовал сделать так, что бы HUD после выхода из меню был виден, но меня везде преследовали stack overflow и disposed window. При чём я как сам переписывал код, так и копипастил из трёх других скриптов некоторые куски, однако это приводило только к ошибкам. *facepalm* Не знаю, то ли у меня знаний не хватает, то ли прямоты рук... Но я опять обращаюсь к народу Светлой: помогите доделать этот скрипт, пожалуйста. :( Меня не хватает, просто не хватает...
ВНИМАНИЕ: Спойлер!

В секции Scene_Map отметил в комментах к строкам что приводит к ошибке. Типичная моя ситуация - знаю звон, но не знаю где он :wall:

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!
Последнее редактирование: 10 года 11 мес. назад пользователем Волчонок. Причина: найдена ошибка в комменте строки

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

Проект месяца 3 место Проект месяца 1 место Проект месяца 2 место 3 место Готв Победитель Сбитой кодировки Программист JavaScript 2 место Сбитая кодировка Писатель 3 место 2 место 3 место Организатор конкурсов
Больше
10 года 11 мес. назад #81421 от Cerberus
В terminate выкинь super, он и так вызовется внутри алиаса. Это то, что навскидку вижу.

Жуть болотная, на лапках, в тапках и с пулемётом...

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад - 10 года 11 мес. назад #81428 от Волчонок
То есть alias автоматически подразумевает подгрузку содержимого старой функции?

Пробовал проследить цепочку наследования, что бы докопаться до изначальной функции Update, но след быстро потерялся на Window классе. Его исходный код в скриптах найти не смог... Однако я заметил, что в половине ошибок интерпретатор ссылается на функцию Update, так что, думаю, надо что-то сделать с ней.

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!
Последнее редактирование: 10 года 11 мес. назад пользователем Волчонок.

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

Программист Ruby Организатор конкурсов Даритель Стимкея 2 место Сбитая кодировка Переводчик 2 место
Больше
10 года 11 мес. назад #81429 от strelokhalfer
Смотри:
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 вызываешь оригинальный метод, до его переопределения. А он уже содержит метод super.

"Стрелок, что-то ты неочень похож на свой аватар..."(с)

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 11 мес. назад #81430 от Волчонок

strelokhalfer пишет: Смотри:

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 вызываешь оригинальный метод, до его переопределения. А он уже содержит метод super.

Это я уже знаю, Цербер выше написал про это. Этот скрипт меня всё больше запутывает... Сейчас он выдаёт disposed window, ссылаясь в коде ошибки на Window_base, 63-ю строку. По опыту C++ я знаю, что такая ссылка намекает либо на конечный переопределённый метод, либо на ошибку в наследовании метода. Хотя при чём тут худыч и мигание курсора (я про описание оригинально функции в хелпе) - я не пойму.
Текущий код
ВНИМАНИЕ: Спойлер!

terminate, имхо, тоже может быть виноват. Суть в том, что, насколько я понял, при повторном создании худа, либо при входе-выходе из меню при созданном худе, происходит обращение к переменной @hud, из которой функция пытается вытащить данные худа, однако обнаруживает, что она освобождена и почему-то ничего не делает. Я уже думаю костыль с проверкой вставить, но не сильно охота...

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

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

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

Программист Ruby Коммерсант Проект года 1 место Учитель Проект месяца 1 место
Больше
10 года 9 мес. назад - 10 года 9 мес. назад #83647 от Iren_Rin
Прости, забыл про твою проблему.

В общем, ты внутри класса наследника от 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 веке живем, никто уже на именах переменных память не экономит.
Последнее редактирование: 10 года 9 мес. назад пользователем Iren_Rin.
Спасибо сказали: Волчонок

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

3 место 3 место в Кодировке 2 место Организатор конкурсов
Больше
10 года 9 мес. назад - 10 года 9 мес. назад #83649 от Волчонок

Iren_Rin пишет: Прости, забыл про твою проблему.

В общем, ты внутри класса наследника от 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 веке живем, никто уже на именах переменных память не экономит.


Исправления доставлены, однако disposed window при активном худе и входе-выходе из escape-меню остаётся...

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


Я что-то не понимаю? =_= Демка

Ленивый волчонок с большими амбициями

Рассказ "Рождение мага" , периодически обновляется
РПГ История Егеря . Основной текущий проект.

ВНИМАНИЕ: Спойлер!
Последнее редактирование: 10 года 9 мес. назад пользователем Волчонок.

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

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