リソースの自動ロード
DXRuby(や何か)でゲームを作っていた場合を想定して、何かのリソースを変更するたびに実行し直すのは面倒臭いので、リソースの更新を検知して自動で再ロードをしたい。(画像データやマップデータ、モデルデータetc.)
モジュール化とか何も考えずに書いてみたけれどこんな感じか。include や extend するだけでOKみたいなのは難しそうというより無理そう………ある程度はごにょごにょが必要そう。
#てきとうすぎて同じファイルを(別のオブジェクトとして)複数回ロードした時を考慮してない
TODO:ruby のコード自体の更新検知で require し直したい
# DXRuby 付属の sample/sample.rb 冒頭部 require 'dxruby' require "pathname" require "listen" # gem install listen class ListenManager @@_listen_list = {} @@_change_handler = {} def self.exist?(filename) !!@@_listen_list[Pathname(filename).realpath.to_s] end def self.start Listen.to("./").change(&lambda { |modified, added, removed| p modified, added, removed modified.each do |path| handler = @@_change_handler[path] handler.call(path) if handler end }).force_polling(true).start(false) end def self.regist(filename, handler) @@_change_handler[Pathname(filename).realpath.to_s] = handler end end class Image class << self alias _load_org load end @@_filename_cache = {} def self.load(*arg) img_object = _load_org(*arg) unless ListenManager.exist?(arg[0]) ListenManager.regist(arg[0], lambda { |path| p "modified: " + path work_img = _load_org(*arg) img_object.draw(0, 0, work_img) work_img.dispose }) end return img_object end end ListenManager.start