Seite 1 von 2

Menü erstellung

Verfasst: 25.03.2009 16:11
von fen
Hallo,

Ich bin noch Anfänger in Pure Basic, und wollte ein Metronom programmieren bis jetzt gab es noch keine Probleme.

Habe das eigentlich Grundprogramm auch fertig, aber wollte noch ein Menü einbinden das beim Programmstart erscheint und indem man alles Einstellen kann:

Farbe wählen
Sound wählen
Schnelligkeit
Lautstärke
und was schwierig wird verschiedene darstellungen also kein Strich sondern zwei aufblinkende Kreise, oder vielleicht ein Balken usw.

Das Problem ist das ich keine Ahnung habe wie ich die beiden Programme jetzt sozusagen "verbinden" soll. Ich hoffe Ihr versteht was ich meine.

Code: Alles auswählen

InitMovie()
InitSprite()
InitKeyboard()

OpenScreen(640,480,32,"Metronom")

Metronomx = -310

LoadMovie(0,"pong.wav")

Repeat
ClearScreen($FFFFFF)
StartDrawing(ScreenOutput())
FrontColor($00FF00)
Line(320,470,Metronomx,-460)
StopDrawing()
FlipBuffers()

If Metrox = 0
Metronomx +5
Else
Metronomx -5
EndIf

If Metronomx > 310
Metrox = 1
MovieAudio(0,100,100)
PlayMovie(0,0)
EndIf

If Metronomx < -310
Metrox = 0
MovieAudio(0,100,-100)
PlayMovie(0,0)
EndIf

Delay(10)

ExamineKeyboard()
Until KeyboardPushed (1)

Verfasst: 25.03.2009 16:13
von KeyKon
Willkommen an Board!
Als ersten kleinen Tipp kann ich dir emfpehlen den Code einzurücken, dadurch wird er sofort übersichtlicher was gerade bei längeren Codes praktischer is.
Hab hier mal deinen Code eingerückt:

Code: Alles auswählen

InitMovie()
InitSprite()
InitKeyboard()

OpenScreen(640,480,32,"Metronom")

Metronomx = -310

LoadMovie(0,"pong.wav")

Repeat
  ClearScreen($FFFFFF)
  StartDrawing(ScreenOutput())
  FrontColor($00FF00)
  Line(320,470,Metronomx,-460)
  StopDrawing()
  FlipBuffers()

  If Metrox = 0
    Metronomx +5
  Else
    Metronomx -5
  EndIf

  If Metronomx > 310
    Metrox = 1
    MovieAudio(0,100,100)
    PlayMovie(0,0)
  EndIf

  If Metronomx < -310
    Metrox = 0
    MovieAudio(0,100,-100)
    PlayMovie(0,0)
  EndIf

  Delay(10)

  ExamineKeyboard()
Until KeyboardPushed (1)
EDIT: Zum Code selbst:
Das Metronom (wenn ich mich richtig erinnere was es ist) gibt ja einen Takt vor? Du verlässt dich dabei aber offenstlich komplett auf das Durchzählen pro Durchgang was evtl. nicht immer gleichlang dauert, daher bevor es um ein Menü geht erstmal als Tipp:
Rechne mit Zeiten (Am einfachsten mittels ElapsedMilliseconds(), ich mach dir gleich mal ein Bsp)
Im übrigen würde ich für .wav-Dateien eher die Sound-Befehle nutzen...

Verfasst: 25.03.2009 16:24
von fen
Das Metronom (wenn ich mich richtig erinnere was es ist) gibt ja einen Takt vor? Du verlässt dich dabei aber offenstlich komplett auf das Durchzählen pro Durchgang was evtl. nicht immer gleichlang dauert, daher bevor es um ein Menü geht erstmal als Tipp:
Rechne mit Zeiten (Am einfachsten mittels ElapsedMilliseconds(), ich mach dir gleich mal ein Bsp)
Im übrigen würde ich für .wav-Dateien eher die Sound-Befehle nutzen...
Ich verstehe, von ElapsedMilliseconds() habe ich aber noch nichts gehört, ein Bsp wäre echt praktisch^^.

@Edit:

Brauchst die keine Mühe zu machen hab mal in der Hilfe nachgeschaut und dementsprechend in den Code eingebaut.

Code: Alles auswählen

InitMovie() 
InitSprite() 
InitKeyboard() 

OpenScreen(640,480,32,"Metronom") 

Metronomx = -310 

LoadMovie(0,"pong.wav") 

Repeat 
StartTime = ElapsedMilliseconds()             
  Delay(10)                                   
  ElapsedTime = ElapsedMilliseconds()-StartTime 

  ClearScreen($FFFFFF) 
  StartDrawing(ScreenOutput()) 
  FrontColor($00FF00) 
  Line(320,470,Metronomx,-460) 
  StopDrawing() 
  FlipBuffers() 

  If Metrox = 0 
    Metronomx +5 
  Else 
    Metronomx -5 
  EndIf 

  If Metronomx > 310 
    Metrox = 1 
    MovieAudio(0,100,100) 
    PlayMovie(0,0) 
  EndIf 

  If Metronomx < -310 
    Metrox = 0 
    MovieAudio(0,100,-100) 
    PlayMovie(0,0) 
  EndIf 

  Delay(ElapsedTime) 

  ExamineKeyboard() 
Until KeyboardPushed (1)

Verfasst: 25.03.2009 16:35
von KeyKon
Bin grad fertig geworden^^
Vll noch so als alternativkonzept:

Code: Alles auswählen

InitMovie()
InitSprite()
InitKeyboard()

OpenScreen(640,480,32,"Metronom")

Wechsel = 1000 ;Alle 1000ms (1 sek) ein Takt
Metronomx = ElapsedMilliseconds()

LoadMovie(0,"pong.wav")

Repeat
  
  ClearScreen($FFFFFF)
  
  StartDrawing(ScreenOutput())
    FrontColor($00FF00)
    If Metrox = 1
      LineXY(320,470,(ElapsedMilliseconds()-Metronomx)*620/Wechsel+10,10)
    Else
      LineXY(320,470,(Metronomx-ElapsedMilliseconds())*620/Wechsel+630,10)
    EndIf
  StopDrawing()
  
  FlipBuffers()
  
  If ElapsedMilliseconds()-Metronomx >= Wechsel
    If Metrox = 1
      Metrox = 0
      MovieAudio(0,100,100)
    Else
      Metrox = 1
      MovieAudio(0,100,-100)
    EndIf
    
    Metronomx = ElapsedMilliseconds()
    PlayMovie(0,0)
  EndIf


  ExamineKeyboard()
Until KeyboardPushed (1)
EDIT:
Ich bin mir nicht ganz sicher ob dein Beispiel so recht tut was es soll, in Fullscreenanwendungen mit FlipBuffers() braucht man zB normal kein Delay() weil FlipBuffers ohne Parameter auf den Sync (meist 60 FPS) wartet...

Aber jetz mal zu deiner eigentlichen Frage:
Einstellmöglichkeiten sind am einfachsten mit einem Windows zu realisieren, du bist natürlich im Fullscreen, wenn dir das wichtig is könntest du davor ein Window machen bei dem man vorher Einstellt was dann passieren soll...
Oder du benutzt einen Windowed Screen mit Offset (meine Empfehlung)

Verfasst: 25.03.2009 16:49
von fen
Erst mal Danke für die Hilfe^^
wenn dir das wichtig is könntest du davor ein Window machen bei dem man vorher Einstellt was dann passieren soll...
Genau so habe ich es mir vorgestellt. Erst einmal alles einstellen und dann kann man ja in den Fullscreen wechseln.
Oder du benutzt einen Windowed Screen mit Offset (meine Empfehlung)
wie kann ich das den machen es gibt nämlich nicht viele Tutorials für den bereich.

Ich habe mir gedacht einfach alles was eingestellt werden kann in Variabeln zu packen, und die ändern sich dan halt nachdem was der Benutzer will. Nur wie könnte ich den die Darstellung von Linie auf zwei Kreise umstellen ohne groß zu codieren.

Verfasst: 25.03.2009 17:01
von KeyKon
Es (Dein Projekt) hat mich grad gepackt *g*
Ich poste gleich noch ein Bsp. mit WindowedScreen, is im Prinzip nich groß anders nur das zu prallel noch auf das Fenster "aufpassen" musst^^

Verfasst: 25.03.2009 17:25
von fen
mach dir keine großen umstände, eigentlich müsste ich ja diesen part übernehmen^^

Verfasst: 25.03.2009 17:26
von KeyKon
Ich weis, hab grad aber nix zu tun und hab immer unglaublichen Spass an Miniprojekten...

Verfasst: 25.03.2009 17:31
von fen
Wie du willst, ich werde dich nicht aufhalten^^

Verfasst: 25.03.2009 17:40
von KeyKon

Code: Alles auswählen

InitSprite()
InitSound()

If OpenWindow(0,0,0,640,480,"Metronom",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(0),0,0,480,480,0,160,0) = 0
    ;Fehler
    End
  EndIf
  
  
  
  Wechsel = 1000 ;Alle 1000ms (1 sek) ein Takt
  BackColor = $FFFFFF
  FrontColor = $00FF00
  Type = 0
  
  TextGadget(0,490,13,80,20,"Intervall in ms")
   SpinGadget(1,570,10,60,20,25,10000) : SetGadgetState(1,Wechsel) : SetGadgetText(1,Str(Wechsel))
  TextGadget(2,490,43,80,20,"Lautstärke")
   TrackBarGadget(3,560,40,80,20,0,100) : SetGadgetState(3,100)
  ButtonGadget(4,490,70,140,20,"Sound ändern")
  
  ButtonGadget(5,490,100,65,20,"Hintergrund")
  ButtonGadget(6,565,100,65,20,"Fordergrund")
  
  ComboBoxGadget(7,490,130,140,20)
    AddGadgetItem(7,0,"Zeiger-Metronom") : SetGadgetState(7,0)
    AddGadgetItem(7,1,"Punkt-Metronom")
    AddGadgetItem(7,2,"Ball-Metronom")
  
  
  If LoadSound(0,"pong.wav")
    Sound = 1
  Else
    Sound = -1
  EndIf
  
  Metronomx = ElapsedMilliseconds()
  
  Repeat
  
    ClearScreen(BackColor)
  
    StartDrawing(ScreenOutput())
      FrontColor(FrontColor)
      
      Select Type
        Case 0
          If Metrox = 1
            LineXY(240,470,(ElapsedMilliseconds()-Metronomx)*460/Wechsel+10,10)
          Else
            LineXY(240,470,(Metronomx-ElapsedMilliseconds())*460/Wechsel+470,10)
          EndIf
        Case 1
          If Metrox = 1
            Circle(80,120,40+(Metronomx-ElapsedMilliseconds())*39/Wechsel)
          Else
            Circle(400,120,40+(Metronomx-ElapsedMilliseconds())*39/Wechsel)
          EndIf
        Case 2
          If Metrox = 1
            Circle(240+Cos((ElapsedMilliseconds()-Metronomx)*#PI/Wechsel+#PI)*200,240+Sin((ElapsedMilliseconds()-Metronomx)*#PI/Wechsel+#PI)*200,25)
          Else
            Circle(240+Cos((Metronomx-ElapsedMilliseconds())*#PI/Wechsel)*200,240+Sin((Metronomx-ElapsedMilliseconds())*#PI/Wechsel)*200,25)
          EndIf
      EndSelect
    StopDrawing()
  
    FlipBuffers()
  
    If ElapsedMilliseconds()-Metronomx >= Wechsel
      If Metrox = 1
        Metrox = 0
        If Sound = 1
          SoundPan(0,100)
        EndIf
      Else
        Metrox = 1
        If Sound = 1
          SoundPan(0,-100)
        EndIf
      EndIf
    
      Metronomx = ElapsedMilliseconds()
      If Sound = 1
        PlaySound(0)
      EndIf
    EndIf
    
    event = WindowEvent()
    Select event
      Case #PB_Event_CloseWindow
        End
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 1
            SetGadgetText(1,Str(GetGadgetState(1))+" ms")
            Wechsel = GetGadgetState(1)
          Case 3
            If Sound <> -1
              If GetGadgetState(3) = 0
                Sound = 0
              Else
                Sound = 1
                SoundVolume(0,GetGadgetState(3))
              EndIf
            EndIf
          Case 4
            path$ = OpenFileRequester("Sound auswählen!","","WAV-Dateien|*.wav",0)
            If path$
              If Sound = -1
                If LoadSound(0,path$)
                  Sound = 1
                EndIf
              Else
                StopSound(0)
                FreeSound(0)
                If LoadSound(0,path$) = 0
                  Sound = -1
                EndIf
              EndIf
            EndIf
          Case 5
            buff = ColorRequester()
            If buff > -1
              BackColor = buff
            EndIf
          Case 6
            buff = ColorRequester()
            If buff > -1
              FrontColor = buff
            EndIf
          Case 7
            Type = GetGadgetState(7)
        EndSelect
    EndSelect
  ForEver
EndIf
Die Frage is wieviel dir das bringt, du kannst es gerne weiter ausbauen, bei Fragen stehe ich natürlich bereit :-) Ich hab gleich mal ein paar Verschiedene Gadgets benutzt damit du ein paar kennenlernst^^