VB -28: Geräuscheffekte

Sound zur Belohnung oder Strafe

Machen wir zunächst mit der Programmierung unserer Rechenaufgaben weiter. Als nächstes geht es um die Subtraktion. Sie sieht fast genauso aus wie unsere Addition:

     Private Sub mnuSubtraktion_Click(Index As Integer)
        Unsichtbar                      'evtl. sichtbare Kugeln unsichtbar machen
        ErgebnisWert (Index)            'Zahlenbereich aus Menü-Index bestimmen
        Subtraktion                     'Aufruf unserer Subtraktion
        aktiveUebung = "Subtraktion"    'Uebung merken
     End Sub
     

Da unsere Subtraktion nichts anderes ist als eine Addition, nur daß nach einem anderen Wert der Gleichung gefragt wird, wollen wir die Ermittlung der Summanden verallgemeinern:

     Private Sub Summe(summand1 As Integer, summand2 As Integer)

        summand1 = Zufallszahl(1, MaxErgebnisWert - MinErgebnisWert)  'Summand1
        x = Zufallszahl(MinErgebnisWert, MaxErgebnisWert)    'Ergebnis

        Select Case x                   'prüfen, ob Ergebnis vernünftig ist
        Case Is < summand1              'negativ
            summand2 = x                'Summanden vertauschen
            x = summand1
            summand1 = x - summand2
        Case Is = summand1
            x = x + 1                   'Ergebnis um eins erhöhen
            summand2 = 1                'Summand2
        Case Else
            summand2 = x - summand1     'Summand2
        End Select

     End Sub

 

Die beiden Summanden übergeben wir als Argumente, x ist bereits modulweit definiert. In unseren Rechenaufgaben rufen wir jetzt nur noch das Unterprogramm "Summe" auf:

     Private Sub Addition()
     Dim summand1 As Integer, summand2 As Integer
     Dim i As Integer

        Summe summand1, summand2

        lblAufgabe.Caption = Str$(summand1) & " +" & Str$(summand2) & " ="
                                        'Aufgabe in Label schreiben
        lblAufgabe.Visible = True       'Aufgabe anzeigen
        txtErgebnis.Text = ""           'Textfeld löschen
        txtErgebnis.Visible = True      'Antwortfeld anzeigen
        Me.KeyPreview = True            'Tastencodes abfragen
        txtErgebnis.SetFocus            'Cursor ins Textfeld setzen
     End Sub

     Private Sub Subtraktion()
     Dim summand1 As Integer, summand2 As Integer
     Dim i As Integer

        Summe summand1, summand2

        lblAufgabe.Caption = Str$(x) & " -" & Str$(summand2) & " ="
                                        'Aufgabe in Label schreiben
        x = summand1                    'Ergebnis + Summand1 vertauschen für Subtraktion
        lblAufgabe.Visible = True       'Aufgabe anzeigen
        txtErgebnis.Text = ""           'Textfeld löschen
        txtErgebnis.Visible = True      'Antwortfeld anzeigen
        Me.KeyPreview = True            'Tastencodes abfragen
        txtErgebnis.SetFocus            'Cursor ins Textfeld setzen
     End Sub
 

Weil wir hier eine Subtraktionsaufgabe haben, müssen wir x (Ergebnis der Summe) mit einem Summanden vertauschen.

Und auch in SymbAddition nutzen wir das neue Unterprogramm:

     Private Sub SymbAddition()
     Dim summand1 As Integer, summand2 As Integer
     Dim i As Integer

        Summe summand1, summand2

        For i = 1 To summand1           'rote Kugeln anzeigen
            imgKugelX(i - 1).Visible = True
            Verzoegerung 0.05
        Next
        For i = 1 To summand2           'blaue Kugeln anzeigen
            imgKugelY(i - 1).Visible = True
            Verzoegerung 0.05
        Next
        lblFrage.Visible = True         'Frage anzeigen
        txtErgebnis.Text = ""           'Textfeld löschen
        txtErgebnis.Visible = True      'Antwortfeld anzeigen
        Me.KeyPreview = True            'Tastencodes abfragen
        txtErgebnis.SetFocus            'Cursor ins Textfeld setzen
     End Sub
 

Hierzu müssen wir auch noch die Grenzwerte setzen:

     Private Sub mnuAddSymb_Click()
        Unsichtbar                      'evtl. sichtbare Kugeln unsichtbar machen
        MaxErgebnisWert = 9
        MinErgebnisWert = 2
        SymbAddition
        aktiveUebung = "SymbAddition"
     End Sub
 

Und schon kann unser Proband auch seine Subtraktionskünste unter Beweis stellen.

Beispielprojekt laden

Inzwischen ist Euch die MessageBox zur Ergebnisanzeige sicher genauso langweilig geworden wie mir . Wir wollen daher diese Stelle etwas abändern und, je nachdem ob die Aufgabe richtig oder falsch beantwortet wurde, mit einem kurzen Sound quittieren.

Aber wie? VB hat auch in Version 6 noch weit und breit keine Standardsoundfunktion...

Doch wir wären nicht unter Windows, wenn wir nicht jederzeit das Betriebssystem anzapfen könnten. Schließlich kann unser Windows ja auch ständig Sound absondern, eine Soundkarte oder einen passenden Lautsprechertreiber vorausgesetzt. Solche Funktionsaufrufe ins Windows-Betriebssystem geschehen grundsätzlich über die API-Schnittstelle (dazu später mehr).

Wir müssen nur wissen, wo die Funktion versteckt ist. Wenn nicht, schlagen wir nach . Zum Abspielen von kleinen WAV-Dateien gibt es die Funktion "sndPlaySound". Da es sich um einen API-Aufruf handelt, müssen wir die Funktion und wo sie zu finden ist, speziell deklarieren:

     Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
     

Wir werden uns mit API-Aufrufen später noch ausführlicher befassen, zunächst nur die Erklärung der wichtigsten Parameter:

Zum Aufruf der Funktion basteln wir uns im Modul "Allgemein" ein kleines Unterprogramm:

    Sub Sound(WAVDatei As String)
    Dim rc As Long
        rc = sndPlaySound(WAVDatei, 1)
    End Sub
 

"rc" ist hier der Rückgabewert der API-Funktion. Er sagt aus, ob der Aufruf erfolgreich war oder nicht. Jetzt müssen wir nur noch unsere "Sound"-Prozedur bei Bedarf aufrufen:

    Private Sub Form_KeyPress(KeyAscii As Integer)
        If KeyAscii <> vbKeyReturn Then Exit Sub
        'Prüfen ob Enter gedrückt wurde, sonst ignorieren

        If Val(txtErgebnis.Text) = x Then
            Sound App.Path & "\richtig.wav"
           Else
            Sound App.Path & "\falsch.wav"
        End If
        Verzoegerung 2
 

Dazu müssen die beiden Sounddateien "richtig.wav" und "falsch.wav" im gleichen Verzeichnis wie unser Programm stehen (App.Path). Ihr könnt hier natürlich jede beliebige Wav-Datei benutzen.

Damit das Ergebnis einen kurzen Augenblick stehen bleibt, habe ich noch eine Verzögerung von 2 Sekunden angehängt.

Beispielprojekt laden

zurück Index weiter


© Copyright 1998-2000 J.Behling EMail schreiben ABC-Ware's Homepage
Weitergabe und Druck (auch in Teilen, mit Ausnahme von Privatgebrauch) ohne ausdrückliche Genehmigung der Autorin untersagt.