あまつぶ

3.22 14:30 【SpriteWorld2】

 SpriteWorld2と格闘中。結構めんどくさいかなと思っていたけどサンプルコードを読みながらいじってみたら基本的な部分はそれほど複雑ではないみたい。スプライトワールド、スプライトレイヤー、スプライト、フレームという包含関係があってそれらを順番に作っていけばいいと。各スプライトにはフレームがあって、アニメーションするスプライトを作ることもできるみたい。なるほど。
 スプライトを動かすのは、動きを決定するルーチンを作ってそこでやってもらうことになるらしいんだけどRacineではちょっとややこしい。スプライトは速度ベクトル(っていっていいのかな?)を持っていてそれを適当に指定しておいてやれば等速度で動くスプライトというのを簡単に作ることができる。が、Racineではキー操作で動くようにしてやらないといけないから速度ってのは使えない。キーを押した時に例えば単に右に8ドット動くとかいうのなら使えるかも知れないけど。
 で、試しにSWSetSpriteLocationという関数を使って直接動かしてみたところ、動くことは動くが前にスプライトがあった場所を消してくれない(^^;; やはり移動にはSWOffsetSpriteを使ってやらないとだめみたい。これを使うには前に表示されていた位置を覚えておいてやらないといけないわけか。うむむ……。実際の計算は画面の表示とはかなり違う座標で行っているから表示部分はその場かぎりのテンポラリ変数を使っていた。このままではうまくいかないのでこれともう一つ前の座標を覚えておく変数を作ってそこから移動量を計算させるようにしてみた。実際のところ移動ルーチンを使わなくてもちゃんと問題なく移動できるような気がするけど……どんなもんなんだろ。というか、移動ルーチンとメインルーチンでどう役割分担すればいいのかがいまいちよくわからない。あんまりグローバル変数を使いたくないし、できるかぎりのことはメインルーチン内でしてしまうというのでいいのかなぁ。
 スクリプトワールドの解放でしばらく悩んだけど、すべてのスプライトをスプライトレイヤーに、スプライトレイヤーをスプライトワールドに追加しているのならばスプライトワールドを破棄するだけでいいみたい。参考にしたサンプルでは最初にスプライトのマスターを作成してそれをいくつか複製して複製したものをレイヤーに追加していて、それで解放ルーチンではスプライトワールドの破棄とは別にマスタースプライトも破棄してやらないといけなかったと。それをそのままなにも考えずに使ったらひどい目に遭ってしまった(まあ10回くらいフリーズしただけだけど(笑))。
 なんとかスプライトの表示/移動はできるようになったが、まだ問題が。スプライトどうしの重ね合わせ処理を考えてやらないといけない。通常の2Dのゲームだったらあんまり考えなくてもいいのだろうけど擬似的ながら一応3Dっぽいゲームなので2つのボールの前後関係によってどちらを上に表示するか考えないといけない。スプライトはあとで作ったものほど上に表示されるようになっているから、この順序を変えてやらないといけない。おそらくはSWInsertSpriteAfterSpriteかSWInsertSpriteBeforeSpriteで実現するのかな。ま、あとでやってみよう。交換しないといけないタイミングをチェックするのが難しそうだけど(^^;;

 と、ここまで書いてからSWMoveSpriteというルーチンを発見。これを使えば前の座標を記録しておかなくてもちゃんと移動できそうだ。Offsetを使わないと……のくだりは、なかったことにして(笑)。

to March 21, 1999 ↑ to March index → to March 23, 1999