2004年08月01日

「リングサーフェイスでマップスクロール」の説明

説明って言うか自分用メモ。

例えば、こんなマップがあったとして、
[サンプルマップ]
縦2マップチップ、横1マップチップぶんの画面にこれをスクロールして表示したい。

[よく分かりにくい図]

  • 図はマップ作業用のサーフェイス。
  • 青い矩形が画面に転送する部分。
  • 右スクロールの場合はこれが1マップぶん移動するたびに矩形の右側に新しいマップを追加していく。
  • 矩形が右端に達していたら新しいマップは左端に追加する。
  • 矩形が途中で切れた場合は続きを左端からとる←ここらへんがリングサーフェイス
  • 左スクロールの場合は逆にするだけ。
  • 「矩形」は「たんけい」じゃなくて「くけい」。

で、実際に作ってみました。まだとってもアレなプログラムです。

「x_mapadd/マップチップの幅*マップチップの幅」でマップチップの幅単位の座標を手に入れられる。だけど、マップチップの幅が32ドットとか2のn乗の数だったら、「x_mapadd&^(マップチップの幅-1)」と掛け算と割り算をなくして高速化(?)できる。
例えばx座標が54でそこから32ドット単位の座標を得たかったら、32=0010 0000b、32-1=0001 1111b。^(32-1)=1110 0000なので、54(=0011 0110b)&^1110 0000=32(0010 0000b)となる。(意味不明)

最後の画面への転送は転送の過程でクリッピングがされるならif文を全部取っ払って、↓みたくしてもいいかも?

RECT r1 = {r.left, r.top, サーフェイスの幅, r.bottom};
r1を画面の(0, 0)へ転送
RECT r2 = {0, r.top, r.right, r.bottom};
r2を画面の(サーフェイスの幅-r.left, 0)へ転送

矩形が2つに分裂している時、「サーフェイスの幅-r.left」で右側の矩形の幅が得られる。それ以外のときはとりあえずなんだかよく分からない値が得られるんだけど、この値は必ず画面の幅より大きい。だからr2の転送先は画面外になる。

で、、この方法だとif文が一つ減るけど、可読性は下がるし、矩形がひとつの時関数コールが1回余計になるし、やめたほうが良さそう。

追記。ここの図新しいマップ列を追加するタイミングがおかしいです。注意。そのうち直します;

posted by mia at 17:10| Comment(0) | TrackBack(1) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.seesaa.jp/tb/398023

この記事へのトラックバック

二次元リングサーフェイスでマップスクロール
Excerpt: で、今度は左右だけじゃなくて上下もスクロールする時の話。 例によってこんなマップがあったとして、 縦1マップチップ、横1マップチップの画面にこのマップをスクロールして表示したい。 図はマップ作業用...
Weblog: はむサラだにっき
Tracked: 2004-08-01 21:25