書き物

技術とか作った物の話とか愚痴文句感想など

深度管理まとめ

AS2.0を覚えて「MovieClip.attachMovie()」をたくさん使うようになったのですが、

同時に「深度」について考える必要性がでてきました。

いわば生成するMCの重なり順を設定するわけですが、

この管理がなかなか面倒に感じています。


面倒な例

爆裂スライムシ』ではたくさんのオブジェクトを描画しています。

これらを大きくグループ分けすると、

  • プレイヤー
  • プレイヤーの弾
  • 破壊した際の星

となります。(スコアとかの細かい部分は無視。)

このゲームを作ったときは深度を手作業で管理していました。

とりあえず割り当て可能な深度(-16384 ~ 1048575)を適当に区切って

その範囲で各MCを生成していました。

(プレイヤーは1、弾は100~500、敵は1000~1500・・・みたいに。負の範囲は使わない。)

これじゃあどこかにメモでもしておかなければ管理なんて出来ません。

このゲームではそれほど多い種類のMCを作りませんでしたので、

特に管理に困ることはなかったのですが、

今後ややこしいゲームを作っていく時に絶対困るはずです。


管理しやすい設計

最近僕が気づいたことは、

「MCは1つ1つそれぞれステージとしての深度を持っている」

ということです。(うまく文章にできない。)

図にすると、

_root
├ pareMc1(深度0)
│ ├ childMc1(深度0)
│ └ childMc2(深度1)
└ pareMc2(深度1)
  ├ childMc1(深度0)
  └ childMc2(深度1)

ということで、

「pareMc1.childMc1」も「pareMc2.childMc1」も深度は同じ0ですが、

配置されているMCが違っているので同時に描画可能だということです。

(今更気づいたかという感じ...。)


だから、生成するMCのグループごとにステージ用空MCを作れば、

上記の管理方法より楽に管理できそうです。

つまり『爆裂スライムシ』の場合を図でまとめると

_root
├ player(深度0) # プレイヤーは1体なのでステージは不要
├ playerGunStage(深度1)
│ ├ gun1(深度0)
│ ├ gun2(深度1)
│ :
│
├ enemyStage(深度2)
│ ├ enemy1(深度0)
│ ├ enemy2(深度1)
│ :
│
└ starStage(深度3)
  ├ star1(深度0)
  ├ star2(深度1)
  :
# 重なり順は考えていません。

という設計にしておけばよかったということです...。


ちなみに空MCを生成するには「MovieClip.createEmptyMovieClip()」を使います。


深度の数値的管理

上記の方法を用いれば、割り当てる範囲などを考える必要がないので、

直接深度を数値で触る必要がありません。

・・・といいますか、直接数値で指定しない方が楽だと思います。


便利だとは知っていましたがこれまで使ってこなかった、

「MovieClip.getNextHighestDepth()」があります。

これを使えば後で生成されたMCが前面に描画されます。

つまり上書き、上書き、・・・とされるので自然な感覚。

MCを生成するタイミングはそれなりに調節できるはずなので、

背景から順番にステージ用MCを生成していけばいいはず。

ということで、深度指定の際はできるだけ

「MovieClip.getNextHighestDepth()」を使うようにしましょう。



ふ~、以上。