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

时间:2011-04-29 17:01:43

标签: c# xna

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

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

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

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

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

我的Ball课程 - http://paste2.org/p/1390856

4 个答案:

答案 0 :(得分:2)

在您的Intialize / Draw方法中,您正在为一个对象绘制两个Paddles。将这些更改为:

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

基本上从课堂上摆脱Paddle2。由于您在Game1.cs中创建了两个Paddle实例,因此您无需在paddle中进行两次绘制。这种方式破坏了数据对象的目的。

中,Game1.cs中的每个实例都会调用Draw()方法,并自行绘制。

答案 1 :(得分:1)

代表BOTH桨的单个桨类可能不是最好的设计,因为它打破了关注点分离的想法。它关注的是两件事,而不是一件事。只需2个单桨类的实例就可以让您的生活变得更轻松。

如果您决定不去那条路线,那么您的问题就在Game1文件中。你有2个类的实例处理两个拨片。参见initiliazation()。如果你打算这样做,你应该只实例化一个。

在Draw()方法中,您还要绘制两次。 Paddle类代表2个桨,而不是一个。因此,如果您不打算重写桨类,那么您应该只有一个桨的实例。

答案 2 :(得分:1)

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

  1. 您的桨类实际上似乎处理单独的拨片。你要声明这个类的两个实例,所以基本上你有四个桨
  2. 当您实例化paddle的新实例时,将pongPaddle1和pongPaddle2设置为相同的坐标。但是,您只更新每个桨对象的这些坐标集。 paddle1仅更新pongPaddle1,同样更新paddle2。 pongPaddle2和pongPaddle1永远不会从每个对象的初始位置改变。
  3. 当你去绘画时,它会为每个对象绘制pongPaddle1和pongPaddle2 的内容
  4. 我的建议是将您的paddle类更改为具有单个位置属性(而不是pongPaddle1和pongPaddle2),并为每个paddle保留一个单独的对象。或者,您可以让paddle类处理两个paddles,但只能在主代码中处理一个实例化对象。因此,您可以使用 paddle 代替 paddle1 paddle2 ,然后分别为每个paddle更新pongPaddle1和pongPaddle2。

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

答案 3 :(得分:1)

为什么不为每个paddle类实例绘制一个paddle,只有两个类的实例?

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。