2008/9/16 Na-7
3Dモデルの前面にスプライトを描画する
注意 | この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。 この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。 |
◎使用ツール
ツール名 | 入手元 |
XNA2.0(XNA GameStudio 2.0:ゲーム開発用フレームワーク) | http://msdn.microsoft.com/ja-jp/xna/default.aspx |
ACL(Animation Component Library:アニメーション再生用ライブラリ) |
http://www.codeplex.com/animationcomponents/Thread/View.aspx?ThreadId=19730 XNA2.0用の公式版は存在しないため、上記Discussionsに記載されている http://www.laterminal.net/xna/AnimationComponentDLL.rarを使用した |
◎問題点
ゲームには、スコア、メッセージ、各種パラメータ、外枠など、常に3Dモデルの手前(最前面)に表示したいスプライト(2Dの絵や文字)がある。
しかし、ACLで描画した3Dモデルと同じ位置にスプライトを描画すると、3Dモデルの背面に隠れてしまう。
◎解決方法(概要)
ACLによって3Dモデルが自動的に描画されているが、これを停止し、3Dモデルの描画命令を明記することとする。
そうすると、自分で描画するタイミングを制御できるようになるので、3Dモデルを描画してから最後にスプライトを描画することとする。
◎解決方法(詳細)
1.ACLの ModelAnimator を作成後、animator.Visible = false; として非表示としておく。
2.Draw() 内では、animator.Draw(gameTime); として3Dモデルの描画を行う。
3.3Dモデルの描画後に、スプライトの描画を行う。
◎サンプルコード
protected override void LoadContent()〜
// 3Dモデルの呼び出し
testModel = Content.Load<Model>(" 〜 "); // ModelAnimatorを追加
animator = new ModelAnimator(this, testModel);
animator.World = Matrix.Identity;
animator.Enabled = true;
animator.Visible = false; // 非表示としておき、Draw()内で自力で描画する〜
}
protected override void Draw(GameTime gameTime)// ワールド座標変換指定〜
〜
// スプライトバッチ開始(AlphaBlendとSaveStateは殆どのゲームで必要)spriteBatch.DrawString( 〜 );
spriteBatch.Draw( 〜 );
// スプライトバッチ終了
spriteBatch.End();
〜
}
※スキンアニメーションに必要なコードを全て記載しているわけではない。
※スキンアニメーションについては「XNA2.0でスキンアニメーション」を参照。
◎補足
上記の方法を使用せずに、spriteBatch.Begin() の SpriteSortMode や spriteBatch.Draw() の layerDepth (配置レイヤー)を調整したり、spriteBatch を複数作成することによって前面描画できないかと試してみたが、無駄であった。ACLの自動描画機能は、Draw()関数完了後に描画していると思われる。