2015年10月11日日曜日

HSPでマップをスクロールさせてみた

先日は、アニメーションするスプライトを作ってマップをうろちょろさせました。
今回は、そのマップをスクロールする機能を実装しました。


テスト用のアプリケーションでは、スプライトではなく円を塗りつぶしたものを移動させています。

そんなに大きくないマップですが、スクロールすると広く感じたり探検気分がでてきた気がします。
スクロールってわくわくするね₍₍ (ง `・ω・´ )ว ⁾⁾

スクロールの処理の概要


赤線の枠は、フレームと呼んでいます。
フレームはスクロール機能の設定値で、この枠からはみ出す場合にスクロールします。
追跡対象が枠の中で移動している間はスクロールはしません。
ただし、スクロールの範囲はマップ画像の範囲内です。

描画処理は前回書いたとおり、背景、キャラ、前景の順番で描いています。

描画のあとで、キー入力に応じて、キャラの移動先を決めます。
障害物があれば移動はしません。

障害物の判定


障害物の判定は、次のような当たり判定用の画像の色情報で決めています。
移動先の座標の色を取得して、色が黒でなければ移動します。
HSP には pget という色を取得する関数がありますが、
それより高速に行う方法が紹介されていたので、そちらを試してみました。
参照:buffer上の特定の1色の座標(1点)の高速検索方法は? - HSPTV!掲示板

mref bufVram, 66
で、変数に操作中のウィンドウの画像が割り当てられます。
あとは、 peek を使って bufVram の色情報へアクセスします。


idxVram = ((heightBuffer - y - 1) * widthBuffer + x) * 3
_b = peek(bufVram, idxVram + 0)
_g = peek(bufVram, idxVram + 1)
_r = peek(bufVram, idxVram + 2)

widthBuffer, heightBuffer はウィンドウのサイズです。
VRAM はボトムアップの 24bit ビットマップ形式になっています。
 参照:VRAMデータについて - HSPTV!掲示板

当たり判定用の画像は、だいぶ雑なので壁に少しのめりこんでしまいました。
このあたりは、今後微調整していこうと思います。

スプライトの描画順の改善


そういえば、スプライトの機能のテストをしていて、あれからひとつ改良しました。

キャラが複数重なる場合、手前にいるキャラをあとで描画する必要があります。
そのために、キャラの Y 軸の座標の値でキャラをソートする処理を実装しました。
これについては、 HSP の wiki で提供されているヒープソートの処理を参考にしました。
 参照:Module/ヒープソート - HSP開発wiki

Y軸の座標の値が小さいものから昇順で描画することで、違和感なくキャラを重ねられるようになりました。

予定


次回は、スプライトの機能と今回のスクロールの機能をあわせて、複数のキャラが移動しているマップをスクロールしながら移動したいと思います。
キャラももうちょっと種類を増やしたり、かわいくしたりしたいです。

0 件のコメント:

コメントを投稿