0

我正在制作一个程序,单击按钮即可创建声音,例如那些即时按钮应用程序。但是当我单击按钮时,它不会播放任何声音。我也不知道为什么。我所有的“构建”调试也都成功了。

这些是我的课:

游戏1.cs:

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D Background;
    Button button;



    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        this.Window.Title = "Bengt Slår På Knappar";
        graphics.PreferredBackBufferHeight = 720;
        graphics.PreferredBackBufferWidth = 1280;
        IsMouseVisible = true;
    }

    /// <summary>
    /// Allows the game to perform any initialization it needs to before starting to run.
    /// This is where it can query for any required services and load any non-graphic
    /// related content.  Calling base.Initialize will enumerate through any components
    /// and initialize them as well.
    /// </summary>
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here

        base.Initialize();
    }

    /// <summary>
    /// LoadContent will be called once per game and is the place to load
    /// all of your content.
    /// </summary>
    protected override void LoadContent()
    {
        Background = Content.Load<Texture2D>("bengtbakgrund");
        Texture2D Btexture = Content.Load<Texture2D>("Button");
        SoundEffect dundundun = Content.Load<SoundEffect>("DUN DUN DUN");
        button = new Button(dundundun, Btexture);

        spriteBatch = new SpriteBatch(GraphicsDevice);


    }

    /// <summary>
    /// UnloadContent will be called once per game and is the place to unload
    /// all content.
    /// </summary>
    protected override void UnloadContent()
    {
        // TODO: Unload any non ContentManager content here
    }

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
        Rectangle mouseRect = new Rectangle(Mouse.GetState().X, Mouse.GetState().Y, 10, 10);
        MouseState mouseState = Mouse.GetState();


        if (mouseRect.Intersects(button.rect) && mouseState.LeftButton == ButtonState.Pressed)
        {
            button.MySound.Play();
        }

        base.Update(gameTime);
    }


    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);

        spriteBatch.Begin();
        spriteBatch.Draw(Background, new Vector2(0,0), Color.White);
        button.Draw(spriteBatch, new Vector2(300, 300));
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

按钮.cs:

public class Button
{

    Texture2D Texture { get; set; }
    public SoundEffect MySound { get; set; }
    public Rectangle rect;


    public Button(SoundEffect mySound, Texture2D texture)
    {
        MySound = mySound;
        Texture = texture;
    }

    public void LoadContent(ContentManager Content)
    {

    }

    public void Update(GameTime gameTime)
    {

    }

    public void Draw(SpriteBatch spriteBatch, Vector2 location)
    {
        Rectangle rect = new Rectangle((int)0, (int)0, Texture.Width, Texture.Height);

        spriteBatch.Draw(Texture, location, Color.White);
    }
}

我想要做的是有一个基本按钮类,所以如果你想添加一个带有声音的新按钮,你只需写:button = new Button(//sound effect, //texture);

但我无法让它工作。任何帮助,将不胜感激。

4

1 回答 1

0

您处理按钮位置的方式不正确,我不确定它是如何编译的。rect在您的 draw 方法中,您定义了一个已经存在的局部变量。即使这样做了,您也没有考虑到按钮的实际位置。

我认为你也可以将你的按钮更新逻辑移动到类中,所以我会提出我认为你需要做的事情。

public class Button { //属性 private Texture2D Texture { get; 放; } 私人 SoundEffect 声音 { 获取;放; } 私人矩形矩形 { 得到;放; }

public Button(SoundEffect sound, Texture2D texture, Rectangle position)
{
    Sound = sound;
    Texture = texture;
    Rectangle = position;
}

public void Update(GameTime gameTime, MouseState mouseState)
{
      //If mouse is down and the rectangle contains the mouse point (Better for points than Intersect())
      if (mouseState.LeftButton == ButtonState.Pressed && Rectangle.Contains(new Point(mouseState.X,mouseState.Y))
      {
           Sound.Play()
      }
}

public void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(Texture, rectangle, Color.White);
}

}

然后你可以做button.Update(Mouse.GetState())(​​或者如果你已经有另一个 MouseState)

绘图位置与按钮的实际位置(在绘图方法中)似乎有些混淆

你需要确保按钮知道它在屏幕上的位置,以及它的宽度和高度。

button = new Button(dundundun, Btexture, new Rectangle(300, 300, Btexture.Width, Btexture.Height);

这将使按钮位于300,500并成为纹理的默认大小,现在您的声音按钮已完成:)

我还建议学习和使用事件处理程序,这样您就可以button.Click += //Do something轻松地为按钮添加事件

于 2013-08-15T23:14:37.603 回答