Frage von Sonne221993, 21

C# Wie kann ich Soundeffekte in einer Klasse definieren und in anderen darauf zugreifen?

Hallo Ich kenne mich mit C# noch nicht aus, bin also ein ziemlicher Anfänger. Ich möchte mit Hilfe von Viusal Studio und Monogame ein Spiel programmieren. Meine Farge bezieht sich hier auf den Sound. Ich möchte eine Klasse haben in der ich die Soundeffecte verwalte um dann in anderen Stellen des Programmes immer auf sie zugreifen zu können und zwar am besten so das ich nur noch soundeffect.play(); aufrufen muss. Ich habe schon angefangen habe aber einige Probleme... Meine Klasse:

using System;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;

namespace Exercise_Game1
{
    class Sound : OneGameObject 
    {
       protected SoundEffect mWalking;
       public SoundEffect mPling;

        public Sound(ContentManager content)
            : base(content.Load<SoundEffect>("walking"), content.Load<SoundEffect>("pling"))
        {
            mWalking = content.Load<SoundEffect>("walking");
            mPling = content.Load<SoundEffect>("pling");

        }

(Das OneGameObject musste ich erstellen um die Soundeffecte übergeben zu können da steht aber sonst nichts drin) . Ich habe versucht methoden einzubauen um dann mit

Sound sound1 = new Sound(Content);
 sound1.Playing();

darauf zugreifen zu können, dass funktioniert aber nicht richitg und ich weiß auch nicht wie ich dann andere Soundeffecte anspreche... Methoden:

public void Playing()
{
        SoundEffectInstance soundEffectInstance = mWalking.CreateInstance();
        soundEffectInstance.Play();
    }

public void StopPlaying()
    {
        SoundEffectInstance soundEffectInstance = mWalking.CreateInstance();
        if (soundEffectInstance.State == SoundState.Playing)
        {
            soundEffectInstance.Stop();
        }

Kann mir jemand einen Tipp geben wie ich das besser angehe?

Antwort
von CrystalixXx, 12

Ich kenne mich mit dem XNA-Framework nicht aus. Prinzipiell sollte es aber möglich sein eine Klasse zu erzeugen, die statische Eigenschaften enthält. Jede Eigenschaft steht dabei für einen eigenen Soundeffekt. Ähnlich dem folgenden Beispiel:

using System.Media;

public class SoundEffects
{
public static System.Media.SystemSound Asterisk
{
get { return SystemSounds.Asterisk; }
}

public static System.Media.SystemSound Beep
{
get { return SystemSounds.Beep; }
}

public static System.Media.SystemSound Exclamation
{
get { return SystemSounds.Exclamation; }
}

public static System.Media.SystemSound Hand
{
get { return SystemSounds.Hand; }
}

public static System.Media.SystemSound Question
{
get { return SystemSounds.Question; }
}
}

Falls deine Klasse tatsächlich zwingend von OneGameObject erben muss, dann kannst du den Konstruktor übernehmen und passt die Rückgabewerte der Eigenschaften an.

Was funktioniert denn aber bei deinen Methoden nicht? Fehlermeldung etc.?

Kommentar von Sonne221993 ,

Ich habe versucht eine klasse mit statischen Eigenschaften einzufügen:

public class SoundEffects
{
public static SoundEffect Walking()
{
get { return Sound.mWalking; }
}
}

Aber so wie ich das mache scheint es falsch zu sein denn das get wird als Fehler angezeigt (get does not exist in current context)... Wie gesagt ich bin noch ein ziemlicher Anfänger und habe nicht wirklich viel Ahnung.

Das Problem bei meinen Methoden ist das ich sie nur in der update methode aufrufen kann und dann auch nur an einer Stelle darauf zugreifen kann. Es ist also nicht möglich an einer Stelle die Musik zu starten und an einer anderen wieder zu Stoppen

Kommentar von CrystalixXx ,

In der Play-Methode erzeugst du eine Instanz, die du abspielst. In der Stop-Methode hingegen eine neue Instanz. Die hat mit der ersten, die abgespielt wird, nichts zu tun.

Versuch mal folgende Klasse. Ich habe mich dabei nach deinem Code gerichtet, vielleicht funktioniert's ja.

public class SoundEffects
{
SoundEffectInstance activeSound = null;

public SoundEffects(ContentManager content)
{
_Walking = content.Load("walking");
_Pling = content.Load("pling");
}

static SoundEffect _Walking;
public static SoundEffect Walking
{
get { return _Walking; }
}

static SoundEffect _Pling;
public static SoundEffect Pling
{
get { return _Pling; }
}

public void Play(SoundEffect sound)
{
activeSound = sound.CreateInstance();
activeSound.Play();
}

public void Stop()
{
if (activeSound.State == SoundState.Playing)
{
activeSound.Stop();
}
}
}

Falls es möglich sein sollte mehrere Sounds gleichzeitig abzuspielen, dann muss "activeSound" eine Liste vom Typ SoundEffectInstance werden. In der Play-Methode wird geprüft, ob eine Instanz vom abzuspielenden SoundEffect enthalten ist. Wenn ja, dann nichts tun, wenn nein, dann eine Instanz hinzufügen und starten.

Die Stop-Methode erhält dann ebenfalls einen Parameter "SoundEffect sound" und prüft ihrerseits, ob "activeSounds" eine Instanz des SoundEffect-Objektes enthält. Wenn ja, dann deren Stop-Methode aufrufen, wenn nein, nichts tun.

Keine passende Antwort gefunden?

Fragen Sie die Community