#Ks_Childs_Keeper とかぶってるのでそちらを再考 #============================================================================== # ■ Ks_Conteintset #============================================================================== class Ks_Conteintset < Array [:viewport, :visible, :opacity, ].each{|method| attr_reader method eval("define_method(:#{method}=) {|v| self.each {|window| window.#{method} = v } if #{method.to_variable} != v; #{method.to_variable} = v }") } [:dispose, :update, :refresh, ].each{|method| define_method(method){ self.each{|obj| obj.__send__(method) } } } #-------------------------------------------------------------------------- # ● コンストラクタ #-------------------------------------------------------------------------- def initialize(viewport = nil, *containts) @viewport = viewport super() self.concat(containts) self.visible = false end #========================================================================== # ↓下位クラス先で再定義するメソッド #========================================================================== #-------------------------------------------------------------------------- # ● アクティブ時の更新処理。 #-------------------------------------------------------------------------- def update update_basic(true) end #-------------------------------------------------------------------------- # ● 背景での更新処理。 #-------------------------------------------------------------------------- def update_basic(from_main = false) self.each{|obj| obj.update } end #========================================================================== # ↑下位クラス先で再定義するメソッド #========================================================================== end #============================================================================== # ■ Ks_Windowset_Base #============================================================================== class Ks_Windowset_Base < Ks_Conteintset attr_reader :active attr_accessor :command_window [:open, :close].each{|method| define_method(method) { windows.each{|window| window.__send__(method) } } } [:openness, :back_opacity, :contents_opacity, :windowskin, ].each{|method| attr_reader method eval("define_method(:#{method}=) {|v| windows.each {|window| window.#{method} = v } if #{method.to_variable} != v; #{method.to_variable} = v }") } #-------------------------------------------------------------------------- # ● コンストラクタ #-------------------------------------------------------------------------- def initialize(viewport = nil, *containts) super self.active = false end #-------------------------------------------------------------------------- # ● 内容ウィンドウの配列。必要に応じて継承先で再定義 #-------------------------------------------------------------------------- def windows self end #-------------------------------------------------------------------------- # ● アクティビティの変更。 # 以前の状態との切り替え時に処理を実行 # コマンドウィンドウが設定されていればアクティブ化時にそれをアクティブに # コマンドウィンドウ以外はに非アクティブ化 #-------------------------------------------------------------------------- def active=(v) if @active != v self.visible ||= v windows.each{|window| window.active = false } command_window.active = true if v && command_window.nil? @active = v end end end class Ks_Spriteset_Base < Ks_Conteintset [:opacity, ].each{|method| attr_reader method eval("define_method(:#{method}=) {|v| windows.each {|window| window.#{method} = v } if #{method.to_variable} != v; #{method.to_variable} = v }") } def sprites self end end #============================================================================== # ■ Scene_SceneContainer_Container # Scene_Containerを保有し、それを自動開放する #============================================================================== module Scene_SceneContainer_Container #-------------------------------------------------------------------------- # ● コンストラクタ #-------------------------------------------------------------------------- def start(*var) super @scene_container_contentes = [] end #-------------------------------------------------------------------------- # ● ターミネータ #-------------------------------------------------------------------------- def terminate @scene_container_contentes.each{|scene| scene.terminate } super end #-------------------------------------------------------------------------- # ● コンテナの更新。操作を占有しているコンテナがあれば、trueを返す #-------------------------------------------------------------------------- def update_scene_container @scene_container_contentes.any?{|scene| scene.update } end end #============================================================================== # ■ Scene_AvaiableMessage # それをupdateするだけで一連のシーン的な処理を実現するオブジェクト # startメソッドで構成要素を生成し、selfを返し、処理を開始する。 #============================================================================== class SceneContainer_Base DUMMY_CONTENTS = Ks_Conteintset.new #-------------------------------------------------------------------------- # ● コンストラクタ #-------------------------------------------------------------------------- def initialize @windows = @sprites = DUMMY_CONTENTS super end #========================================================================== # ↓下位クラス先で再定義するメソッド #========================================================================== def windows_class Ks_Windowset_Base end def sprites_class Ks_Spriteset_Base end #========================================================================== # ↑下位クラス先で再定義するメソッド #========================================================================== #-------------------------------------------------------------------------- # ● 処理の開始。コンテンツを生成する。 #-------------------------------------------------------------------------- def start @started = true @windows = windows_class.new @sprites = sprites_class.new self end #-------------------------------------------------------------------------- # ● 更新処理。activeであればupdate_内容を実行し、trueを返す #-------------------------------------------------------------------------- def update unless @active && @visible update_basic return false end update_contents end #-------------------------------------------------------------------------- # ● 更新処理。trueを返す場合は、操作を占有している事を表す #-------------------------------------------------------------------------- def update_contents windows.update sprites.update true end #-------------------------------------------------------------------------- # ● 背景での更新処理。返り値に意味はない #-------------------------------------------------------------------------- def update_basic windows.update_basic sprites.update_basic end #-------------------------------------------------------------------------- # ● 処理の終了。コンテンツを破棄する。 # 必要ならば、再びstartできる。 #-------------------------------------------------------------------------- def terminate return unless @started @windows.disepose @sprites.disepose @windows = @sprites = DUMMY_CONTENTS end [:command_window, :viewport, :visible, :active].each{|method| eval("define_method(:#{method}) { #{method.to_variable} }") eval("define_method(:#{method}=) {|v| #{method.to_variable} = v; @windows.#{method} = v }") } [].each{|method| define_method(method) { windows.__send__(method) sprites.__send__(method) } } [:refresh, :open, :close].each{|method| define_method(method) { windows.__send__(method) #sprites.__send__(method) } } end #============================================================================== # ■ SceneContainer_Garrage #============================================================================== class SceneContainer_Garrage < SceneContainer_Base end #============================================================================== # ■ SceneContainer_Garrage #============================================================================== class SceneContainer_Shop < SceneContainer_Base end #============================================================================== # ■ SceneContainer_Garrage #============================================================================== class SceneContainer_Maidensnow < SceneContainer_Base end