簡體   English   中英

如何在 C#/Csharp 和 XNA 中從單個 Class 中繪制兩個對象?

[英]How do I draw two objects from a Single Class in C#/Csharp and XNA?

這是我的問題。 我有一個槳 class 和一個球 class。 兩者都有更新、初始化和繪制方法。 問題出在我的槳 class 上。 我想在屏幕上畫兩個槳(每個都有不同的顏色),但我目前的代碼不能正常工作。 結果是 4 個槳而不是兩個(基本上是兩個槳,下面還有兩個)。

這是代碼 - http://paste2.org/p/1390842

這是問題的截圖 - http://img651.imageshack.us/img651/9092/pongshot.png

我不確定我做錯了什么。 也許這是無法繪制兩個不同的槳的情況? 我應該做第二個槳 class 嗎?

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

還有我的球 class - http://paste2.org/p/1390856

在 Intialize/Draw 方法中,您正在為一個 object 繪制兩個 Paddle。 將這些更改為:

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

基本上從 class 中擺脫 Paddle2。 由於您在 Game1.cs 中創建了兩個 Paddle 實例,因此您不需要在 paddle 內進行兩次繪制。 這違背了數據對象的目的。 Game1.cs 中的每個實例都將調用 Draw() 方法,它們將自己繪制。

代表兩個槳的單個槳 class 可能不是最佳設計,因為它打破了關注點分離的想法。 它關心兩件事而不是一件事。 只需擁有 2 個單槳 class 實例,您的生活就會輕松很多。

如果您決定不使用 go 這條路線,那么您的問題出在 Game1 文件中。 您有 2 個處理兩個槳的 class 實例。 參見初始化()。 如果你打算這樣做,你應該只實例化 ONE。

在 Draw() 方法中,您還繪制了兩次。 一個槳 class 代表 2 個槳,而不是一個。 因此,如果您不打算重構槳 class,那么您應該只再擁有一個槳實例。

這里發生了一些導致您的問題的事情:

  1. 您的槳 class 實際上似乎可以處理分開的槳。 你聲明了這個 class 的兩個實例,所以,基本上,你有四個槳
  2. 當您實例化一個新的 paddle 實例時,您將 pongPaddle1 和 pongPaddle2 設置為相同的坐標。 但是,您只能更新每個槳 object 的這些坐標集。 paddle1 只更新 pongPaddle1,同樣適用於 paddle2。 pongPaddle2 和 pongPaddle1 永遠不會分別從每個 object 的初始位置改變。
  3. .當您繪制 go 時,它會繪制 pongPaddle1 和 pongPaddle2 的內容。

我的建議是將您的槳 class 更改為具有單個position屬性(而不是 pongPaddle1 和 pongPaddle2)並為每個槳保留一個單獨的 object。 或者,您可以讓槳 class 處理兩個槳,但在主代碼中只實例化一個 object。 因此,您可以使用 paddle 代替paddle1paddle2 ,然后分別為每個 paddle 更新pongPaddle1和 pongPaddle2。

此外,XNA 並不關心您的 object 繪圖情況是什么。 如果您調用 Draw 方法,它只是將該圖像數據復制到您告訴它的屏幕緩沖區。 您可以使用來自同一個 class 的不同參數多次調用它,它會顯示每一個。

為什么不僅為槳 class 的每個實例繪制一個槳,而且只有 class 的兩個實例?

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM