Module: Miyako::SimpleStory::Scene

Defined in:
lib/Miyako/API/simple_story.rb

Overview

シーンモジュール

本モジュールをmixinすることにより、シーンを示すインスタンスを作成することができる mixinするときに気をつけなければいけないのは、本モジュールでは以下の モジュール変数を 予約しているため、これらの変数の値を勝手に変えてはいけない ・@@scenesモジュール変数(シーンクラス一覧が入っているハッシュ) ・@@poolモジュール変数(シーン情報が入っているハッシュ) (互換性のために@nowを残しているが、now_sceneのみを使うときは値を上書きしてもかまわない)) また、シーンには「シーン形式」がある。 種類は、シーケンスな移動が出来る「通常シーン」、終了したときに移動元に戻る「サブシーン」、 現在実行中のシーン上で並行に実行する「オーバーシーン」の3種類。 デフォルトは「通常シーン」となっている。 判別は、scene_typeクラスメソッドを呼び出すことで可能。デフォルトは、 通常シーンを示すシンボル“:scene”が返る。 形式を変えるには、scene_typeクラスメソッドをオーバーライドし、返却値を変える。 サブシーンの時はシンボル“:sub_scene”を返すように実装する (注1)同じクラス名のシーンを繰り返し実行したいときは、いったん別のダミーシーンを 介してから元のシーンへ移動する必要がある (注2)オーバーシーン内では、シーンの移動が出来ないが、入れ子形式で 別のオーバーシーンを積み上げる形なら移動可能。

Constant Summary collapse

@@scenes =
{}
@@pool =
{}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.has_scene?(s) ⇒ Boolean

:nodoc:


144
145
146
# File 'lib/Miyako/API/simple_story.rb', line 144

def self.has_scene?(s) #:nodoc:
  return @@scenes.has_key?(s)
end

.included(c) ⇒ Object

:nodoc:


131
132
133
134
135
136
137
138
# File 'lib/Miyako/API/simple_story.rb', line 131

def self.included(c) #:nodoc:
  unless c.singleton_methods.include?(:scene_type)
    def c.scene_type
      return :scene
    end
  end
  @@scenes[c.to_s] = c
end

.listupObject

登録しているシーン一覧をリストアップする

リストの内容は、“シーンクラス名(文字列),シーンクラス(ポインタ), 解説(noticeメソッドの内容)”という書式で取得できる

返却値

リストアップしたシーンの配列


245
246
247
248
249
250
# File 'lib/Miyako/API/simple_story.rb', line 245

def self.listup
  list = Array.new
  sns = @@scenes
  sns.keys.sort.each{|k| list.push("#{k}, #{sns[k]}, \"#{sns[k].notice}\"\n") }
  return list
end

.listup2csv(csvfname) ⇒ Object

Scene.#listupメソッドの内容をCSVファイルに保存する

csvname

保存するCSVファイルパス


254
255
256
257
258
# File 'lib/Miyako/API/simple_story.rb', line 254

def self.listup2csv(csvfname)
  csvfname += ".csv" if csvfname !~ /\.csv$/
  list = self.listup
  File.open(csvfname, "w"){|f| list.each{|l| f.print l } }
end

.scenesObject

:nodoc:


140
141
142
# File 'lib/Miyako/API/simple_story.rb', line 140

def self.scenes #:nodoc:
  return @@scenes
end

Instance Method Details

#clear_hand_overObject


178
179
180
# File 'lib/Miyako/API/simple_story.rb', line 178

def clear_hand_over
  @@pool[self.object_id].hand_over = nil
end

#disposeObject

シーンに使用したデータの解放を記述するテンプレートメソッド

initメソッドと対になっているというイメージ


226
227
# File 'lib/Miyako/API/simple_story.rb', line 226

def dispose
end

#executeObject

シーンの情報を更新するテンプレートメソッド

現在実行しているシーンを繰り返し実行する場合はインスタンス変数@nowを返すように実装する nilを返すとシーンの処理を終了する(元のStory#runメソッド呼び出しの次に処理が移る) 但し、scene_typeメソッドの結果が:sub_routneのとき、移動元シーンに戻る

返却値

移動先シーンクラス


220
221
222
# File 'lib/Miyako/API/simple_story.rb', line 220

def execute
  return now_scene
end

#hand_overObject

前シーンから引き継いだオブジェクトを参照する


169
170
171
# File 'lib/Miyako/API/simple_story.rb', line 169

def hand_over
  return @@pool[self.object_id].hand_over
end

#hand_over=(obj) ⇒ Object


173
174
175
176
# File 'lib/Miyako/API/simple_story.rb', line 173

def hand_over=(obj)
  @@pool[self.object_id].hand_over = obj
  @@pool[self.object_id].story.hand_over = obj
end

#initObject

シーン内で使用するオブジェクトの初期化テンプレートメソッド

シーン内で使用するインスタンスを生成するときなどにこのメソッドを実装する


211
212
# File 'lib/Miyako/API/simple_story.rb', line 211

def init
end

#init_inner(p, u) ⇒ Object

:nodoc:


155
156
157
158
# File 'lib/Miyako/API/simple_story.rb', line 155

def init_inner(p, u) #:nodoc:
  @@pool[self.object_id].prev = p
  @@pool[self.object_id].upper = u
end

#initialize(story, handover, check_only = false) ⇒ Object

:nodoc:


148
149
150
151
152
153
# File 'lib/Miyako/API/simple_story.rb', line 148

def initialize(story, handover, check_only=false) #:nodoc:
  return if check_only
  @@pool[self.object_id] = Miyako::Story::ScenePool.new(story, nil, nil, nil, handover)
  @now = self.now_scene
  self.init
end

#next=(label) ⇒ Object

:nodoc:


229
230
231
# File 'lib/Miyako/API/simple_story.rb', line 229

def next=(label) #:nodoc:
  @@pool[self.object_id].next = label
end

#next_sceneObject

:nodoc:


190
191
192
# File 'lib/Miyako/API/simple_story.rb', line 190

def next_scene #:nodoc:
  return @@pool[self.object_id].next
end

#noticeObject

シーンの解説を返す(テンプレートメソッド)

Sceneモジュールをmixinしたとき、解説文を返す実装をしておくと、 Scene.#lisutupメソッドを呼び出したときに、noticeメソッドの結果を取得できる

返却値

シーンの解説(文字列)


237
238
239
# File 'lib/Miyako/API/simple_story.rb', line 237

def notice
  return ""
end

#now_sceneObject

現在実行中のシーンを返す

現在実行しているシーンをクラス名で返す

返却値

前回実行したシーン名(Classクラスインスタンス)


205
206
207
# File 'lib/Miyako/API/simple_story.rb', line 205

def now_scene
  return self.class
end

#prev_sceneObject

前回実行したシーンを返す

前回実行しているシーンをクラス名で返す 但し、最初のシーンの場合はnilを返す

返却値

前回実行したシーン名(Classクラスインスタンス)


198
199
200
# File 'lib/Miyako/API/simple_story.rb', line 198

def prev_scene
  return @@pool[self.object_id].prev
end

#storyObject

前回実行したシーンを返す

前回実行しているシーンをクラス名で返す 但し、最初のシーンの場合はnilを返す

返却値

前回実行したシーン名(Classクラスインスタンス)


164
165
166
# File 'lib/Miyako/API/simple_story.rb', line 164

def story
  @@pool[self.object_id].story
end

#upper_sceneObject

サブルーチンの呼び元シーンを返す

サブルーチンを呼び出したシーンをクラス名で返す サブルーチンではないときはnilを返す

返却値

前回実行したシーン名(Classクラスインスタンス)


186
187
188
# File 'lib/Miyako/API/simple_story.rb', line 186

def upper_scene
  return @@pool[self.object_id].upper
end