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

C# 如何在C/Csharp和XNA中从一个类中绘制两个对象?,c#,xna,C#,Xna,这是我的问题。我有一节划桨课和一节球类课。两者都有更新、初始化和绘制方法。问题是我的划桨课。我想在屏幕上画两个不同颜色的划片,但是我现在的代码不能正常工作。结果是四个桨,而不是两个基本上是两个桨,下面还有两个 这是密码- 这是问题的截图- 我不确定我做错了什么。也许是因为不能画两个不同的桨?我应该改上第二节划桨课吗 这是我的Game1.cs文件- 我的Ball类-一个代表两个桨的单桨类可能不是最好的设计,因为它打破了关注点分离的想法。它关注两件事,而不是一件事。只要有两个单一的桨类实例,将使你的

这是我的问题。我有一节划桨课和一节球类课。两者都有更新、初始化和绘制方法。问题是我的划桨课。我想在屏幕上画两个不同颜色的划片,但是我现在的代码不能正常工作。结果是四个桨,而不是两个基本上是两个桨,下面还有两个

这是密码-

这是问题的截图-

我不确定我做错了什么。也许是因为不能画两个不同的桨?我应该改上第二节划桨课吗

这是我的Game1.cs文件-


我的Ball类-

一个代表两个桨的单桨类可能不是最好的设计,因为它打破了关注点分离的想法。它关注两件事,而不是一件事。只要有两个单一的桨类实例,将使你的生活更容易

如果你决定不走这条路,你的问题就在Game1文件中。您有两个处理两个桨的类实例。参见初始化。如果要这样做,您应该只实例化一个


在“绘制”方法中,也要绘制两次。一个桨类代表两个桨,而不是一个。因此,如果您不打算重构Paile类,那么您应该只拥有一个Paile实例

在初始化/绘制方法中,您正在为一个对象绘制两个挡板。将这些更改为:

       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);
        }

基本上从课堂上去掉了第二个。由于您在Game1.cs中创建了两个桨实例,所以您不需要在桨内有两个平局。这样做会破坏数据对象的用途。Game1.cs中的每个实例都将调用Draw方法,并自行绘制。

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

您的桨类实际上似乎可以处理单独的桨。你声明了这个类的两个实例,所以,本质上,你有四个桨 实例化新的Pable实例时,将pongPaddle1和pongPaddle2设置为相同的坐标。但是,仅更新每个桨对象的这些坐标集中的任意一个。Pavel1仅更新pongPaddle1,Pavel2也同样如此。pongPaddle2和pongPaddle1不会分别从每个对象的初始位置更改。 当您转到“绘制”时,它会为每个对象绘制pongPaddle1和pongPaddle2处的内容。 我的建议是要么将您的桨类更改为具有单数位置属性,而不是pongPaddle1和pongPaddle2,并为每个桨保留一个单独的对象。或者,您可以让Padle类处理两个桨,但在主代码中只能处理一个实例化对象。因此,您可以使用桨,而不是桨1和桨2,然后分别为每个桨更新pongPaddle1和pongPaddle2


此外,XNA并不关心绘图的对象情况。如果调用Draw方法,它只是将图像数据复制到屏幕缓冲区中,然后告诉它。您可以使用同一个类中的不同参数调用此函数任意多次,它将显示每个参数。

为什么不为每个桨类实例绘制一个桨,而只为该类的两个实例绘制一个桨

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);
然后叫抽签

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

您似乎对OO原则没有很强的理解。如果你不想与C和XNA合作,我建议你多练习OO

您应该有一个桨类来表示桨,并创建其中两个对象。我有一个桨类。这是我链接到的第一个代码。我试着画两个物体,但它似乎不能正常工作。这是我第一次尝试从一个类中绘制多个对象,所以是的。不要在一个对象中绘制多个对象。将每个桨作为自己的对象。在这个问题上+1用于提供代码和屏幕截图,以帮助每个人理解问题。这样做总是很好的。通过这样做,我将能够分别对每个实例进行更改?或者更改会影响所有实例吗?您将能够单独更改每个实例。所以,如果你想修改划桨1的位置,你只需要执行划桨1.position=blah..blah。。然后划桨2.位置=诸如此类..诸如此类。。第二个。