Войти на сайт

Авторизация, ждите ...
×

ТЕМА: Модификация скрипта HUD-а

Модификация скрипта HUD-а 9 года 6 мес. назад #81241

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
Воспользовался демкой из этой темы:
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 и заметил, что результаты, в случае вывода значения, не имеют отличий.
Ленивый волчонок с большими амбициями

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 9 года 6 мес. назад от Волчонок. Причина: озарение или тупняк
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 6 мес. назад #81299

  • Rude
  • Rude аватар
  • Вне сайта
  • Бывалый
  • Сообщений: 56
  • Спасибо получено: 91
  • Писатель 2 местоПроект месяца 2 местоРазработчикПобедитель конкурса
Я, конечно, так себе скриптер, но раз никто другой не ответил, то попробую я:
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.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Волчонок

Модификация скрипта HUD-а 9 года 6 мес. назад #81304

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Организатор конкурсов3 место ГотвПрограммист JavaScript 2 место Сбитая кодировкаПобедитель Сбитой кодировкиПисатель 3 местоПроект месяца 1 место2 место 3 местоПроект месяца 2 место
Логичнее не в $game_map, а в $game_system, чтобы он ещё и при сохранении оставался, и при смене карты.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Волчонок

Модификация скрипта HUD-а 9 года 6 мес. назад #81306

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
Спасибо за помощь =) Я ещё буду перепиливать этот скрипт, к примеру, я тут подумал, что легче не писать каждый раз при вызове Color.new, а передавать при вызове по три кода цвета, а в самом скрипте при инициализации создавать две переменные цвета. Маленькая оптимизация =)

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

Cerberus, спасибо за совет, при переделке кода я всё изменю как надо =)
Ленивый волчонок с большими амбициями

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81404

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
Я тут продолжаю грейдить скрипт, от него изначального сейчас мало что осталось. Попутно понял, что HUD исчезает из-а отсутствия описания того, что надлежит исполнять после паузы (если я правильно понял), то есть после вкл.-выкл. меню. Как это исправить - пока не догадался. Если кто подскажет - буду рад опыту...
Код скрипта:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]

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

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

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

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

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 9 года 5 мес. назад от Волчонок.
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81405

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • ПереводчикДаритель СтимкеяПрограммист Ruby2 место Сбитая кодировка2 место Организатор конкурсов
Для кода просьба использовать спец тег Код
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Последнее редактирование: 9 года 5 мес. назад от strelokhalfer.
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81408

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
strelokhalfer пишет:
Для кода просьба использовать спец тег Код
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Моя не понимать, моя код в тег обернуть :blink:

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Ленивый волчонок с большими амбициями

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81409

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Писатель 3 местоПроект месяца 1 местоУчительПроект месяца 2 местоОрганизатор конкурсов3 местоВетеран1 место в ГотвПрограммист Ruby
А копирайты исходного кода сохранять, если я этот код хочу здесь выложить в теме скриптов?
Если код не целиком и полностью твой - оставлять определенно. Может поставить среди копирайтов пометку, что код модифицировал ты и дописать изменения в change log (если он есть в шапке скрипта).
Последнее редактирование: 9 года 5 мес. назад от DeadElf79.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: Волчонок

Модификация скрипта HUD-а 9 года 5 мес. назад #81420

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

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

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 9 года 5 мес. назад от Волчонок. Причина: найдена ошибка в комменте строки
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81421

  • Cerberus
  • Cerberus аватар
  • Вне сайта
  • Модератор
  • Собака злая
  • Сообщений: 2269
  • Спасибо получено: 1182
  • Организатор конкурсов3 место ГотвПрограммист JavaScript 2 место Сбитая кодировкаПобедитель Сбитой кодировкиПисатель 3 местоПроект месяца 1 место2 место 3 местоПроект месяца 2 место
В terminate выкинь super, он и так вызовется внутри алиаса. Это то, что навскидку вижу.
Жуть болотная, на лапках, в тапках и с пулемётом...
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81428

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
То есть alias автоматически подразумевает подгрузку содержимого старой функции?

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

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 9 года 5 мес. назад от Волчонок.
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81429

  • strelokhalfer
  • strelokhalfer аватар
  • Вне сайта
  • Архитектор Миров
  • Знатный грамотей
  • Сообщений: 1640
  • Спасибо получено: 1078
  • ПереводчикДаритель СтимкеяПрограммист Ruby2 место Сбитая кодировка2 место Организатор конкурсов
Смотри:
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.
"Стрелок, что-то ты неочень похож на свой аватар..."(с)
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 5 мес. назад #81430

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
strelokhalfer пишет:
Смотри:
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, из которой функция пытается вытащить данные худа, однако обнаруживает, что она освобождена и почему-то ничего не делает. Я уже думаю костыль с проверкой вставить, но не сильно охота...
Ленивый волчонок с большими амбициями

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Администратор запретил публиковать записи гостям.

Модификация скрипта HUD-а 9 года 3 мес. назад #83647

  • Iren_Rin
  • Iren_Rin аватар
  • Вне сайта
  • Мастер
  • Сообщений: 247
  • Спасибо получено: 537
  • Проект года 1 местоПроект месяца 1 местоПрограммист RubyУчительКоммерсант
Прости, забыл про твою проблему.

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

Модификация скрипта HUD-а 9 года 3 мес. назад #83649

  • Волчонок
  • Волчонок аватар
  • Вне сайта
  • Просветлённый
  • Волчонок
  • Сообщений: 277
  • Спасибо получено: 247
  • 2 место 3 местоОрганизатор конкурсов3 место в Кодировке
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-меню остаётся...

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]


Я что-то не понимаю? =_= Демка
Ленивый волчонок с большими амбициями

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

ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ]
Последнее редактирование: 9 года 3 мес. назад от Волчонок.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.602 секунд