サイログ。

~雑多な記事置き場~

Miyako2.0で残っていた問題を対応

遂にRuby/SDL2.1がリリースされたので、それに合わせてMiyako2.0をアップしようと考えていたのですが、CollisionとMap/FixedMapでどうしても解決しておきたい問題があったのです。

それは、それぞれのクラスでは、現在の座標位置情報を内包しているため、煩わしいアクセスが行われ、
柔軟に扱えるクラス構成になっていませんでした。

考えた結果、CollisionとMap/FixedMapから現在位置に依存した部分を削除しました。

つまり、現在位置情報は、ユーザが引数として渡すように変更致しました。
とはいえ、位置情報は、Point/Rect/Square構造体や配列等、一つのインスタンスで渡せるようになっていますので、それほどコード量が増えないと思っています。

たとえば、Collision.collision?メソッドの引数は以下のようになります。

# col1, pos1 ... キャラクタ1のコリジョンと位置
# col2, pos2 ... キャラクタ2のコリジョンと位置
Collision.collision?(col1, pos1, col2, pos2)

また、Map/FixedMap#get_amountメソッドを廃止しました。当たり判定を求めるアルゴリズムが予想より複雑な要求があることが分かったためです。

現在のキャラクタの矩形から、当たり判定の対象になりそうなマップチップの座標の組み合わせを返すproduct_position、product_position_by_squareメソッドを追加しました。
これらは、Map/FixedMapではなく、MapLayer/FixedMapLayerクラスのメソッドです。

組み合わせの取得は、以下のように記述します。

# 0番目レイヤーのマップチップ左上座標の組み合わせを、chr_rectの範囲で求める
poses = map[0].product_position(chr_rect) => [[100,200], [100,300]...]

また、MapLayer/FixedMapLayerクラスに、collision?,meet?,cover?メソッドを追加しました。
これをもとに、移動の可否を求めることが出来ます。