C#XNA从GameComponent

时间:2015-12-11 11:17:35

标签: c# xna drawablegamecomponent

public class Menu : DrawableGameComponent
{
    ContentManager Content;
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Audio MenuMusic;

    public Menu(Game game) : base(game)
    {
        spriteBatch = Game.Services.GetService(typeof(SpriteBatch)) as SpriteBatch;
        graphics = Game.Services.GetService(typeof(GraphicsDeviceManager)) as GraphicsDeviceManager;

        Content = game.Content;
        Content.RootDirectory = @"Content\Menu\";

        *MenuMusic =  new Audio(game);* // Instantiate the new DrawableGameComponent

        Game.Components.Add(this);

        MenuMusic.PauseTune = false;
    }

    public override void Initialize()
    {
        Menustate = MenuState.LoadContent;
        base.Initialize();
    }

    protected override void LoadContent()
    {
         base.LoadContent();
    }

    protected override void UnloadContent()
    {
        base.UnloadContent();
    }

    public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime)
    {
        base.Draw(gameTime);
    }
}

public class Audio : DrawableGameComponent
{

    public bool PauseTune
    {
        get { return PauseTune; }
        set { PauseTune = value; }
    }

    SoundEffect Tune = null;
    SoundEffectInstance SFXInstance;

    public Audio(Game game) : base(game)
    {
        *game.Components.Add(this)*;// This is the problem. It adds an entirely new Game object. :(
    }

    public override void Initialize()
    {
        PauseTune = true;

        base.Initialize();
    }

    protected override void LoadContent()
    {
        switch (Game1.Gamestate)
        {
            case GameState.Menu:
                string AudioPath = @"Audio\";
                Tune = Game.Content.Load<SoundEffect>(AudioPath + "Tune");
                break;
            case GameState.InitialiseGame:
                break;
            case GameState.PlayGame:
                break;
            default:
                break;
        }

        if (Tune != null) SFXInstance = Tune.CreateInstance();

        base.LoadContent();
    }

    protected override void UnloadContent()
    {
        base.UnloadContent();
    }

    public override void Update(GameTime gameTime)
    {
        if (Tune != null)
        {
            if (PauseTune)
            {
                if (SFXInstance.State == SoundState.Playing)
                    SFXInstance.Pause();
            }
            else
            {
                if (SFXInstance.State != SoundState.Playing)
                    SFXInstance.Play();
            }
        }
        base.Update(gameTime);
    }

    public override void Draw(GameTime gameTime)
    {
        base.Draw(gameTime);
    }
}

当我使用Menu添加一个新的Audio类实例时,我会发出一个探测器。 Audio构造函数尝试添加新的GameCompent但失败了。 它实际上做的是创建一个全新的Game实例,然后继续实例化一个新的Menu,试图添加一个新的Audio类实例.....直到我最终得到一个 - 你会相信吗? - stackoverflow错误。

我做错了什么? /如何在另一个组件中添加一个组件?

1 个答案:

答案 0 :(得分:1)

DOH!有些日子我永远不应该打开我的电脑:)

或者更好 - 经过漫长而疲惫的一天之后,不要乱用我的代码。

自引用PauseTune属性。