Ich habe jetzt mittlerweile mal einen lauffähigen Code zusammengestellt. Das Fenster ist zwar wesentlich kleiner als im Originalprogramm, aber es soll ja jetzt auch nur gezeigt werden, was prinzipiell passiert:
Über die Leertaste kann im Originalprogramm das Abspielen / Stoppen von Tönen ausgelöst werden. Das habe ich jetzt ersetzt durch Zahlen. Mir ist klar, dass ich mir in dem Fall Select - EndSelect auch hätte sparen können, aber beim Abspielen von Tönen geht das nicht anders, weil nicht einfach PlaySound(zahl) geschrieben werden kann, da muß jedesmal die jeweilige Zahl in der Klammer stehen.
Die Subroutine regelt die Abspiellänge mit Timer. Nicht mit Delay, damit über die Leertaste die Wiedergabe auch jederzeit wieder gestoppt werden kann.
Über das ScrollBarGadget kann im Originalprogramm die Lautstärke geregelt werden. Und jetzt das Problem dabei: Sobald das ScrollBarGadget angeklickt wird, bleibt die Repeat-Schleife in der Subroutine stehen. In der Praxis klingt dann der zuletzt wiedergegebene Ton aus und die Lautstärkeregelung ist so nicht gerade vom feinsten. Wie kann das beseitigt werden?
Euch wird auffallen, dass in der Subroutinen-Repeat-Schleife auch nochmal drin steht event = WaitWindowEvent(5) und auch nochmal ExamineKeyboard(). Die Abfrage in der Hauptschleife ist ja dann aber abgekapselt. Geht das ggf. auch anders? Das kann doch kein Geheimwissen sein, bitte erklärt mir, wie das ggf. besser geht. Gestern hatte ich auch mit Prozedur experimentiert, aber das war Murks, daher jetzt Subroutine.
Hier nun der Code:
Code: Alles auswählen
If InitSprite() = 0
MessageRequester("InitSprite failed", "")
EndIf
If InitMouse() = 0
MessageRequester("InitMouse failed","")
EndIf
If InitKeyboard()
;MessageRequester("InitKeyboard failed", "")
EndIf
If OpenWindow(1,0,0,130,413,"",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered) = 0 ; 412
;MessageRequester("OpenWindow failed", "")
EndIf
If OpenWindowedScreen(WindowID(1),0,0,110,413) = 0
MessageRequester("OpenWindowedScreen failed", "")
EndIf
Procedure BindVScrollDatas()
Shared ggst.d
ggst.d = GetGadgetState(1)
svl.d = 91 - ggst.d
EndProcedure
ScrollBarGadget(1,110,25,20,363,1,100,10,#PB_ScrollBar_Vertical) ; 1,1010,19,20,375,1,100,10
SetGadgetState(1,46)
ggst.d = GetGadgetState(1)
BindGadgetEvent(1, @BindVScrollDatas())
Dim zahl.d(9)
For i = 1 To 5
zahl.d(i-1) = i
Next
Repeat
event = WaitWindowEvent(5)
Select event
Case #PB_Event_LeftClick
;...
EndSelect
ExamineKeyboard()
If KeyboardReleased(#PB_Key_Space) And space = 2
space = 0
EndIf
If KeyboardPushed(#PB_Key_Space) And space = 0
space = 1
For i = 1 To 5
zahl = zahl.d(i-1)
Select zahl
Case 1
Debug zahl
Gosub Spiellaenge
If br = 1
br = 0
i = 5
Break
EndIf
Case 2
Debug zahl
Gosub Spiellaenge
If br = 1
br = 0
i = 5
Break
EndIf
Case 3
Debug zahl
Gosub Spiellaenge
If br = 1
br = 0
i = 5
Break
EndIf
Case 4
Debug zahl
Gosub Spiellaenge
If br = 1
br = 0
i = 5
Break
EndIf
Case 5
Debug zahl
Gosub Spiellaenge
If br = 1
br = 0
i = 5
Break
EndIf
EndSelect
Next
EndIf
Until event = #PB_Event_CloseWindow
End
Spiellaenge:
starttime = ElapsedMilliseconds()
Repeat
event = WaitWindowEvent(5)
ExamineKeyboard()
time = ElapsedMilliseconds()
If KeyboardReleased(#PB_Key_Space) And space = 1
space = 0
EndIf
If KeyboardPushed(#PB_Key_Space) And space = 0
space = 2
br = 1
Break
EndIf
If KeyboardPushed(#PB_Key_Right) Or KeyboardPushed(#PB_Key_Up)
ggst.d = ggst.d - 0.3
If ggst < 0
ggst = 0
EndIf
SetGadgetState(1,ggst.d)
EndIf
If KeyboardPushed(#PB_Key_Left) Or KeyboardPushed(#PB_Key_Down)
ggst.d = ggst.d + 0.3
If ggst > 91
ggst = 91
EndIf
SetGadgetState(1,ggst.d)
EndIf
Until (time - starttime) > 1100
Return
Danke für weitere Hilfe.