这是我的问题。我有一个桨类和一个球类。两者都有更新,初始化和绘制方法。问题出在我的桨类上。我想在屏幕上绘制两个拨片(每个都有不同的颜色),但我目前的代码无法正常工作。结果是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
答案 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)
这里发生了一些导致问题的事情:
我的建议是将您的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。