サイログ。

~雑多な記事置き場~

Miyako2.0の新バージョンをアップしました。

Miyako2.0に新機能を追加しました。
ダウンロードはGithubで行えます。
http://github.com/cyross/ruby-miyako/tree/master
http://github.com/cyross/miyako2_with_ruby_sdl_win32_binary/tree/master

新機能は2つ。

  • Yukiの文字表示が「1文字ずつ」と「文字列そのまま」の選択が出来るようになった
  • シーンの上に別のシーンを並行実行できる「オーバーシーン」の追加

Yukiでの文字表示方法の追加

前のバージョンまで、Yukiでは、文字を1文字ずつ表示しかできませんでしたが、今回の修正で、「1文字列を一気に表示」することができます。
やり方は2つ(デフォルトでは、1文字ずつ処理)。

  1. Yuki#text_by_strメソッドを呼び出す
  2. Yuki#text_methodメソッドで表示方法を変えてからYuki#textメソッドを呼び出す

たとえば、text_methodメソッドを使って方式を変更します。

yuki_plot{
  # デフォルト
  text "123" # "1" "2" "3" と1文字ずつ表示
  text_method :string
  text "456" # "456" と一気に表示

  text_method :char do
    text "abc" # "a" "b" "c"と1文字ずつ表示
  end

  text_by_char "abc" # 直前のブロックと同じ処理

  text_method :string do
    text "def" # "def"と一気に表示
  end

  text_by_str "def" # 直前のブロックと同じ処理
}

もちろん、文字列を一気に表示してもテキストボックスの端では自動的に改行が行われます。

また、1文字列一気に表示しても、update_textが呼び出されます。
引数は、直前に表示した文字列になります(文字単位では文字が引数だった)。

ちなみに、update_text、update_cr、update_clearと後述の「オーバーシーン」を有効に使うと、ビジュアルノベルの「バックログ」機能が実装できます。

オーバーシーン

オーバーシーンは、「とあるシーンと並行して実行するシーン」です。
「ゲームをプレイ中にボタンを押したらゲーム画面の上にコマンドが出てきた」というシチュエーションをお考えになればおわかりになると思います。

これも、内部でFiberを利用しています。処理の流れは、以下の繰り返しです。

  • 元のシーンのupdate/render呼び出し
  • オーバーシーンへ移動したら、Fiberを作成し、処理の開始
  • オーバーシーンのupdate・renderを呼び出して、元のシーンが描画した画像を上書きした後、元のシーンに戻ります
  • 再び、元のシーンのupdate/render呼び出します

オーバーシーンの定義は、そのシーンクラスのscene_typeクラスメソッドを以下のようにオーバーライドします。

オーバーシーンを終了させるには、updateメソッドの返却値にnilを渡すだけです。

class Scene1
  include Story::Scene

  def Scene1.scene_type
    :over_scene
  end

    :

  def update
    return nil if @finish
  end
end

オーバーシーンを呼び出すには、呼び出し元クラスのupdateメソッドで、そのクラス名を返却値として渡すだけです。
また、シーンクラスには、over_scene_execute?メソッドがあり、オーバークラス実行の判別に利用できます。

class Scene2
  include Story::Scene

  def update
    return Scene1 if over_scene_execute?
  end
end


なお、オーバーシーンを使う上で以下のことにご注意下さい。

  1. オーバーシーンは、呼びだし元の通常シーン・サブシーンの処理が終了すると、同時にオーバーシーンの処理が終了します
  2. オーバーシーンは、通常シーン・サブシーンから呼び出した場合、呼びだし元のStoryインスタンスにつき1つしかオーバーシーンを呼び出すことができません
  3. オーバーシーンから通常シーン・サブシーンへの移動は出来ません
  4. オーバーシーンから別のオーバーシーンへスタックすることが出来ます。オーバーシーンの下層で処理が終了したときは、上位層も同時に終了します

ちなみに、シーンで細かい変更点が3つ。

これまでインスタンスメソッドだったscene_typeメソッドは、シーンクラスのクラスメソッドに変わりました。
ですので、以降のscene_typeの実装は、以下のようにクラスメソッド定義に変わります。

class Scene1
  def Scene1.scene_type
     :sub_scene # サブシーン。後述
  end
end

class Scene1
  def Scene1.scene_type
     :over_scene # オーバーシーン
  end
end

移動した後、移動前のシーンに戻る「サブルーチン」は、「サブシーン」に変更になりました。そのため、scne_typeの設定も上記の通りに変更になります。

Story#runメソッドで引数にサブシーンやオーバーシーン名を渡すと例外が発生します。