0

XNA で四角形を描画し、ユーザー入力に基づいてキーボードで単純に移動しようとしています。残念ながら、正方形を表示することさえできませんでした.ここに何かが欠けていることは確かですが、それが何であるかを正確に理解することはできません. ゲームで使用できるプリミティブ シェイプの複雑な階層を作成する予定です。クラスの主要なコンポーネントShapeが初期化され、派生クラス (この場合Rectは ) はこれらのコンポーネントをさらに使用するために利用し、構成します。

ここで何が間違っていますか?

コード

Shape.cs

public abstract class Shape
    {
        public Vector3 Center;
        public Color[] Colors;
        public bool SetColorsOnUpdate;

        public virtual Rectangle BoundingBox { get; set; }
        public float Radius { get { return mRadius; } }

        protected VertexBuffer mVertexBuf;
        protected IndexBuffer mIndexBuf;
        protected float mRadius;
        protected BasicEffect mShader;

        public Shape(Vector3 center, Color[] colors, int numVertices, float radius)
        {
            Colors = colors;
            Center = center;
            mVertexBuf = new VertexBuffer(Graphics.MainDevice, typeof(VertexPositionColor), numVertices, BufferUsage.WriteOnly);
            mIndexBuf = new IndexBuffer(Graphics.MainDevice, IndexElementSize.SixteenBits, numVertices, BufferUsage.WriteOnly);
            SetColorsOnUpdate = true;
            mShader = new BasicEffect(Graphics.MainDevice);
            mRadius = radius;
        }

        public abstract void Update();
        public abstract void Draw();
    }

Rect.cs

public class Rect : Shape
{
    public override Rectangle BoundingBox
    {
        get
        { 
            int x = (int)Center.X, y = (int)Center.Y;
            int diameter = (int)mRadius * 2;

            return new Rectangle(
                x, y,
                x + diameter, 
                y + diameter
            );
        }
    }

    const float TestRectZCoordinate = 0;
    const int NumVertices = 4;

    public Rect(Vector3 center, Color[] colors, float radius)
        : base(center, colors, NumVertices, radius)
    {
        if (colors.Length < NumVertices)
            throw new IndexOutOfRangeException(string.Format("Color array passed to Rect constructor MUST have an element index size of 4. Current length passed is {0}", colors.Length));

        mShader.VertexColorEnabled = true;

        mVertexBuf.SetData<VertexPositionColor>(
                new VertexPositionColor[]
                {
                    new VertexPositionColor(new Vector3(Center.X + mRadius, Center.Y + mRadius, TestRectZCoordinate), Colors[0]),
                    new VertexPositionColor(new Vector3(Center.X + mRadius, Center.Y - mRadius, TestRectZCoordinate), Colors[1]),
                    new VertexPositionColor(new Vector3(Center.X - mRadius, Center.Y - mRadius, TestRectZCoordinate), Colors[2]),
                    new VertexPositionColor(new Vector3(Center.X - mRadius, Center.Y + mRadius, TestRectZCoordinate), Colors[3])
                }
            );

        mIndexBuf.SetData<short>(new short[] { 0, 1, 2, 3 });
    }

    public override void Update()
    {
        //TODO
    }

    public override void Draw()
    {
        mShader.World = Matrix.CreateWorld(Center, Vector3.Forward, Vector3.Up);
        mShader.CurrentTechnique.Passes[0].Apply();

        Graphics.MainDevice.SetVertexBuffer(mVertexBuf);
        Graphics.MainDevice.Indices = mIndexBuf;

        Graphics.MainDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, NumVertices, 0, 1);
    }
}

アップデート

これが最新の Rect.Draw() 実装です。

public override void Draw()
    {
        Viewport viewport = Graphics.MainDevice.Viewport;

        mShader.World = Matrix.CreateWorld(Center, Vector3.Forward, Vector3.Up);
        mShader.View = Matrix.CreateLookAt(new Vector3(viewport.Width / 2, viewport.Height / 2, -5f), Center, Vector3.Up);
        mShader.CurrentTechnique.Passes[0].Apply();

        Graphics.MainDevice.SetVertexBuffer(mVertexBuf);
        Graphics.MainDevice.Indices = mIndexBuf;

        Graphics.MainDevice.DrawIndexedPrimitives(PrimitiveType.LineStrip, 0, 0, NumVertices, 0, 2);
    }
4

1 に答える 1

1

ああ、あなたの問題が少なくとも 1 つあると思います。TriangleList ( PrimitiveTypeを参照) を描画しており、4 ではなく 6 つのインデックスが必要です。

とった。頂点/インデックスの順序が間違っていたようです。また、射影行列も表示されませんでした。

これが私にとってうまくいったコードです - 私がしたことは、射影行列を追加し、頂点を並べ替え、インデックスを変更し、プリミティブ数を修正することだけでした。

http://pastebin.com/tMKCxBLL

お役に立てれば!

于 2012-06-18T14:32:19.410 に答える