2011-04-29 20 views
2

這是我的問題。我有一個槳班和一個球類。兩者都有更新,初始化和繪製方法。問題在於我的槳班。我想在屏幕上繪製兩個划槳(每個划槳都是不同的顏色),但是我目前的代碼無法正常工作。結果是4個槳而不是2個(基本上是兩個槳,下面還有兩個槳)。如何在C#/ Csharp和XNA中從單個類中繪製兩個對象?

下面的代碼 - http://paste2.org/p/1390842

而這裏的問題的屏幕截圖 - http://img651.imageshack.us/img651/9092/pongshot.png

我不確定什麼我做錯了。也許這是一個無法繪製兩個不同的槳的情況?我應該換一個槳班嗎?

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

而且我的球類 - http://paste2.org/p/1390856

+0

您應該有一個Paddle類來表示槳,並創建這些對象中的兩個。 – 2011-04-29 17:05:04

+0

我有一個Paddle類。這是我鏈接到的第一個代碼。我試圖繪製兩個對象,但它似乎沒有正常工作。這是我第一次嘗試從一個類中繪製多個對象,所以是的。 – Slateboard 2011-04-29 17:08:39

+0

請勿在一個對象中繪製多個對象。將每個槳作爲自己的對象。 – 2011-04-29 17:31:13

回答

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實例,因此您不需要在槳內有兩個繪圖。這種做法違背了數據對象的目的。 Game1.cs中的每個實例都將調用Draw()方法,並且它們將繪製自己。

+0

通過這樣做,我可以單獨更改每個實例嗎?或者會使更改影響所有實例? – Slateboard 2011-04-29 17:44:18

+0

您將可以單獨更改每個實例。所以如果你想修改paddle1的位置,你只需要做Paddle1.Position = blah..blah ..然後爲Paddle2做Paddle2.Position = blah..blah .. – cush 2011-04-29 17:46:43

1

單槳類可能同時代表撥片是不是最好的設計,因爲它打破了分離 - 的想法關注。它關心的是兩件事而不是一件事。只有2個單槳類的實例會讓你的生活變得更加簡單。

如果您決定不走這條路線,您的問題在Game1文件中。你有兩個同時處理兩個槳的類的實例。請參閱initiliazation()。如果你打算這樣做,你只應該實例化一個。

在Draw()方法中,您還繪製兩次。 Paddle類代表2個槳,而不是一個。所以如果你不打算重構paddle類,你應該只有一個paddle實例。

1

有幾件事情發生在這裏的造成您的問題:

  1. 你的槳類實際上似乎處理分離槳。你聲明瞭這個類的兩個實例,實質上,你有四個槳
  2. 當你實例化一個槳的新實例時,你將pongPaddle1和pongPaddle2設置爲相同的座標。但是,您只更新每個槳對象的這些座標集。 paddle1只更新pongPaddle1,對於paddle2也是如此。 pongPaddle2和pongPaddle1不會分別從每個對象的初始位置改變。
  3. 當你去繪畫時,它會繪製每個物體的pongPaddle1和pongPaddle2 的內容。

我的建議是要麼改變你的槳類,以便(而不是pongPaddle1和pongPaddle2)奇異位置財產,並保持一個獨立的對象爲每個槳。或者,您可以讓槳類處理兩個槳,但在主代碼中只有一個實例化對象。因此,代替paddle1paddle2您可能有,然後分別更新每個槳的pongPaddle1和pongPaddle2。

另外,XNA並不關心你的繪圖對象情況。如果您調用Draw方法,它只是將該圖像數據複製到您告訴它的屏幕緩衝區。您可以根據需要多次調用此參數,並使用來自同一個類的不同參數,並且會顯示每個參數。

1

爲什麼不僅爲槳類的每個實例繪製一個槳,並且只有兩個類的實例?

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。

+0

是的,這就是這一點。 – Slateboard 2011-04-29 18:43:52

相關問題