Menu mit Tastatur und Maus im Grafikmodus

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Menu mit Tastatur und Maus im Grafikmodus

Beitrag 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
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag 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.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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
Zuletzt geändert von D@nte am 09.07.2007 10:47, insgesamt 2-mal geändert.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...

.... ;) ....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag 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:
Kinder an die Macht http://scratch.mit.edu/
Antworten