Sound in Schleife nur einmal abspielen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: Sound in Schleife nur einmal abspielen

BeitragDo, Aug 30, 2007 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich lerne zur Zeit das Programmieren eines Menüs. Dazu benutze ich ein kleines Tutorial mit einer Library (PButtons v1.0 by Pdd (C) 2006.)

Ich will, dass wenn man mit der Maus über eine Taste (Bild) geht, ein Sound abgespielt wird. Der sound wird auch abgespielt aber, da die Funktion <<< If PB_ButtonOver(Btn_daddln) then...... >>> usw. in einer Schleife steht wird der Sound so lange wie man mit der Maus über dem Bild ist immer von vorne abgespielt, auch wenn er noch nicht fertig ist.

Wie bekomme ich es hin, dass der Sound bei jeder Bildberührung nur einmal abgespielt wird ???

Ich hab es schon mit allerhand IF-Schleifen versucht aber hatte keinen Erfolg.

hier noch das Menü und die Library
Code: [AUSKLAPPEN]
; Beispiel für die Nutzung der PButtons-lib.

AppTitle ("Mein erstes Menü")
Include "PButtons.bb"
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

sound = LoadSound ("menü.mp3")
musik = PlaySound(sound)
klick = LoadSound ("klick.mp3")

Global MainImage = LoadImage("main.png")
Global menu = 1
Global Timer = CreateTimer(30)
Global menustate = 1
Global ms%=MilliSecs()

ff = LoadFont("verdana")
SetFont ff

Global Btn_daddln = PB_CreateButton("Spiel starten", 49, 143, 1, 235, 63)
Global Btn_beenden = PB_CreateButton("", 619, 541, 0, 181, 59, "exit_over.bmp")
Global Btn_options = PB_CreateButton("", 54, 240, 0, 229, 57, "options.bmp")
Global Btn_credits = PB_CreateButton("Credits...", 100, 330, 1, 138, 63)
Global Btn_back = PB_CreateButton("Drücke hier, um zurück zu gelangen.", 10, 10, 1, StringWidth("Zurück."), FontHeight())
Global Btn_opback = PB_CreateButton("Optionen... hier geht's zurück zum Menü", 10, 10, 1, StringWidth("Optionen... Zurück"), FontHeight())


PB_SetHintFont("verdana")
PB_SetHintColor(245, 248, 152, 0, 0, 0, 208, 55, 163)

Repeat
   WaitTimer(Timer)
   Cls
   
   Select menustate
      Case 1
         ; Hauptmenü   
            ; Erst alle anderen Buttons Deaktivieren
            PB_DisableAll()
            PB_EnableButton(Btn_daddln)
            PB_EnableButton(Btn_beenden)
            PB_EnableButton(Btn_options)
            PB_EnableButton(Btn_credits)
            ; Das Menü-Bild malen
            DrawImage MainImage, 0, 0
            
            If PB_ButtonHit(Btn_daddln) Then menustate = 2
            If PB_ButtonHit(Btn_beenden) Then ExecFile ("www.mausoft.de.tl")
            If PB_ButtonHit(Btn_options) Then menustate = 3
            If PB_ButtonHit(Btn_credits) Then menustate = 4
               

      Case 2
         ; daddln
            ; Jetzt zuerst alle Buttons deaktivieren, sonst könnte man die Anderen Buttons noch drücken!
            PB_DisableAll()
            PB_EnableButton(Btn_Back)
            StopChannel musik
            Cls
            Color 255, 255, 255
            Text 10, 10, "Zurück."
            If PB_ButtonHit(Btn_back) Then
               menustate = 1
               musik = PlaySound(sound)
            EndIf
      Case 3
         ; optionen
            ; Jetzt zuerst alle Buttons deaktivieren, sonst könnte man die Anderen Buttons noch drücken!
            PB_DisableAll()
            PB_EnableButton(Btn_opback)
            Cls
            Color 255, 255, 255
            Text 10, 10, "Optionen... Zurück"
            If PB_ButtonHit(Btn_opback) Then menustate = 1
            
      Case 4
         ; optionen
            ; Jetzt zuerst alle Buttons deaktivieren, sonst könnte man die Anderen Buttons noch drücken!
            PB_DisableAll()
            
               If schrift_bild = 0 Then
                  schrift_bild = CreateImage(800,600)
                  SetBuffer ImageBuffer(schrift_bild)
                  Cls
                  font = LoadFont ("comic sans ms",30)
                  SetFont font
                  Color 255, 255, 255
                  
                  txt0$ = "Menü:  *********"
                  txt1$ = "basierend auf:  PButtons v1.0 by Pdd "+Chr(169)+" 2006."
                  txt2$ = "Grafik:  *********"
                  txt3$ = "gemacht mit  Photo Impact"
                  txt4$ = "Copyright"+Chr(169)+"  2007 by mausoft"
                  
                  
                  Text 800/2- StringWidth(txt0$)/2, 0,txt0$
                  Text 800/2- StringWidth(txt1$)/2, 30,txt1$
                  Text 800/2- StringWidth(txt2$)/2, 100,txt2$
                  Text 800/2- StringWidth(txt3$)/2, 130,txt3$
                  Text 800/2- StringWidth(txt4$)/2, 200,txt4$
               EndIf   
            
               SetBuffer BackBuffer()
               
               DrawImage schrift_bild,0,600+y
               Flip
               
               y = (y-2 +(.1*timescale))
               If y =< -840 Then y = 0
               
               If KeyHit(1) Then
               menustate = 1
               y =0
               EndIf
               

               
   End Select

   ; Nicht vergessen: Updaten
   PB_Update()
   
   Flip
Until menu = 0
End

Function zeitnormung()
   msa=MilliSecs()
   timescale=msa-ms
   ms=msa
End Function


Die Lib:
Code: [AUSKLAPPEN]
; PButtons v1.0 by Pdd (C) 2006.
; Mail: pddpms [ÄT] yahoo.de
; Diese Lib darf frei verwendet werden, würde mich aber um einen Credits-Eintrag freuen!

Type TButton
   Field X
   Field Y
   Field name$
   Field ID
   Field Width
   Field Heigth
   Field Hint
   Field Hit
   Field Enabled
   Field OverImage
End Type

Global Button.TButton
Global PB_ButtonHintFont = LoadFont("verdana")
Dim PB_HintColor(9)
   PB_HintColor(1) = 74
   PB_HintColor(2) = 128
   PB_HintColor(3) = 225
   PB_HintColor(4) = 0
   PB_HintColor(5) = 0
   PB_HintColor(6) = 0
   PB_HintColor(7) = 0
   PB_HintColor(8) = 0
   PB_HintColor(9) = 0
   
; Setzt die Farbe der Hints
; rgb - Farbe des Hintergrunds
; r1g1b1 - Farbe des Rands
; r2g2b2 - Farbe des Textes

Function PB_SetHintColor(r, g, b, r1, g1, b1, r2, g2, b2)
   ; Hintergrund
   PB_HintColor(1) = r
   PB_HintColor(2) = g
   PB_HintColor(3) = b
   ; Rahmen
   PB_HintColor(4) = r1
   PB_HintColor(5) = g1
   PB_HintColor(6) = b1
   ; Text
   PB_HintColor(7) = r2
   PB_HintColor(8) = g2
   PB_HintColor(9) = b2
   
End Function

; Setzt die Schriftart des Hints
; font$ - Schriftart

Function PB_SetHintFont(font$)
   PB_ButtonHintFont = LoadFont(font$)
End Function

; Erstellt einen Button. Liefert die Identität des Buttons zurück.
; hint$ - Hint-Text
; X - X-Position des Buttons
; Y - Y-Position des Buttons
; HintE - Ob der Hint angezeigt werden soll (0 = nein, 1 = ja)
; width - Breite des Buttons
; height - Höhe des Buttons
; OverImage(optional) - Bild, das angezeigt werden soll, wenn man mit der Maus über den Button fährt

Function PB_CreateButton(hint$, X, Y, HintE = 0, width, height, Overimage$ = "")
   Button = New TButton
   Button\ID = Handle(Button)
   Button\name = hint$
   Button\Width = width
   Button\Heigth = height
   Button\X = X
   Button\Y = Y
   Button\Hint = HintE
   Button\Enabled = True
   If Overimage$ <> "" Then
      Button\OverImage = LoadImage(Overimage$)
   EndIf
   Return Handle(Button)
End Function

; Liefert eine 1 zurück, wenn der Button gedrückt wurde. Ansonsten 0.

Function PB_ButtonHit(Btn)
   If Btn <> 10000 Then
      Button = Object.TButton(Btn)
      If Button\Hit = 1 And Button\Enabled = True Then
         Button\Hit = 0
         FlushMouse
         Return True
      Else
         Return False
      EndIf
   EndIf
End Function

; Liefert eine 1 zurück, wenn die Maus über dem Button ist. Ansonsten 0.

Function PB_ButtonOver(Btn)
   If Btn <> 10000 Then
      Button = Object.TButton(Btn)
      If (MouseX() > Button\X) And (MouseX() < (Button\X + Button\Width)) And (MouseY() > Button\Y) And (MouseY() < (Button\Y + Button\Heigth)) And (Button\Enabled = True) Then
         Return True
      Else
         Return False
      EndIf
   EndIf
End Function

; Aktualisiert alles. Dieser Befehl muss immer in jeder Schleife ausgeführt werden!

Function PB_Update()
   For Button = Each TButton
      If (PB_ButtonOver(Button\ID) = True) And (Button\Enabled = True) Then   
            
         If Button\OverImage <> 0 Then
            DrawImage Button\OverImage, Button\X, Button\Y
         EndIf
         
         If Button\Hint = 1 Then
            SetFont PB_ButtonHintFont
            Color PB_HintColor(1), PB_HintColor(2), PB_HintColor(3)   ;Hintergrund
            If (MouseX() + 20 + StringWidth(Button\name) + 10) < 800 Then
               Rect MouseX() + 20, MouseY() + 1, StringWidth(Button\name) + 10, 15, 1
               Color PB_HintColor(4), PB_HintColor(5), PB_HintColor(6) ;Rahmen
               Rect MouseX() + 20, MouseY() + 1, StringWidth(Button\name) + 10, 15, 0
               Color PB_HintColor(7), PB_HintColor(8), PB_HintColor(9) ;Text
               Text MouseX() + 25, MouseY() + 2, Button\Name
            Else
               Rect MouseX() - 5 - (StringWidth(Button\name) + 10) , MouseY() + 1, StringWidth(Button\name) + 10, 15, 1
               Color PB_HintColor(4), PB_HintColor(5), PB_HintColor(6) ;Rahmen
               Rect MouseX() - 5 - (StringWidth(Button\name) + 10), MouseY() + 1, StringWidth(Button\name) + 10, 15, 0
               Color PB_HintColor(7), PB_HintColor(8), PB_HintColor(9) ;Text
               Text MouseX() - (StringWidth(Button\name) + 10), MouseY() + 2, Button\Name
            EndIf            
         EndIf
         
         If MouseHit(1) Then
            FlushMouse
            Button\Hit = 1   
         Else
            Button\Hit = 0
         EndIf   
         FlushMouse
         

      EndIf
   Next
End Function

; Aktualisiert die Eigenschaften eines Buttons. Liefert die Identität des Buttons zurück, diese bleibt aber gleich.
; Parameter siehe PB_CreateButton.

Function PB_UpdateButton(Btn, hint$, X, Y, HintE = 0, width, height, Overimage = 0)
   If Btn <> 10000 Then
      Button = Object.TButton(Btn)
      If hint$ <> "" Then Button\name = hint$
      Button\Width = width
      Button\Heigth = height
      Button\X = X
      Button\Y = Y
      Button\Hint = HintE
      Button\Enabled = True
      If Overimage <> 0 Then
         Button\OverImage = LoadImage(Overimage)
      Else
         Button\OverImage = 0
      EndIf   
      Return Handle(Button)
   EndIf
End Function

; Löscht ALLE Buttons

Function PB_FreeButtons()
   For Button = Each TButton
      Delete Button
   Next
End Function

; Löscht EINEN Button
; Btn - Identität des Buttons

Function PB_FreeButton(Btn)
   Button = Object.TButton(Btn)
   Delete Button
End Function

; Aktiviert einen Button
; Btn - Identität des Buttons

Function PB_EnableButton(Btn)
   If Btn <> 10000 Then
      Button = Object.TButton(Btn)
      Button\Enabled = True
   EndIf
End Function

; Deaktiviert einen Button
; Btn - Identität des Buttons

Function PB_DisableButton(Btn)
   If Btn <> 10000 Then
      Button = Object.TButton(Btn)
      Button\Enabled = False
   EndIf
End Function

; Aktiviert ALLE Buttons

Function PB_EnableAll()
   For Button = Each TButton
      Button\Enabled = True
   Next
End Function

; Deaktiviert ALLE Buttons

Function PB_DisableAll()
   For Button = Each TButton
      Button\Enabled = False
   Next
End Function



Vielen vielen Dank! wenn sich jemand mit dem Problem auseinandersetzt. Ich weis das das viel Arbeit ist.
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
  • Zuletzt bearbeitet von mabox am Sa, Jul 17, 2010 19:07, insgesamt einmal bearbeitet

BladeRunner

Moderator

BeitragDo, Aug 30, 2007 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If PB_ButtonOver(Btn_daddln) then
    if play_menu_sound = 0 then
        play_menu_sound = 1
        playsound klick
    endif
else
    play_menu_sound = 0
endif

Wenn Du über dem Button bist wird der Sound einmalig abgspielt. Verlässt Du den Button wird die passende Variable wieder genullt und der sound kann erneut gespielt werden.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mabox

Betreff: cooooooool

BeitragDo, Aug 30, 2007 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen, vielen Dank!
funktioniert super!!!

aber ein kleines Problem gibts noch: ich will das Menü schlussendlich in Vollbild ausführen aber dann wird keine Maus angezeigt.

Ich habs mit:
Code: [AUSKLAPPEN]
DrawImage xxx,MouseX,MouseY
versucht aber da in der Library noch irgendwelche anderen (für mich unverständlichen) Sachen mit der Maus gemacht werden funktioniert das nicht (nehm ich mal an).

kann mir da nochmal jemand helfen ???
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

BladeRunner

Moderator

BeitragDo, Aug 30, 2007 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast ne Datei für den Mauszeiger geladen und zeichnest die Maus am Ende der Hauptschleife ein, nach allem anderen? Dann sollte es nämlich gehen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mabox

Betreff: So

BeitragDo, Aug 30, 2007 23:00
Antworten mit Zitat
Benutzer-Profile anzeigen
So hab ichs gemacht:
Code: [AUSKLAPPEN]
; Beispiel für die Nutzung der PButtons-lib.

AppTitle ("Mein erstes Menü                                                                                                                               Copyright"+Chr(169)+" 2007 by mausoft")
Include "PButtons.bb"
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

sound = LoadSound ("menü.mp3")
musik = PlaySound(sound)
klick = LoadSound ("klick.mp3")

maus = LoadImage ("maus.bmp")
MaskImage maus, 255,0,255

Global MainImage = LoadImage("main.png")
Global menu = 1
Global Timer = CreateTimer(30)
Global menustate = 1
Global ms%=MilliSecs()
...
...
;;;;;;SCHLEIFE
...
...
               If KeyHit(1) Then
               menustate = 1
               y =0
               EndIf
               

               
   End Select

   ; Nicht vergessen: Updaten
   PB_Update()   
   DrawImage maus,MouseX,MouseY
   
   Flip
Until menu = 0
;;;;;;ENDE DER SCHLEIFE
End

Function zeitnormung()
   msa=MilliSecs()
   timescale=msa-ms
   ms=msa
End Function
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

BladeRunner

Moderator

BeitragDo, Aug 30, 2007 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, ich seh ehrlich gesagt keinen vernünftigen Grund warum das Bild nicht gezeichnet werden sollte....
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mabox

BeitragDo, Aug 30, 2007 23:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habs grad nochmal ausprobiert und gemerkt das das "maus bild" oben in der linken Ecke auf position 0,0 angezeigt wird.
Das würde vllt heißen, dass die Mauskoordinaten gelöscht wären oder ???
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

BladeRunner

Moderator

BeitragDo, Aug 30, 2007 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
I See- Du hast die Klammern hinter MouseX() und Mousey() vergessen...
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mabox

BeitragDo, Aug 30, 2007 23:36
Antworten mit Zitat
Benutzer-Profile anzeigen
oh man bin ich blöd.......Vielen Dank!
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group