0

monogame 3.0 (XNA-C#) を使用して横スクロール ゲームを開発しています。TriangleStrip を使用して地面を描画し、スプライトバッチを使用してフェンスを描画しています。フェンスを地面の上に置きたいのですが、別の軸 (正ではなく負) を使用しているようです。物事を揃えるために、フェンスを裏返し、負の x と y を使用する必要があります。スプライトとプリミティブの両方が同じビュー マトリックスとプロジェクトを使用しています。

同じマトリックスを使用しているときに、プリミティブが正の軸を使用しているのに、スプライトバッチに負の軸が必要なのはなぜですか?

protected override void Initialize()
{
    viewMatrix = Matrix.CreateLookAt(new Vector3(0, 0, 1), Vector3.Zero, new Vector3(0,1, 0));
    projectionMatrix = Matrix.CreateOrthographicOffCenter(0,GraphicsDevice.Viewport.Width,  
                        0, GraphicsDevice.Viewport.Height, 0f, 200f) *Matrix.CreateScale(new Vector3(.5f, .5f, 1f));

    GraphicsDevice.RasterizerState.CullMode = CullMode.None;


    _groundBasicEffect = new BasicEffect(GraphicsDevice);
    _groundBasicEffect.View = viewMatrix;
    _groundBasicEffect.Projection = projectionMatrix;
    _groundBasicEffect.VertexColorEnabled = true;
    _groundBasicEffect.World = world;

    _fenceBasicEffect = new BasicEffect(GraphicsDevice);
    _fenceBasicEffect.View = Matrix.CreateLookAt(new Vector3(0, 0, 1), Vector3.Zero, new Vector3(0,1,  0));
    _fenceBasicEffect.Projection = projectionMatrix;
    _fenceBasicEffect.TextureEnabled = true;
    _fenceBasicEffect.World = world;     

    base.Initialize();
}
protected override void LoadContent()
{
        _spriteBatch = new SpriteBatch(GraphicsDevice);
        fenceTexture = this.Content.Load<Texture2D>(@"Fence1");
        vertexData = new VertexPositionColor[8];
        vertexData[0] = new VertexPositionColor(new Vector3(0, 0, 0), Color.Black);
        vertexData[1] = new VertexPositionColor(new Vector3(0, 400, 0), Color.Black);
        vertexData[2] = new VertexPositionColor(new Vector3(200, 0, 0), Color.Black);
        vertexData[3] = new VertexPositionColor(new Vector3(200, 400, 0), Color.Black);
        vertexData[4] = new VertexPositionColor(new Vector3(300, 0, 0), Color.Black);
        vertexData[5] = new VertexPositionColor(new Vector3(300, 430, 0), Color.Black);
        vertexData[6] = new VertexPositionColor(new Vector3(1200, 0, 0), Color.Black);
        vertexData[7] = new VertexPositionColor(new Vector3(1200, 430, 0), Color.Black);
        vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor), vertexData.Length, BufferUsage.None);
        vertexBuffer.SetData(vertexData);

    }
protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);
        GraphicsDevice.SetVertexBuffer(vertexBuffer);

        _groundBasicEffect.CurrentTechnique.Passes[0].Apply();
        GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleStrip, vertexData, 0, vertexData.Length -2);

        _spriteBatch.Begin(0, null, null, null, null, _fenceBasicEffect);
        _spriteBatch.Draw(fenceTexture, Vector2.Zero, new Rectangle(0, 0, 1130, 221), Color.White, 0, new Vector2(0, 200), 1, SpriteEffects.None, 0);
        _spriteBatch.End();
        base.Draw(gameTime);
    }

見た目は… どのように見えるか

どのように見えると思いますか... どのように見えると思いますか

この外観を得るには、フェンスの Draw をこれに変更する必要があります...

_spriteBatch.Draw(fenceTexture, Vector2.Zero, new Rectangle(0, 0, 1130, 221), Color.White, 0, new Vector2(0, -400), 1, SpriteEffects.FlipVertically, 0);
4

0 に答える 0