c# - 如何从一直漂浮到屏幕上的小行星射出一个三角形?

标签 c# vector xna drawing

我目前加载了一个小行星纹理作为我正在编写的游戏的“测试玩家”。我想要弄清楚如何做的是让一个三角形从小行星的中心发射,并继续前进直到它到达屏幕顶部。在我的情况下(正如您从我发布的代码中看到的那样),会显示三角形,但它要么是一条长线,要么只是一个保持在同一位置的三角形随着小行星四处移动(当我停止按空格键时它会消失),或者它根本不会出现。我尝试了很多不同的方法,但我可以在这里使用一个公式。

我想做的就是用 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;
    }
}

最佳答案

这不是您应该如何在世界空间中操纵模型的位置,并且由于您要在每个绘制帧中创建一个新的顶点数组,您会发现它在您来时表现得非常糟糕绘制多个三角形。

在 LoadContent 方法中只声明一次三角形的顶点和索引列表。

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 旋转或缩放您的 trangle 将变得非常简单。

关于c# - 如何从一直漂浮到屏幕上的小行星射出一个三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10827142/

相关文章:

c++ - 将 C++ std::vector<std::string> 转换为 std::vector<unsigned char> (反之亦然)

c# - Monogame - 改变 Sprite 的大小

c# - 我可以在 C# 中重载条件运算符吗?

c# - 如何在 Asp.net MVC4 中避免 PostBack

c++ - Cin 整数与空间问题

c++ - 如何将 vector 字符串的值更改为不同的字符串值?

ios - XNA Development for iOS 是否可行? XNATouch 是 iPhone 唯一好的 XNA 实现吗?

c# - 使用 Kinect 深度 View 显示人体内部的物体

c# - C# 中的事务并发

C# 错误 "Attempted to read or write protected memory"或 "External component has thrown an exception"