soundeffect, XNA 4.0

155 views Asked by At

This is the first time I program a game, I want to creat a sound effect on each time I shot a missile, not playing the sound when the missile is on the screen, just right after the character shooted it. Here is the code. Please help me, I tried to do it the whole night :

class Player
{
    Texture2D hero;
    Vector2 hero_location;
    KeyboardState hero_movement;
    int missileREA;
    public List<adw> missiles = new List<adw>();
    ContentManager takeContent;

    public void LoadContent(ContentManager Content)
    {
        hero = Content.Load<Texture2D>("F5S4");
        hero_location = Vector2.Zero;
        takeContent = Content;
    }
    public void ShootMissiles(GameTime gameTime)
    {
        adw missile = new adw();
        missile.LoadContent(takeContent);
        missile.missile_location = hero_location + new Vector2(hero.Width /2,-50);
        missiles.Add(missile);
        shot = missiles;
    }

    public void Update(GameTime gameTime)
    {
        hero_movement = Keyboard.GetState();

        if (hero_movement.IsKeyDown(Keys.W))
        {
            hero_location.Y -= 5;
        }
        if (hero_movement.IsKeyDown(Keys.D))
        {
            hero_location.X += 5;
        }
        if (hero_movement.IsKeyDown(Keys.S))
        {
            hero_location.Y += 3;
        }
        if (hero_movement.IsKeyDown(Keys.A))
        {
            hero_location.X -= 5;
        }
        if (hero_movement.IsKeyDown(Keys.NumPad1))
        {
            missileREA += gameTime.ElapsedGameTime.Milliseconds;
            if (missileREA > 200)
            {
                missileREA = 0;
                ShootMissiles(gameTime);
            }
        }
        foreach (adw missile in missiles)
        {
            missile.Update(gameTime);
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(hero, hero_location, Color.White);
        foreach (adw missile in missiles)
        {
            missile.Draw(spriteBatch);
        }
    }

    public IEnumerable<adw> ShootMissile { get; set; }

    public List<adw> shot { get; set; }
}

This is my Game1.cs, where all of my contents are loaded and drawn to the screen under my control.

{ 
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Player player;
    SoundEffect missile1;
    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {

        player = new Player();
        graphics.PreferredBackBufferWidth = 1024;
        graphics.PreferredBackBufferHeight = 680;
        graphics.ApplyChanges();

        base.Initialize();
    }

    protected override void LoadContent()
    {

        spriteBatch = new SpriteBatch(GraphicsDevice);

        missile1 = Content.Load<SoundEffect>("missile1");



        player.LoadContent(Content);
    }


    protected override void UnloadContent()
    {

    }

    protected override void Update(GameTime gameTime)
    {

        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();



        foreach (adw missile in player.missiles)
        {
            missile1.Play();
        }

        player.Update(gameTime);

        base.Update(gameTime);
    }

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


        spriteBatch.Begin();
        player.Draw(spriteBatch);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}
}

And if this is not the place to ask things like this, just tell me. I will do as you advice.

1

There are 1 answers

2
Joe Shanahan On BEST ANSWER
protected override void Update(GameTime gameTime)
{

    ....

    foreach (adw missile in player.missiles)
    {
        missile1.Play();
    }

    ....

}

Every single frame / tick of your game (I assume this is 60 times a second) you are trying to play your sound for every bullet you currently store a reference to. Basically, you're playing a sound 60+ times a second.

Load your sound within your Player class, exactly in the same way you load your texture. Call Play() on it every time you create a new bullet with ShootMissiles(gameTime);