GはGame1のG
xnaで Game1 : Game のインスタンスのメンバによそのクラスのインスタンスからアクセスする方法。
たとえばTakoというクラスがあるとして、 Game1のgraphicsとかspriteBatchが参照したいことがある。 全部コンストラクタの引数で渡してやるのはたいへんなので、
new Tako(this)
とかでGame1のインスタンスを渡してやる。 Takoの方には
Game1 g;
public Tako(Game1 g){
this.g = g;
}
とかで値を受け取る。 すると、g.spriteBatchとかg.graphics.GraphicDevice.Viewport.Widthなど値を参照しまくり。 なんか邪道臭しまくりなんですけど。
Javaでは内部クラスで逃げていたが、C#はJavaとちと内部クラスの扱いが違ってて、めんどくさい。 そもそも内部クラス使うとソースは長くなるわ、入れ子は深くなるは、あまり良い書き方とも思えん。 Game1全体を丸投げするのでなく、 必要なリソースだけ構造体かクラスにして渡してあげるのが正しいやり方かもしれんが、 まあ、初心者にとってはわかりやすさやシンプルさの方が重要だと思うのです。
たとえば spriteBatchなどをpublic static宣言しておけば Game1.spriteBatchなどと参照できるのだが、 これもどうかなぁ。 大して美しくないし。
[…] 以前私はgはGame1のg などというものを書いたのだが、 これもまあわかりやすいんでそんな悪い方法ではないと思うが、 自分でこそっと使うならともかく学生に堂々と教えるようなもんではないわな。 Platformerのソースを読んでいると、もちろんそんなことはやってない。 うまい具合に、publicなプロパティ使ったりとか、 privateで隠蔽しつつクラス内で「地産地消」したりとか工夫されていて、 なんかもうすげーなって感じです。 で、これを自分で感心してるだけでなく学生にも教え、かつ、ゲーム制作に活かさなくてはならないのだが、 それってどうなのかと。可能なのかと。 ちなみにLevel.csって結構長い。 Post ID=1962, Last modified: 2009年5月12日 (火) 09:26:53 […]