Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

j0ck

Frischling

  • »j0ck« ist der Autor dieses Themas
  • Private Nachricht senden

1

15.09.2011, 10:11

[XNA] Sound API - Frage zu SoundEffect

Hi Jungs,

Ich hätte kurz eine Frage:
Zur Zeit bin ich dabei, XNA etwas zu lernen. Ich kann Objekte bewegen und kollidieren lassen. Nun wollte ich einen Soundeffect einbinden.

Ich habe eine Kollision() Methode erstellt:

C#-Quelltext

1
2
3
4
5
6
7
8
 protected bool Kollision()
        {
            Rectangle spriteBB = new Rectangle((int)spritePos.X,
                (int)spritePos.Y, 125, 125);
            Rectangle spriteNeuBB = new Rectangle((int)spriteNeuPos.X,
            (int)spriteNeuPos.Y, 125, 125);

return spriteBB.Intersects(spriteNeuBB);


mit einer IF - Anweisung wird diese in der Update() - Methode abgerufen:

C#-Quelltext

1
2
3
4
 if (Kollision())
            {
                soundEffect.Play();
            }


Wenn jetzt meine zwei Sprites miteinander Kollidieren, dann kommt der Sound, aber in tausendfacher Ausführung! :-)
Ich würde gerne erreichen, dass der Sound bei Auftreten der Kollision nur einmal abgespielt wird!

Eventuell könnt ihr mir helfen!

Danke! :)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

15.09.2011, 10:17

Wie wäre es mit einer weiten bool Variable, die dir sagt, dass der Sound bereits gespielt wird?

C#-Quelltext

1
2
3
4
5
if (Kollision() && !play)
{
    soundEffect.Play();
    play = true;
}


play kannst du ja im else Teil oder nach x Sekunden wie automatisch auf false stellen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

j0ck

Frischling

  • »j0ck« ist der Autor dieses Themas
  • Private Nachricht senden

3

15.09.2011, 10:38

Wie wäre es mit einer weiten bool Variable, die dir sagt, dass der Sound bereits gespielt wird?

C#-Quelltext

1
2
3
4
5
if (Kollision() && !play)
{
    soundEffect.Play();
    play = true;
}


play kannst du ja im else Teil oder nach x Sekunden wie automatisch auf false stellen.

Wie wäre es mit einer weiten bool Variable, die dir sagt, dass der Sound bereits gespielt wird?

C#-Quelltext

1
2
3
4
5
if (Kollision() && !play)
{
    soundEffect.Play();
    play = true;
}


play kannst du ja im else Teil oder nach x Sekunden wie automatisch auf false stellen.


Danke für die schnelle Antwort.
Prinzipiell verstehe ich, was zu sagst...aber mit der Umsetzung wirds schwierig! Könntest du ein bisschen weiter ins Detail gehen? :)
Bin noch Anfänger! ;( :thumbsup:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

15.09.2011, 10:48

Legst vor deiner Game Loop eine Variable

C#-Quelltext

1
bool play = false;
an.
Kommt es nun zu einer Kollision, guckst du, ob der Sound nicht schon wegen einer anderen Kollision gespielt wird (ggf. kannst du, sofern er schon gespielt wird, ihn stoppen und nochmal neu anfangen lassen, da es ja auch eine neue Kollision ist.)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if (Kollision())
{
    if (!play) {
        soundEffect.Play();
        play = true;
    }
    // sonstiges Kollision Handling
    // ...
} else if (play) {
    play = false;
}

Ungeprüft, sollte aber funktionieren.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

j0ck

Frischling

  • »j0ck« ist der Autor dieses Themas
  • Private Nachricht senden

5

15.09.2011, 11:15

Legst vor deiner Game Loop eine Variable

C#-Quelltext

1
bool play = false;
an.
Kommt es nun zu einer Kollision, guckst du, ob der Sound nicht schon wegen einer anderen Kollision gespielt wird (ggf. kannst du, sofern er schon gespielt wird, ihn stoppen und nochmal neu anfangen lassen, da es ja auch eine neue Kollision ist.)

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
if (Kollision())
{
    if (!play) {
        soundEffect.Play();
        play = true;
    }
    // sonstiges Kollision Handling
    // ...
} else if (play) {
    play = false;
}

Ungeprüft, sollte aber funktionieren.


KLasse Herr Architekt. Es funktioniert!!!!! Danke

Hat mir viel geholfen!

Werbeanzeige