サイログ。

~雑多な記事置き場~

Miyako2.1

「おい、もう2.1出すんかい! まだ2.0出たばっかやし、舌の根の乾かんうちに・・・」
とか言われそうですがゴメンナサイ。

最初はバグ修正版として2.0.6作っていたのですが、気がついたら新しいクラスやモジュール作っていたので、マイナーバージョンアップということにしました。

変更点はこんな感じ。

  • dup/cloneで正しく複製できないバグを修正
  • BGMやSEを正しく演奏・監視できないバグを修正(Audio::BGM/SE.updateメソッドの導入)
  • SpirteArrayモジュールの追加(Arrayクラスに標準でmixin)
  • SpriteListクラスの追加(順番がかっちり決められているハッシュのようなもの)
  • 例外の細分化(MiyakoError->MiyakoError,MiyakoIOError,MiyakoValueError...)
  • ディープコピー(deep_dup/deep_clone)

それぞれを簡単に説明します。

複製バグの解消

たとえば、スプライトをdupメソッドで複写したとき、配列などのデータを複写していませんでした。
今回は、処理を施して、確実に複写できるようにしています。

ディープコピー

dupメソッドやcloneメソッドは、配列などを複写するとき、実際に複写するのはオブジェクト本体だけで、要素の参照は同じという、shallowコピー(浅いコピー)でしたが、今回は、配列要素・ハッシュ値も複写するディープコピーができるdeep_dup、deep_cloneメソッドを追加いたしました。

これらのメソッドはObjectクラスに登録していますので、ダックタイピングができるようになっています。

SpriteArrayモジュール

SpriteArrayモジュールは、配列にrenderなどのスプライト関連メソッドを追加するものです。
Arrayクラスには標準でmixinされています。

これにより、配列要素を一つずつrenderを呼ばなくても、配列のrenderメソッドを呼び出すだけで完了できます。
あと、描画の順番は、配列要素の順番と同じです。

@array = []
@array << Miyako::Sprite.new(...)
@array << Miyako::SpriteAnimation.new(...)
 :
@array << Miyako::Sprite.new(...)


@array.start # アニメーション再生開始

@array.update_animation # アニメーション更新

@array.render # 画面描画
              # @array[0],@array[1],..の順に描画

SpriteList

簡単に言うと、「順番がきっちり決まっているHash」です。
基本的には名前(スプライト名)とスプライト本体との一対一の関係で成り立っていますが、内部ではきっちりスプライト名で順番を決めており、配列と同じような扱いができるようになります。また、,=によるアクセスや一部イテレータでは、ハッシュのように扱える、便利なインスタンスです。もちろん、renderもできます。

なお、Yukiのvisibleメソッドの値はSpriteListクラスのインスタンスで、Yuki内部でもいろいろ役に立っています。

@list = SpriteList.new
@list << [:a, Miyako::Sprite.new(...)
@list << [:b, Miyako::SpriteAnimation.new(...)]
 :
@list << [:x, Miyako::Sprite.new(...)]


@list.start # アニメーション再生開始

@list.update_animation # アニメーション更新

@list.render # 画面描画
             # @list[:a],@list[:b], ..., @list[:x]の順に描画

@list.insert(:a, :h)
# -> @list[:h], @list[:a], @list[:b]. @list[:c], ..., @list[:x]

@list.swap(:a, :c)
# -> @list[:h], @list[:c], @list[:b], @list[:a], ..., @list[:x]

音声の監視

元々、音声ファイルを繰り返し再生すると、音声が一通り終わり、先頭に戻す瞬間、Mixer#play?メソッドの値がfalseになる問題がありました。
Miyako2.1では、先頭に戻しているときは再生中と判定し、フェードアウト中に繰り返しているときも正しく再生中となるように修正いたしました。

また、効果音の同時発生もまともに管理できていなかったのですが、Miyako2.1で対応いたしました。
同時再生数を超えて効果音を再生しようとすると、その音を再生しないようになっています。
(ただし、再生中の効果音を再生しようとすると、最初に巻き戻って再生いたします)

この件に関しては、今まで対処できず申し訳ありませんでした。

例外の細分化

これまでは、Miyakoで例外と言えば、MiyakoErrorのみでしたが、例外の内容に応じていくつかの例外クラスを追加いたしました。
たとえば、ファイル名に関するものならMiyakoIOError、値の範囲での問題ならMiyakoValueErrorなどのクラスを用意しています。