WHITELEAF:Kindle応援サイト

KindleでWEB小説を読もう! Narou.rb 公開中

リソースの自動ロード

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