如何从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
在你的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实例。
这里发生的一些事情会导致您的问题:
- 你的桨类实际上似乎处理单独的桨。你声明了这个类的两个实例所以实际上,你有四个桨
- 当您实例化一个新的paddle实例时,您将pongPaddle1和pongPaddle2设置为相同的坐标。但是,您只更新每个桨对象的这些坐标集中的一个。paddle1只更新pongPaddle1, paddle2也是如此。对于每个对象,pongPaddle2和pongPaddle1的初始位置永远不会改变。
- 当你去绘制时,它会为每个对象绘制pongPaddle1和pongPaddle2 处的内容
我的建议是要么改变你的桨类有一个单一的位置属性(而不是pongPaddle1和pongPaddle2),并保持一个单独的对象为每个桨。或者,您可以让paddle类处理两个桨,但在主代码中只处理一个实例化对象。所以,代替paddle1和paddle2,你可以有桨,然后分别为每个桨更新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。