Seite 1 von 2

Menu mit Tastatur und Maus im Grafikmodus

Verfasst: 06.07.2007 13:09
von Xaby
PB 4.1
Stellt ein Menu mit Ereignis bei den Optionen da.
Hoffe, der Quellcode spricht für sich.
Von mir aus kann er gern verbessert werden und wieder hier reingestellt werden. Ist nur eine Skizze für Anfänger.

Hoffe, es hilft jemandem.
Gruß, Folker

Code: Alles auswählen

Enumeration
#Maus  
EndEnumeration

#Violett = $FF00FF
#Weisz   = $FFFFFF
#Grun    = $00FF00
#Rot     = $0000FF

Global MenuPunkte.l

Procedure MenuPunkt(Text.s)
  MenuPunkte+1
  DrawText(100,100+25*MenuPunkte,LSet(" "+Text,20," "),0,#Grun)
  
  
EndProcedure

Procedure MaleMenu()
  MenuPunkte=0
  StartDrawing(ScreenOutput())
  MenuPunkt("Spiel starten")
  MenuPunkt("Optionen")
  MenuPunkt("Credits")
  MenuPunkt("Beenden")
  StopDrawing()
  ProcedureReturn MenuPunkte
EndProcedure


Procedure MachSprite(Sprite, x,y)
  CreateSprite(Sprite,x,y) 
  StartDrawing(SpriteOutput(Sprite))
  Box(0,0,x,y,#Violett)
EndProcedure  

Procedure MachMauszeiger()
  MachSprite(#Maus,16,16)
  LineXY(0,0,11,11,#Weisz)
  LineXY(0,0,0,16,#Weisz)
  LineXY(11,11,0,16,#Weisz)
  StopDrawing()
EndProcedure

Procedure IstMaus()
  Ergebnis=0
  For MenuP=1 to 4
    If MouseX()>100 and MouseX() < 220 and MouseY()> (100+25*MenuP) and MouseY()< (100+25*MenuP+20)
      
      StartDrawing(ScreenOutput())
      If MouseButton(#PB_MouseButton_Left)
        Ergebnis=MenuP  
        DrawText(300,40,Str(MouseX())+" : "+Str(MouseY())+" Klick "+Str(MenuP))
      Else
        
          DrawText(300,40,Str(MouseX())+" : "+Str(MouseY()))
        
      EndIf
      StopDrawing()
        
    EndIf
  Next
  ProcedureReturn Ergebnis
EndProcedure

Global MAuswahl

Procedure MenuAbfrage(AlteWahl)
  MMax=MaleMenu()
  AuswahlMaus=IstMaus()
  Auswahl=0
  
  If KeyboardReleased(#PB_Key_Down)
    MAuswahl+1
  EndIf
  
  If KeyboardReleased(#PB_Key_Up)
    MAuswahl-1
  EndIf
  
  If KeyboardReleased(#PB_Key_Return)
    Auswahl=MAuswahl
  EndIf
  
  If MAuswahl<1
    MAuswahl=MMax
  EndIf
  
  If MAuswahl>MMax
    MAuswahl=1
  EndIf
  
  StartDrawing(ScreenOutput())
    Box(80,100+25*MAuswahl,15,10,#Rot)
     
    StopDrawing()
    
    If AuswahlMaus<>0
      Auswahl=AuswahlMaus
    EndIf
  
  If Auswahl>0
    ProcedureReturn Auswahl
  Else  
    ProcedureReturn AlteWahl
  EndIf  
EndProcedure



InitSprite()
InitMouse()
InitKeyboard()
InitSound()

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

TransparentSpriteColor(#PB_Default,#Violett)
MachMauszeiger()

MAuswahl=1

Repeat
  ClearScreen(0)
  
  ExamineKeyboard()
  MenuAuswahl=MenuAbfrage(MenuAuswahl)
  debug MenuAuswahl
   
   
  If KeyboardPushed(#PB_Key_Escape)
    Quit=1
  EndIf
  
  ExamineMouse()
  
  DisplayTransparentSprite(#Maus,MouseX(),MouseY())
  
  If MenuAuswahl=2
    
    StartDrawing(ScreenOutput())
      DrawText(300,300,"Optionen !!!",#Rot, 0)
    StopDrawing()
    
  EndIf
  
  If MenuAuswahl=4
    Quit=1
  EndIf
  
  
  Delay(10)
   
  FlipBuffers()
  
Until Quit=1

Verfasst: 06.07.2007 13:19
von ts-soft
>> Ist nur eine Skizze für Anfänger
Gerade dann würde ich EnableExplicit bzw. Variablendeklaration begrüssen :wink:
PS: Ich persönlich nutze keine Codes, wo die Variablen nicht deklariert sind

Gruß
Thomas

Verfasst: 06.07.2007 13:37
von Kaeru Gaman
hm.. yo.. nuja...
was ist das fürn komischer roter klecks neben "spiel starten"?

mit der variablendefinition geb ich ts recht...
und als beispiel für anfänger könnte es wesentlich besser kommentiert sein.

Verfasst: 06.07.2007 14:09
von bobobo
ts-soft hat geschrieben:....
PS: Ich persönlich nutze keine Codes, wo die Variablen nicht deklariert sind

Gruß
Thomas
na dann mal flugs ein Programm machen, welches aus Inlinedefinitionen
explizite macht.

Verfasst: 06.07.2007 14:19
von ts-soft
bobobo hat geschrieben:na dann mal flugs ein Programm machen, welches aus Inlinedefinitionen explizite macht.
Benötige ich nicht :wink: , ich deklariere schon autom. ohne drüber nachzu-
denken. So viele fremde Codes, wo ein nachträgliches einfügen der
Deklarationen erforderlich ist, nutze ich nicht. Ich denke mal, das die paar
noch verbliebenen "Nichtdeklarierer" die Vorteile früher oder später erkennen
werden, so das solch Tool überflüssig ist. Der Code vom Rest wird wohl
sowieso nicht so gut sein :mrgreen:

Verfasst: 06.07.2007 15:25
von D@nte
Hab's mal nen bischen umgearbeitet...

MachSprite(Sprite, x,y) & MachMauszeiger() zu Create_Mouse(Sprite, x, y) zusammen gefasst
Variablen deklariert und in englisch gehalten
Aussage kräftigere englische Procedurename benutzt
Quelltextformatierung
Dem Menü nen netteres Aussehen verpasst und den 'komischen roten klecks' komplett eingebunden
Achja die Proceduren kommentiert

Code: Alles auswählen

EnableExplicit

Define selectedMenuItem, quit

Enumeration
  #Maus
  #Icon
EndEnumeration

#Violett  = $FF00FF
#White    = $FFFFFF
#Black    = $000000
#Green    = $00FF00
#Red      = $0000FF

Global menuItem.l, selectedMenu.l

Procedure Create_MenuItem(Text.s)
  ; Erzeugt die MenüItems ('Buttons')
  menuItem + 1
  Box   (100, 100 + 25 * menuItem, 120, 20, #Green)
  Circle(220, 110 + 25 * menuItem,  10, #Green)
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(100, 102 + 25 * menuItem, "  " + Text, #Black)
EndProcedure

Procedure Create_Menu()
  ; Erzeugt das Menü
  menuItem = 0
  StartDrawing(ScreenOutput())
    Create_MenuItem("Spiel starten")
    Create_MenuItem("Optionen")
    Create_MenuItem("Credits")
    Create_MenuItem("Beenden")
  StopDrawing()
  ProcedureReturn menuItem
EndProcedure

Procedure Create_Mouse(Sprite, x, y)
  ; Erzeugt ein weißes Dreieck als Mauszeiger
  ;
  ; @param
  ; Sprite  = Nummer des zu erzeugenden Sprites
  ; x       = Größe des Sprites in x Richtung
  ; y       = Größe des Sprites in y Richtung
  CreateSprite(Sprite, x, y)
  StartDrawing(SpriteOutput(Sprite))
    Box   ( 0,  0, 16, 16, #Violett)
    LineXY( 0,  0, 11, 11, #White)
    LineXY(11, 11,  0, 16, #White)
    LineXY( 0, 16,  0,  0, #White)
  StopDrawing()
EndProcedure

Procedure Create_SelectionIcon()
  ; Erzeugt einen eoten Halbkreis, der das ausgewählte MenuItem makiert
  CreateSprite(#Icon, 10, 20)
  StartDrawing(SpriteOutput(#Icon))
    Box   ( 0,  0, 10, 20, #Violett)
    Circle(10, 10, 10, #Red)
  StopDrawing()
EndProcedure

Procedure Get_MousePosition()
  ; Ermittelt auf welchem 'Button' sich die Mausgerade befindet und setzt
  ; die rote Makierung vor den der Mausposition entsprechenden 'Button',
  ; gibt weiterhin die Position des Mauszeigers sowie den Druck der linken
  ; Maustaste aus
  ;
  ; i       = entspricht der Anzahl der Menüpunkte beginnend bei 1 (!)
  ; result  = liefert die Nummer des angewählten Menüpunkts zurück
  Protected result, i
  result = 0
  For i = 1 To 4
    If MouseX() > 100 And MouseX() < 220 And MouseY() > (100 + 25 * i) And MouseY() < (100 + 25 * i + 20)
      StartDrawing(ScreenOutput())
      If MouseButton(#PB_MouseButton_Left)
        result = i
        DrawText(300, 40, Str(MouseX()) + " : " + Str(MouseY()) + " Klick " + Str(i))
      Else
        DrawText(300, 40, Str(MouseX()) + " : " + Str(MouseY()))
      EndIf
      StopDrawing()
    EndIf
  Next i
  If MouseX() > 100 And MouseX() < 220
    If MouseY() > 125 And MouseY() < 145
      selectedMenu = 1
    ElseIf MouseY() > 150 And MouseY() < 170
      selectedMenu = 2
    ElseIf MouseY() > 175 And MouseY() < 195
      selectedMenu = 3
    ElseIf MouseY() > 200 And MouseY() < 220
      selectedMenu = 4
    EndIf
  EndIf
  ProcedureReturn result
EndProcedure

Procedure Get_MenuItem(selection)
  ; Ermittelt das aktuelle MenuItem ('Button')
  ;
  ; @param
  ; selection       = Nummer des zuletzt angewählten MenuItems ('Buttons')
  ;
  ; menuMax         = Anzahl der MenuItems ('Buttons')
  ; mouseSelection  =
  ; newSelection    = Nummer des neu ausgewählten MenuItems ('Buttons')
  ; first           = Y-Koordinate mittig des ersten MenuItems
  ; last            = Y-Koordinate mittig des letzten MenuItems
  Protected menuMax, mouseSelection, newSelection, first, last
  menuMax         = Create_Menu()
  mouseSelection  = Get_MousePosition()
  newSelection    = 0
  first           = 135
  last            = 210

  If KeyboardReleased(#PB_Key_Down)
    selectedMenu + 1
    If MouseX() > 100 And MouseX() < 220
      If (MouseY() > 125 And MouseY() < 145) Or (MouseY() > 150 And MouseY() < 170) Or (MouseY() > 175 And MouseY() < 195) Or (MouseY() > 200 And MouseY() < 220)
        MouseLocate(MouseX(), MouseY() + 25)
      EndIf
    EndIf
  EndIf

  If KeyboardReleased(#PB_Key_Up)
    selectedMenu - 1
    If MouseX() > 100 And MouseX() < 220
      If (MouseY() > 125 And MouseY() < 145) Or (MouseY() > 150 And MouseY() < 170) Or (MouseY() > 175 And MouseY() < 195) Or (MouseY() > 200 And MouseY() < 220)
        MouseLocate(MouseX(), MouseY() - 25)
      EndIf
    EndIf
  EndIf

  If KeyboardReleased(#PB_Key_Return)
    newSelection = selectedMenu
  EndIf

  If selectedMenu < 1
    selectedMenu = menuMax
    If MouseX() > 100 And MouseX() < 220
      MouseLocate(MouseX(), last)
    EndIf
  EndIf

  If selectedMenu > menuMax
    selectedMenu = 1
    If MouseX() > 100 And MouseX() < 220
      MouseLocate(MouseX(), first)
    EndIf
  EndIf

  DisplayTransparentSprite(#Icon, 89, 100 + 25 * selectedMenu)

  If mouseSelection <> 0
    newSelection = mouseSelection
  EndIf

  If newSelection > 0
    ProcedureReturn newSelection
  Else
    ProcedureReturn selection
  EndIf
EndProcedure

InitSprite()
InitMouse()
InitKeyboard()
InitSound()

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

TransparentSpriteColor(#PB_Default, #Violett)
Create_Mouse(#Maus, 16, 16)
Create_SelectionIcon()

selectedMenu = 1

Repeat
  ClearScreen(0)

  ExamineKeyboard()
  selectedMenuItem = Get_MenuItem(selectedMenuItem)
  Debug selectedMenuItem

  ExamineMouse()

  DisplayTransparentSprite(#Maus, MouseX(), MouseY())

  If selectedMenuItem = 1
    StartDrawing(ScreenOutput())
      DrawText(300, 300, "Spiel start !!!", #Red, 0)
    StopDrawing()
  EndIf

  If selectedMenuItem = 2
    StartDrawing(ScreenOutput())
      DrawText(300, 300, "Optionen !!!", #Red, 0)
    StopDrawing()
  EndIf

  If selectedMenuItem = 3
    StartDrawing(ScreenOutput())
      DrawText(300, 300, "Credits : Source by Xaby, Edit by D@nte", #Red, 0)
    StopDrawing()
  EndIf

  If selectedMenuItem = 4 Or KeyboardPushed(#PB_Key_Escape)
    quit = 1
  EndIf

  Delay(10)
  FlipBuffers()

Until quit = 1

Verfasst: 08.07.2007 21:17
von Xaby
Ja, eigentlich war es nur ne Skizze und eine Probe.

Kein Code, den ich als Tutorial ausgeben würde. Bin auch für Variablendeklaration.

Der rote Klecks sieht schon gut aus, leider funktioniert die Tastaturauswahl im Menü nicht so super, wenn man den Mauszeiger über einem Menüpunkt hat!

Aber sonst natürlich hübscher als meins.

:allright:

Verfasst: 08.07.2007 22:02
von D@nte
>leider funktioniert die Tastaturauswahl im Menü nicht so super
Nette Umschreibung für 'geht nicht' ;)

Hab den Source dem entsprechen überarbeitet

>Aber sonst natürlich hübscher als meins.
Tut mir leid ;p
Ne hatte eigentlich erst gar nit vor deinen Source grafisch zu ändern aber dein DrawText mit Backcolor sah einfach sowas von böse aus weil keiner der Menüpunkte gleich lang war...

Achja wenn wer Langeweile hat kann er ja mal meinen roten Halbkreis zu nem richtigen Halbkreis machen, dann knn der evtl auch näher ans Menü, denn atm ist das nen roter Kreis der halbiert ist und auf der rechten Seite schwarz eingefärbt wurde *pfeif unschuldig*

Schade nur das im CodeArchiv schon ne optisch viel ansprechenderes Game-Menu is

Verfasst: 08.07.2007 22:19
von Kaeru Gaman
D@nte hat geschrieben:Schade nur das im CodeArchiv schon ne optisch viel ansprechenderes Game-Menu is
yo, deswegen ja...

eigentlich sollte ein CT&T-code dann auch besondere 'kniffe' beinhalten...

.... ;) ....

Verfasst: 09.07.2007 10:15
von Xaby
Tipp für Halbkreis:

Sprite 7 x 15

Den Kreis auf 7 um Radius und an die Stelle 6, 6 im Sprite gezeichnet

Dann hättest du einen Halbkreis.


Zu Kaeru, ja ich hab mir auch gedacht, ob es nicht lieber ins Anfängerforum sollte. Dachte mir aber, dass da nur Fragen hinkommen.
Vielleicht eröffnen wir noch einen Bereich für TUTs für Anfänger oder sowas.

:allright: