繁体   English   中英

如何在 C#/Csharp 和 XNA 中从单个 Class 中绘制两个对象?

[英]How do I draw two objects from a Single Class in C#/Csharp and XNA?

这是我的问题。 我有一个桨 class 和一个球 class。 两者都有更新、初始化和绘制方法。 问题出在我的桨 class 上。 我想在屏幕上画两个桨(每个都有不同的颜色),但我目前的代码不能正常工作。 结果是 4 个桨而不是两个(基本上是两个桨,下面还有两个)。

这是代码 - http://paste2.org/p/1390842

这是问题的截图 - http://img651.imageshack.us/img651/9092/pongshot.png

我不确定我做错了什么。 也许这是无法绘制两个不同的桨的情况? 我应该做第二个桨 class 吗?

这是我的 Game1.cs 文件 - http://paste2.org/p/1390854

还有我的球 class - http://paste2.org/p/1390856

在 Intialize/Draw 方法中,您正在为一个 object 绘制两个 Paddle。 将这些更改为:

       public void Initialize(Texture2D texture, Vector2 position)
       {
            pongPaddle1 = texture;

            //Set Paddle position
            paddle1Position = position;
       }


        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(pongPaddle1, paddle1Position, null, Color.DarkSlateBlue, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
        }

基本上从 class 中摆脱 Paddle2。 由于您在 Game1.cs 中创建了两个 Paddle 实例,因此您不需要在 paddle 内进行两次绘制。 这违背了数据对象的目的。 Game1.cs 中的每个实例都将调用 Draw() 方法,它们将自己绘制。

代表两个桨的单个桨 class 可能不是最佳设计,因为它打破了关注点分离的想法。 它关心两件事而不是一件事。 只需拥有 2 个单桨 class 实例,您的生活就会轻松很多。

如果您决定不使用 go 这条路线,那么您的问题出在 Game1 文件中。 您有 2 个处理两个桨的 class 实例。 参见初始化()。 如果你打算这样做,你应该只实例化 ONE。

在 Draw() 方法中,您还绘制了两次。 一个桨 class 代表 2 个桨,而不是一个。 因此,如果您不打算重构桨 class,那么您应该只再拥有一个桨实例。

这里发生了一些导致您的问题的事情:

  1. 您的桨 class 实际上似乎可以处理分开的桨。 你声明了这个 class 的两个实例,所以,基本上,你有四个桨
  2. 当您实例化一个新的 paddle 实例时,您将 pongPaddle1 和 pongPaddle2 设置为相同的坐标。 但是,您只能更新每个桨 object 的这些坐标集。 paddle1 只更新 pongPaddle1,同样适用于 paddle2。 pongPaddle2 和 pongPaddle1 永远不会分别从每个 object 的初始位置改变。
  3. .当您绘制 go 时,它会绘制 pongPaddle1 和 pongPaddle2 的内容。

我的建议是将您的桨 class 更改为具有单个position属性(而不是 pongPaddle1 和 pongPaddle2)并为每个桨保留一个单独的 object。 或者,您可以让桨 class 处理两个桨,但在主代码中只实例化一个 object。 因此,您可以使用 paddle 代替paddle1paddle2 ,然后分别为每个 paddle 更新pongPaddle1和 pongPaddle2。

此外,XNA 并不关心您的 object 绘图情况是什么。 如果您调用 Draw 方法,它只是将该图像数据复制到您告诉它的屏幕缓冲区。 您可以使用来自同一个 class 的不同参数多次调用它,它会显示每一个。

为什么不仅为桨 class 的每个实例绘制一个桨,而且只有 class 的两个实例?

class paddle
{
    public Vector2 paddlePosition;
    public Texture2D pongPaddle; 

    // Getting Paddle Height and Width

    public int Width
    {
        get { return pongPaddle.Width; }
    }


    public int Height
    {
        get { return pongPaddle.Height; }
    }


    public paddle(Texture2D texture, Vector2 position)
    {
        pongPaddle = texture;

        //Set Paddle position
        paddlePosition = position;
    }

    public void Update()
    {
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(pongPaddle, paddlePosition, null, Color.DarkSlateBlue, 0f, Vector2.Zero, 1f, SpriteEffects.None, 0f);
    }
}

初始化是这样的

Paddle p1 = new Paddle(texture1, location1);
Paddle p2 = new Paddle(texture2, location2);

然后调用draw

p1.Draw(spriteBatch);
p2.Draw(spriteBatch);

您似乎对 OO 原则的理解不是很深入。 如果您不想使用 C# 和 XNA,我建议您多练习 OO。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM