3

私は現在、書いているゲームの「テストプレーヤー」として小惑星テクスチャをロードしています。私がやろうとしているのは、小惑星の中心から三角形を撃ち、それが画面の上部に当たるまで続けることです。私の場合(私が投稿したコードからわかるように)、三角形が表示されますが、長い線になるか、同じ場所にとどまる単一の三角形になります。小惑星が動き回るとき(スペースバーを押すのをやめると消えます)、または単にまったく表示されません。私はさまざまな方法を試しましたが、ここで数式を使用できます。

私がやろうとしているのは、C#でのファイナル用のスペースインベーダークローンを作成することだけです。私はかなりうまくコーディングする方法を知っています、私の式はただ仕事が必要なだけです。

これまでのところ、これは私が持っているものです:

メインロジックコード

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(ClearOptions.Target, Color.Black, 1, 1);

    mAsteroid.Draw(mSpriteBatch);

    if (mIsFired)
    {
        mPositions.Add(mAsteroid.LastPosition);
        mRay.Fire(mPositions);
        mIsFired = false;
        mRay.Bullets.Clear();
        mPositions.Clear();
    }

    base.Draw(gameTime);
}

コードを描く

public void Draw()
{
    VertexPositionColor[] vertices = new VertexPositionColor[3];

    int stopDrawing = mGraphicsDevice.Viewport.Width / mGraphicsDevice.Viewport.Height;

    for (int i = 0; i < mRayPos.Length(); ++i)
    {
        vertices[0].Position = new Vector3(mRayPos.X, mRayPos.Y + 5f, 10);
        vertices[0].Color = Color.Blue;
        vertices[1].Position = new Vector3(mRayPos.X - 5f, mRayPos.Y - 5f, 10);
        vertices[1].Color = Color.White;
        vertices[2].Position = new Vector3(mRayPos.X + 5f, mRayPos.Y - 5f, 10);
        vertices[2].Color = Color.Red;

        mShader.CurrentTechnique.Passes[0].Apply();
        mGraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.TriangleStrip, vertices, 0, 1);

        mRayPos += new Vector2(0, 1f);

        mGraphicsDevice.ReferenceStencil = 1;
    }
}
4

1 に答える 1

3

これは、ワールドスペースでモデルの位置を操作することになっている方法ではありません。また、描画フレームごとに新しい頂点配列を作成しているため、さらに描画するようになると、パフォーマンスがかなり低下することがわかります。いくつかの三角形より。

LoadContentメソッドで、三角形の頂点とインデックスリストを1回だけ宣言します。

VertexBuffer triangleVertexBuffer;
IndexBuffer triangleIndexBuffer;

protected override void LoadContent()
{
    // Setup a basic effect to draw the triangles with.
    mEffect = new BasicEffect(GraphicsDevice);

    // setup the triangle vertext buffer and load up it's content.
    triangleVertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor), 3, BufferUsage.WriteOnly);
    triangleVertexBuffer.SetData<VertexPositionColor>(new VertexPositionColor[] 
    {
        new VertexPositionColor (new Vector3 (0f, -1f, 0.0f), Color.Blue),  // Top Point
        new VertexPositionColor (new Vector3 (-1f, 1f, 0.0f), Color.White), // Bottom Left
        new VertexPositionColor (new Vector3 (1f, 1f, 0.0f), Color.Red),    // Bottom Right
    });

    // setup an index buffer to join the dots!
    triangleIndexBuffer = new IndexBuffer(GraphicsDevice, IndexElementSize.SixteenBits, 3, BufferUsage.WriteOnly);
    triangleIndexBuffer.SetData<short>(new short[]
    { 
        0, 
        1, 
        2, 
    });
}

この後、エフェクトがワールド変換を考慮に入れると仮定すると(基本エフェクトは考慮します)、そのパラメーターを使用して三角形を移動できます。

 protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            for (int i = 0; i < mRayPos.Length ; i++)
            {
                // This is the line that moves the triangle along your ray.
                mEffect.World = Matrix.CreateTranslation(new Vector3(mRayPos[i].X, mRayPos[i].Y, mRayPos[i].Z));
                mEffect.Techniques[0].Passes[0].Apply();

                // These lines tell the graphics card that you want to draw your triangle.
                GraphicsDevice.SetVertexBuffer(triangleVertexBuffer);
                GraphicsDevice.Indices = triangleIndexBuffer;
                GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 3, 0, 1);
            }

            base.Draw(gameTime);
        }

この方法を使用すると、Matrix.CreateRotationおよびMatrix.CreateScaleを使用してトラングルを回転またはスケーリングするのは非常に簡単な操作になります。

于 2012-05-31T08:40:08.637 に答える