如何从c# /Csharp和XNA中的单个类中绘制两个对象

本文关键字:绘制 对象 两个 单个类 Csharp XNA | 更新日期: 2023-09-27 17:53:40

我的问题是。我有一个划桨班和一个球班。两者都有更新、初始化和绘制方法。问题是我的划桨课。我想在屏幕上绘制两个桨(每个桨的颜色不同),但我目前拥有的代码不能正确工作。结果是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

如何从c# /Csharp和XNA中的单个类中绘制两个对象

在你的initialize/Draw方法中,你为一个对象绘制两个桨。修改为:

       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()方法,它们将绘制自己。

用一个桨类来表示两个桨可能不是最好的设计,因为它破坏了关注点分离的思想。它关注的是两件事而不是一件事。简单地有两个实例的一个桨类将使您的生活更容易。

如果你决定不走这条路,你的问题是在Game1文件。你有两个类的实例,处理两个桨。看到initiliazation()。如果你要这样做,你应该只实例化一个。

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

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

  1. 你的桨类实际上似乎处理单独的桨。你声明了这个类的两个实例所以实际上,你有四个桨
  2. 当您实例化一个新的paddle实例时,您将pongPaddle1和pongPaddle2设置为相同的坐标。但是,您只更新每个桨对象的这些坐标集中的一个。paddle1只更新pongPaddle1, paddle2也是如此。对于每个对象,pongPaddle2和pongPaddle1的初始位置永远不会改变。
  3. 当你去绘制时,它会为每个对象绘制pongPaddle1和pongPaddle2 处的内容

我的建议是要么改变你的桨类有一个单一的位置属性(而不是pongPaddle1和pongPaddle2),并保持一个单独的对象为每个桨。或者,您可以让paddle类处理两个桨,但在主代码中只处理一个实例化对象。所以,代替paddle1paddle2,你可以有,然后分别为每个桨更新pongPaddle1和pongPaddle2。

同时,XNA并不关心你的对象绘图情况是什么。如果你调用Draw功能,它会把那个图像数据复制到你让它去的屏幕缓冲区。你可以用同一个类的不同参数调用这个函数,它会显示每一个参数

为什么不为每个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);
    }
}

Initialize是这样的

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

然后调用draw

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

你似乎对面向对象的原则没有很强的理解。如果你不想使用c#和XNA,我建议你多练习OO。