2013-02-07 34 views
0

我一直在苦苦思索很久。稍後在XNA的遊戲中創建一個DrawableGameComponent的實例

我有我的主要遊戲類稱爲的Game1DrawableGameComponent -inherited ShowUp類稱爲myShowUp

通常的方法是myShowUp添加組件到遊戲1對象所以它是遊戲的一部分(直接在遊戲1初始化方法)如下:

class Game1 : Microsoft.Xna.Framework.Game 
{ 
    ShowUp myShowUp; 

    ... 

    protected override Initialize() 
    { 
     this.myShowUp = new ShowUp(this); 
     this.Components.Add(this.myShowUp); 
    } 
    ... 
} 

該方法不工作和myShowUp被示出,併成爲在遊戲中一個獨立的對象。

我想什麼是實例化,並在遊戲中的對象列表中添加對象後

這是我嘗試(在窗口點擊後如):

class Game1 : Microsoft.Xna.Framework.Game 
{ 
    MouseState myMouseState; 

    ... 

    ... 

    protected override void Update(GameTime gameTime) 
    { 
     myMouseState = Mouse.GetState(); 

     if (myMouseState.LeftButton == ButtonState.Pressed) 
     { 
      this.myShowUp = new ShowUp(this); // Nothing 
      this.Components.Add(this.myShowUp); // Happens.. 
     } 

     base.Update(gameTime); 
    } 

    ... 
} 

我發現一個方法到目前爲止,我只是保持第一種語法(即保持instanciation到Initialize方法)並定義一個布爾型到ShowUp類名爲激活。 如果激活是真的我執行說明顯示它,否則什麼也沒有。 在我遊戲對象我的更新方法,我稱之爲激活()如果myShowUp我的左按鈕被按下的激活變量更改爲true。

這種方法可行,但我不是很滿意,我希望它會是那樣簡單,只是在我遊戲對象實例化對象的任何地方的代碼,使他們中的一部分。 有沒有辦法做到這一點?

喜歡的東西:

class Game1 : Microsoft.Xna.Framework.Game 
{ 
    ShowUp myShowUp; 
    MouseState myMouseState; 

    ... 

    ... 

    protected override Initialize() 
    { 
     this.Components.Add(this.myShowUp); 
    } 

    ... 

    protected override void Update(GameTime gameTime) 
    { 
     myMouseState = Mouse.GetState(); 

     if (myMouseState.LeftButton == ButtonState.Pressed) 
     { 
      this.myShowUp = new ShowUp(this); 
     } 

     base.Update(gameTime); 
    } 

    ... 
} 

這將是很好的。

+0

看着文檔,沒有任何地方說你不能做你想做的事情 - 它並不是說你需要在'遊戲'的'Initialise'方法中添加一個組件。我注意到你正在分配'this.myShowUp' - 是否有任何理由將它分配給子類'Game'實例的成員?你可以發佈你的'Game1'類的'Draw'代碼和'ShowUp'類的代碼,因爲我有一個想法可能是什麼問題 – Charleh

+0

@Charleh在* Game1 * * Draw *方法中,我沒有沒有任何東西,事實上添加組件this.myShowUp到遊戲(即this.Components.Add(this.myShowUp))使我們有可能重寫DrawableGameComponent中的Draw方法(因爲將一個新線程繪製到全局畫布中) – user544262772

+0

'ShowUp'怎麼樣 - 它怎麼知道畫什麼?如果不重寫'Draw'方法,DrawableGameComponent是否會繪製佔位符?你是否重寫了'DrawableGameComponent.Draw'?我還沒有碰過XNA一段時間 - 你可以發佈你的ShowUp代碼嗎? – Charleh

回答

1

你的代碼有一個小錯誤。您將創建組件的多個實例 - 每次更新一個實例。這是因爲在創建組件之前,您不檢查之前的鼠標狀態是Released還是myShowUp爲空。下面是一些測試工作的代碼(即檢查兩個條件):

MouseState lastMouseState; 

protected override void Update(GameTime gameTime) 
{ 
    MouseState mouseState = Mouse.GetState(); 

    if(mouseState.LeftButton == ButtonState.Pressed 
      && lastMouseState.LeftButton == ButtonState.Released 
      && myShowUp == null) 
    { 
     Components.Add(myShowUp = new ShowUp(this)); 
    } 

    lastMouseState = mouseState; 

    base.Update(gameTime); 
} 

當然 - 我不知道爲什麼這個bug會導致ShowUp到根本不顯示 - 當你正在創建它的多個實例 - 你」我期望能夠看到它。您的ShowUp組件中可能存在錯誤。

對於它的價值,這裏是我測試的代碼:

class ShowUp : DrawableGameComponent 
{ 
    public ShowUp(Game game) : base(game) { } 

    Texture2D texture; 
    SpriteBatch sb; 

    protected override void LoadContent() 
    { 
     sb = new SpriteBatch(GraphicsDevice); 
     texture = this.Game.Content.Load<Texture2D>("test"); 
     base.LoadContent(); 
    } 

    public override void Draw(GameTime gameTime) 
    { 
     sb.Begin(); 
     sb.Draw(texture, new Vector2(100), Color.White); 
     sb.End(); 
     base.Draw(gameTime); 
    } 
} 

需要注意的是,Game.Initialize運行後添加組件將導致組件的InitializeLoadContent方法儘快運行它被添加到Components集合中。

需要注意的是,以備將來參考,DrawableGameComponent已經自帶了EnabledVisible特性 - 讓您分別跳過UpdateDraw該實例。

+0

它適合你嗎?我甚至按照你的編碼結構,但仍然沒有任何反應,這裏是我的代碼的pastebins。 – user544262772

+0

Game1.cs:http://pastebin.com/ts5RjiAb – user544262772

+0

ShowUp.cs:http://pastebin.com/dFL2Xjmi – user544262772