声音按钮不';t播放声音

本文关键字:播放声音 按钮 声音 | 更新日期: 2023-09-27 18:27:47

我正在制作一个程序,可以点击按钮来创建声音,就像那些即时按钮应用程序一样。但当我点击按钮时,它不会播放任何声音。我也不知道为什么。我所有的"构建"调试也都成功了。

这些是我的课程:

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

按钮:

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

但我无法让它发挥作用。如有任何帮助,我们将不胜感激。

声音按钮不';t播放声音

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

我认为你也可以把你的按钮更新逻辑转移到类中,所以我会建议你需要做什么。

公共类按钮{//属性private Texture2D纹理{get;set;}private SoundEffect声音{get;set;}private矩形矩形{get;set;}

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())(或者使用另一个鼠标状态,如果你已经有了)

看起来绘图位置与按钮的实际位置(在绘图方法中)有一些混淆

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

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

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

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