Seite 1 von 1

Problem mit Schleife - Audiowiedergabe wiederholt sich immer

Verfasst: 13.09.2006 14:24
von smateja
Hallo zusammen ich versuche derzeit einen Ton auszugeben wenn man über einen grafischen Button mit der Mouse fährt, dabei folgendes Problem: Der Sound der hinter dem Knopf hinterlegt ist wird permanent abgespielt, naja hier mal der Quellcode - hab mir schon selbst versucht gedanken zu machen - aber noch keinen Ansatz wie ich ihm sage dass quasi nicht immer wieder die gleiche IF Abfrage aufgerufen wird wenn die maus an der Position des Knopfes steht:

Code: Alles auswählen


;00005

Procedure Startbedingungen()



EndProcedure

Procedure Initialisierung()
 
InitMouse()
InitSprite()  
InitKeyboard()
InitSound()
SetRefreshRate(75)
UseJPEGImageDecoder()
UseOGGSoundDecoder()

EndProcedure

Procedure Resourcen_laden()
LoadSound(00001, "data\m00001.ogg")
PlaySound(00001,1)

LoadSound(00002, "data\mouseover.wav")
LoadSound(00003, "data\mouseclick.wav")

LoadFont (0, "Arial", 8)            

LoadImage(1,"data\00001.jpg")


LoadSprite(1, "data\mouse.bmp")
LoadSprite(2,"data\00002.bmp") ;verbinden
LoadSprite(6,"data\00006.bmp") ;rahmen

EndProcedure

Procedure Fenster_zeichnen()

OpenWindow(00002,1,1,640,480,"Optionen",#PB_Window_ScreenCentered|#PB_Window_Invisible)
  CreateGadgetList(WindowID(00002))
  ButtonGadget(00004,540,450,80,18,"Speichern")
  
HideWindow(00002,1)
  
OpenWindow(00003,1,1,640,480,"Updates",#PB_Window_ScreenCentered|#PB_Window_Invisible)
  CreateGadgetList(WindowID(00003))
  ButtonGadget(00005,540,450,80,18,"Speichern")

HideWindow(00003,1)

OpenWindow(00001, 0, 0, 800, 400, "(H)iveworx (C)lient (E)ngine", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  CreateGadgetList(WindowID(00001))
  OpenWindowedScreen(WindowID(00001),1,1,800,400,0,0,0)  

EndProcedure



Procedure Mainloop()


  Repeat
  
  Event = WindowEvent()

  ExamineKeyboard() 
  ExamineMouse()  
  

StartDrawing(ScreenOutput())

DrawingMode(1) 

DrawImage(ImageID(1), 0, 0) 
FrontColor(RGB(200,200,200))
                             
    DrawingFont(FontID(0))               
   
    
    ;DrawText(10,10,""+Str(MouseX())) ;Debug Mouseoutput für X Koordinate
    ;DrawText(50,10,""+Str(MouseY())) ;Debug Mouseoutput für y Koordinate
    
  
StopDrawing()                           

 
 ; Over Events
 
 If MouseX() > 597 And MouseX() < 740 And MouseY() > 366 And MouseY() < 385  ;Beenden Button
   PlaySound(00002,0)
    TransparentSpriteColor(2, RGB(255,0,255))
    DisplayTransparentSprite(2, 594, 365) 
    
  
 EndIf
 
 
 
 
 
 If MouseX() > 597 And MouseX() < 740 And MouseY() > 316 And MouseY() < 333  ;Verbinden Button
    PlaySound(00002,0)
    TransparentSpriteColor(2, RGB(255,0,255))
    DisplayTransparentSprite(2, 594, 315) 

 EndIf
 
  
 If MouseX() > 257 And MouseX() < 742 And MouseY() > 245 And MouseY() < 270  ;Username Feld
    PlaySound(00002,0)
    TransparentSpriteColor(6, RGB(255,0,255))
    DisplayTransparentSprite(6, 253, 240) 
  
 EndIf
   
 If MouseX() > 257 And MouseX() < 742 And MouseY() > 280 And MouseY() < 303  ;Password Feld
     PlaySound(00002,0)
     TransparentSpriteColor(6, RGB(255,0,255))
     DisplayTransparentSprite(6, 253, 276) 
       
 EndIf
 
 

 
 ; Klick Events
 
 If MouseX() > 597 And MouseX() < 740 And MouseY() > 366 And MouseY() < 385 And MouseButton(1) ;Beenden Button
  PlaySound(00003,0)
    End
 EndIf
 
 If MouseX() > 597 And MouseX() < 740 And MouseY() > 316 And MouseY() < 333 And MouseButton(1) ;Verbinden Button
    PlaySound(00003,0)
 EndIf
 
 
 
 If MouseX() > 257 And MouseX() < 742 And MouseY() > 245 And MouseY() < 270 And MouseButton(1) ;Username Feld
    PlaySound(00003,0)
      
 EndIf
 
 If MouseX() > 257 And MouseX() < 742 And MouseY() > 280 And MouseY() < 303 And MouseButton(1) ;Password Feld
   PlaySound(00003,0)
 EndIf
 

  
  TransparentSpriteColor(1, RGB(0,255,0))
  DisplayTransparentSprite(1, MouseX(), MouseY()) 
  
  
  
    FlipBuffers(0) 







Until KeyboardPushed(#PB_Key_Escape)  
End  

EndProcedure


Startbedingungen()

Initialisierung()

Fenster_zeichnen() 

Resourcen_laden()

Mainloop()
; IDE Options = PureBasic v4.00 (Windows - x86)
; CursorPosition = 25
; Folding = A-
; EnableThread
; EnableXP
; Executable = loginclient.exe


Verfasst: 13.09.2006 19:38
von Kaeru Gaman
a)
grundsätzlich kannst du sowas mit einem Flag lösen, so in dem Stil:

Code: Alles auswählen

 If MouseX() > 257 And MouseX() < 742 And MouseY() > 280 And MouseY() < 303  ;Password Feld 
     If OverPWD = 0
       PlaySound(00002,0)
       OverPWD = 1
     EndIf
     TransparentSpriteColor(6, RGB(255,0,255)) 
     DisplayTransparentSprite(6, 253, 276) 
 Else
     OverPWD = 0        
 EndIf 
b)
die ganzen Ifs kann man etwas staffeln.
is auch ein stück weit geschmacksache, der performance-gewinn ist minimal.

Code: Alles auswählen

If MouseButton(1)
  If MouseX() > 597 And MouseX() < 740 
    If MouseY() > 366 And MouseY() < 385  ;Beenden Button 
      PlaySound(00003,0) 
      End 
    ElseIf MouseY() > 316 And MouseY() < 333  ;Verbinden Button 
      PlaySound(00003,0) 
    EndIf 
  ElseIf MouseX() > 257 And MouseX() < 742 
    If MouseY() > 245 And MouseY() < 270  ;Username Feld 
      PlaySound(00003,0) 
    ElseIf MouseY() > 280 And MouseY() < 303  ;Password Feld 
      PlaySound(00003,0) 
    EndIf 
  EndIf 
EndIf
c)
ich hab versucht, eine einfache lösung zu finden, um nur ein einziges Flag zu verwenden.
es ist mir nicht gelungen.
folgendes funktioniert NICHT korrekt:

Code: Alles auswählen

If MouseX() > 597 And MouseX() < 740 
  If MouseY() > 366 And MouseY() < 385  ;Beenden Button 
    If OverSND = 0
      PlaySound(00002,0)
      OverSND = 1
    EndIf
    TransparentSpriteColor(2, RGB(255,0,255)) 
    DisplayTransparentSprite(2, 594, 365) 
  ElseIf MouseY() > 316 And MouseY() < 333  ;Verbinden Button 
    If OverSND = 0
      PlaySound(00002,0)
      OverSND = 1
    EndIf
    TransparentSpriteColor(2, RGB(255,0,255)) 
    DisplayTransparentSprite(2, 594, 315) 
  Else
    OverSND = 0
  EndIf 
ElseIf MouseX() > 257 And MouseX() < 742 
  If MouseY() > 245 And MouseY() < 270  ;Username Feld 
    If OverSND = 0
      PlaySound(00002,0)
      OverSND = 1
    EndIf
    TransparentSpriteColor(6, RGB(255,0,255)) 
    DisplayTransparentSprite(6, 253, 240) 
  ElseIf MouseY() > 280 And MouseY() < 303  ;Password Feld 
    If OverSND = 0
      PlaySound(00002,0)
      OverSND = 1
    EndIf
    TransparentSpriteColor(6, RGB(255,0,255)) 
    DisplayTransparentSprite(6, 253, 276) 
  Else
    OverSND = 0
  EndIf
Else
  OverSND = 0
EndIf 
du wirst wohl nich umhin kommen, für jedes Over ein eigenes Flag zu verwenden.

[EDIT]

ok, es gibt einen Weg, wenn man die Ifs nicht staffelt:

Code: Alles auswählen

If MouseX() > 597 And MouseX() < 740 And MouseY() > 366 And MouseY() < 385  ;Beenden Button 
    If OverSND = 0
        PlaySound(00002,0)
        OverSND = 1
    EndIf
    TransparentSpriteColor(2, RGB(255,0,255)) 
    DisplayTransparentSprite(2, 594, 365) 
ElseIf MouseX() > 597 And MouseX() < 740 And MouseY() > 316 And MouseY() < 333  ;Verbinden Button 
    If OverSND = 0
        PlaySound(00002,0)
        OverSND = 1
    EndIf
    TransparentSpriteColor(2, RGB(255,0,255)) 
    DisplayTransparentSprite(2, 594, 315) 
ElseIf MouseX() > 257 And MouseX() < 742 And MouseY() > 245 And MouseY() < 270  ;Username Feld 
    If OverSND = 0
        PlaySound(00002,0)
        OverSND = 1
    EndIf
    TransparentSpriteColor(6, RGB(255,0,255)) 
    DisplayTransparentSprite(6, 253, 240) 
ElseIf MouseX() > 257 And MouseX() < 742 And MouseY() > 280 And MouseY() < 303  ;Password Feld 
    If OverSND = 0
        PlaySound(00002,0)
        OverSND = 1
    EndIf
    TransparentSpriteColor(6, RGB(255,0,255)) 
    DisplayTransparentSprite(6, 253, 276) 
Else
  OverSND = 0
EndIf