私はXNAを初めて使用し、エンティティを親子階層に編成して、XNA上に軽量の2Dエンジンを開発したいと考えています。子供の位置、回転、縮尺は親に依存するため、子供を描くときはマトリックスを考えます。
を使用するSpriteBatch.Begin()
と、長方形を画面に描画できますが、次のように変更すると次のようになります。
this.DrawingMatrix = Matrix.Identity;
this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);
もう何も描かれていません。私も試した、new Matrix()
または。Matrix.CreateTranslation(0, 0, 0)
DrawingMatrix
私の最初の質問は、なぜそれが機能しないのかということです。カメラやビューポートを使用していません。
次に、エンティティを描画する前に、を呼び出してPreDraw
マトリックスを変換します(次に、で元の状態にリセットしますPostDraw
)。
protected virtual void PreDraw(Engine pEngine)
{
pEngine.DrawingMatrix *=
Matrix.CreateTranslation(this.X, this.Y, 0) *
Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) *
Matrix.CreateRotationZ(this.Rotation);
}
上記のコードの修正を明確にしてください。そして、私は原点ではなく、でスケーリングする必要がありScaleCenterX
ますScaleCenterY
が、どうすればこれを達成できますか?
追加:これが私のエンジンの描画プロセスの例です:
これらのコードを呼び出します:
this.DrawingMatrix = Matrix.CreateTranslation(0, 0, 0); this.SpriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullClockwise, null, this.DrawingMatrix);
呼び出し
PreDraw()
、次のとおりです。protected virtual void PreDraw(Engine pEngine) { pEngine.DrawingMatrix *= Matrix.CreateTranslation(this.X, this.Y, 0) * Matrix.CreateScale(this.ScaleX, this.ScaleY, 1) * Matrix.CreateRotationZ(this.Rotation); }
Draw()
たとえば、私のRect
クラスで電話します。protected override void Draw(Engine pEngine) { pEngine.SpriteBatch.Draw(pEngine.RectangleTexture, new Rectangle(0, 0, (int)this.Width, (int)this.Height), new Rectangle(0, 0, 1, 1), this.Color); }
上記のBegin
コードをに置き換えるとthis.SpriteBatch.Begin()
、長方形が正しく描画されるので、マトリックスが原因だと思います。