Rudimentäre Button-Klasse mit viele Features

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

Skulk

Betreff: Rudimentäre Button-Klasse mit viele Features

BeitragMi, Jul 26, 2006 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
So, ich habe mich mal an eine Klasse gemacht, die einen Button zeichnen soll (übrigens auch als Modul verfügbar...aber noch nicht hochgeladen)

Achtung:
das Demo-Beispiel erfordert 3 Bilder unter C:\temp - den Punkt könnt ihr aber auch auskommentieren, er dient nur zur Demonstration
C:\temp\normal.bmp
C:\temp\hover.bmp
C:\temp\clicked.bmp


Was kann die Button-Klasse?
- 3 Stati: Normal, Hover, Clicked
- ButtonClick wird erst ausgelöst, wenn MouseButton wieder losgelassen wird
- Eigene Schriftarten und -größen
- Textschatten (Offset für alle 3 Stati setzbar)#
- Jede Farbe der 3 Stati ist konfigurierbar (Hintergrund, Rahmen Akzent1, Rahmen Akzent2, Textfarbe, Textschattenfarbe)
- Alphawerte einstellbar (Hintergrund, Rahmen Akzent1, Rahmen Akzent2, Text, Textschatten)
- Es können auch Bilder als Buttons verwendet werden (wieder je eines pro Status)


Viel Spaß!

Code: [AUSKLAPPEN]
SuperStrict

' ====================================================================
'                           K O N S T A N T E N
' ====================================================================


' Konstanten für den Displaymode (wie der Button gerendert wird)
Const DISPLAYMODE_NORMAL:Byte          = 0         ' Normales Rendering durch DrawPoly und DrawRect
Const DISPLAYMODE_IMAGES:Byte          = 1         ' Rendering durch 3 Images (normal, hover und clicked)



' ====================================================================
'                       B U T T O N   -   C L A S S
' ====================================================================

Type TButton
   ' Angaben zur Position des Butttons
   Field x:Int                    = 0         ' Position des Buttons auf der X-Achse
   Field y:Int                    = 0         ' Position des Buttons auf der Y-Achse
   Field width:Int                   = 200         ' Breite Des Buttons
   Field height:Int                = 25         ' Höhe des Buttons
   
   Field BorderWidth:Int             = 2         ' Dicke des Rahmens
   Field Text:String                = "Button"      ' Text des Buttons
   
   Field DisplayMode:Byte             = DISPLAYMODE_NORMAL   ' Displaymode (siehe bei Constanten für Erklärung)
   
   ' Images wenn Bilder gerendert werden sollen
   Field ImgNormal:TImage             = Null
   Field ImgHover:TImage             = Null
   Field ImgClicked:TImage             = Null
   
   ' Alphawerte der Bilder für alle 3 Stati
   Field ImgNormalAlpha:Float          = 1.0
   Field ImgHoverAlpha:Float          = 1.0
   Field ImgClickedAlpha:Float          = 1.0
   
   
   
   Field Status:Byte                = 0         ' Interne Variable über den Status: 0 = Normal, 1 = Hover, 2 = Clicked
   Field HasBeenClicked:Byte          = False      ' Wurde der Button geclickt?
   
   Field HasCustomFont:Byte          = False      ' Soll eine eigene Schriftart benutzt werden?
   Field Font:TImageFont             = Null         ' Schrift art, die Verwendet wird, wenn HasCustomFont True
   
   Field HasTextShadow:Byte          = False      ' Soll die Beschriftung einen Schatten werfen?
   
   ' Schatten-Offsets für Normal, Hover und Clicked
   Field TextShadowOffsetNormalX:Int    = 1         ' Offset des Textschattens X
   Field TextShadowOffsetNormalY:Int    = 1         ' Offset des Textschattens Y
   
   Field TextShadowOffsetHoverX:Int    = 1         ' Offset des Textschattens X
   Field TextShadowOffsetHoverY:Int    = 1         ' Offset des Textschattens Y

   Field TextShadowOffsetClickedX:Int    = 0         ' Offset des Textschattens X
   Field TextShadowOffsetClickedY:Int    = 0         ' Offset des Textschattens Y


   ' Farben für den Hintergrund
   Field BackgroundNormalRGBA:Int       = PackRGBA(212, 208, 200, 1)         ' Farbwerte in ein Integer gepackt
   Field BackgroundHoverRGBA:Int       = PackRGBA(228, 224, 216, 1)
   Field BackgroundClickedRGBA:Int       = PackRGBA(212, 208, 200, 1)
   
   ' Farben für den Rahmen - Accent 1
   Field BorderAccent1NormalRGBA:Int    = PackRGBA(255, 255, 255, 1)
   Field BorderAccent1HoverRGBA:Int    = PackRGBA(255, 255, 255, 1)
   Field BorderAccent1ClickedRGBA:Int    = PackRGBA(128, 128, 128, 1)

   ' Farben für den Rahmen - Accent 2
   Field BorderAccent2NormalRGBA:Int    = PackRGBA(64, 64, 64, 1)
   Field BorderAccent2HoverRGBA:Int    = PackRGBA(64, 64, 64, 1)
   Field BorderAccent2ClickedRGBA:Int    = PackRGBA(128, 128, 128, 1)
   
   ' Farben für den Text
   Field TextNormalRGBA:Int           = PackRGBA(0, 0, 0, 1)
   Field TextHoverRGBA:Int              = PackRGBA(0, 0, 128, 1)   
   Field TextClickedRGBA:Int          = PackRGBA(128, 0, 0, 1)
   
   ' Farben für den Text-Schatten
   Field TextNormalShadowRGBA:Int       = PackRGBA(64, 64, 64, 0.3)
   Field TextHoverShadowRGBA:Int       = PackRGBA(64, 64, 64, 0.3)   
   Field TextClickedShadowRGBA:Int       = PackRGBA(64, 64, 64, 0.3)
   
   
   ' Funktion zum setzen der Hintergundfarbe
   Method SetBackgroundNormalColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BackgroundNormalRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBackgroundHoverColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BackgroundHoverRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBackgroundClickedColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BackgroundClickedRGBA          = PackRGBA(red, green, blue, alpha)
   End Method

   
   ' Border Accent1
   Method SetBorderAccent1NormalColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent1NormalRGBA       = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBorderAccent1HoverColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent1HoverRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBorderAccent1ClickedColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent1ClickedRGBA       = PackRGBA(red, green, blue, alpha)
   End Method
   
   
   ' Border Accent2
   Method SetBorderAccent2NormalColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent2NormalRGBA       = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBorderAccent2HoverColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent2HoverRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetBorderAccent2ClickedColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      BorderAccent2ClickedRGBA       = PackRGBA(red, green, blue, alpha)
   End Method
   
   
   ' Text
   Method SetTextNormalColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextNormalRGBA                = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetTextHoverColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextHoverRGBA                = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetTextClickedColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextClickedRGBA             = PackRGBA(red, green, blue, alpha)
   End Method
   
   ' Text-Schatten
   Method SetTextNormalShadowColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextNormalShadowRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetTextHoverShadowColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextHoverShadowRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   Method SetTextClickedShadowColor(red:Byte, green:Byte, blue:Byte, alpha:Float)
      TextClickedShadowRGBA          = PackRGBA(red, green, blue, alpha)
   End Method
   
   ' Imagemode einschalten und bilder laden
   Method SetImages(szImagePathNormal:String, fNormalAlpha:Float, szImagePathHover:String, fHoverAlpha:Float, szImagePathClicked:String, fClickedAlpha:Float)
      SetMaskColor(255,0,255)
      Self.ImgNormal               = LoadImage(szImagePathNormal, MASKEDIMAGE)
      Self.ImgHover                = LoadImage(szImagePathHover, MASKEDIMAGE)
      Self.ImgClicked                = LoadImage(szImagePathClicked, MASKEDIMAGE)
      
      Self.ImgNormalAlpha            = fNormalAlpha
      Self.ImgHoverAlpha            = fHoverAlpha
      Self.ImgClickedAlpha         = fClickedAlpha
      
      Self.width                  = ImageWidth(Self.ImgNormal)
      Self.height                  = ImageHeight(Self.ImgNormal)
      
            
      Self.DisplayMode            = DISPLAYMODE_IMAGES
   End Method
   
   ' Funktion zum setzen der Größe
   Method SetMargins(width:Int , height:Int , BorderWidth:Int)
      Self.width                   = width
      Self.height                = height
      Self.BorderWidth            = BorderWidth
   End Method
   
   ' Funktion  zum setzen der Position des Buttons
   Method SetPosition(x:Int , y:Int)
      Self.x                      = x
      Self.y                      = y
   End Method
   
   ' Funktion zum setzen der Beschriftung
   Method SetText(Text:String)
      Self.Text = Text
   End Method
   
   ' Funktion zum Laden einer eigenen Schriftart
   Method SetFont(FontPath:String, Size:Int, Style:Int)
      Self.Font = LoadImageFont(FontPath, Size, Style)
      Self.HasCustomFont = True
   End Method
   
   ' Funktion zum Setzen eines Text-Schattens
   Method SetTextShadow(OffsetNormalX:Int, OffsetNormalY:Int, OffsetHoverX:Int, OffsetHoverY:Int, OffsetClickedX:Int, OffsetClickedY:Int)
      Self.HasTextShadow = True
      
      Self.TextShadowOffsetNormalX = OffsetNormalX
      Self.TextShadowOffsetNormalY = OffsetNormalY
      
      Self.TextShadowOffsetHoverX = OffsetHoverX
      Self.TextShadowOffsetHoverY = OffsetHoverY
      
      Self.TextShadowOffsetClickedX = OffsetClickedX
      Self.TextShadowOffsetClickedY = OffsetClickedY
      
   End Method
   
   ' Button zeichnen
   Method Render()
      ' Je nach Displaymode rufe die entsprechende Funktion auf.
      Select Self.DisplayMode
         Case DISPLAYMODE_NORMAL
            Self.RenderNormal()
            
         Case DISPLAYMODE_IMAGES
            Self.RenderImages()
      End Select
   End Method
   
   Method RenderNormal()
      ' Da wir eine Accent-Farbe für den Rahmen benutzen, wird die Routine etwas komplizierter
      ' Wir benötigen die jeweiligen Punkte der Oberen Linken, die Punkte der unteren Rechten Ecke
      ' Sowie die Punkte der Oberen linken und unteren rechten Ecke, abzüglich der Rahmenstärke
      Local x1:Float             = Float(Self.x)
      Local y1:Float             = Float(Self.y)
      Local x1b:Float          = Float(Self.x + Self.BorderWidth)
      Local y1b:Float          = Float(Self.y + Self.BorderWidth)
      
      Local x2:Float             = Float(Self.x + Self.width)
      Local y2:Float             = Float(Self.y + Self.height)
      Local x2b:Float          = Float(Self.x + Self.width - Self.BorderWidth)
      Local y2b:Float          = Float(Self.y + Self.height - Self.BorderWidth)
      
      ' Aus den Punkten erstellen wir uns nun 4 Polygone. Linker Rahmen, Rechter Rahmen, Oberer Rahmen und unterer Rahmen
      Local UpperPoly:Float[]    = [x1,y1,x2,y1,x2b,y1b,x1b,y1b]
      Local LeftPoly:Float[]       = [x1,y1,x1b,y1b,x1b,y2b,x1,y2]
      Local LowerPoly:Float[]    = [x1,y2,x2,y2,x2b,y2b,x1b,y2b]
      Local RightPoly:Float[]      = [x2,y1,x2,y2,x2b,y2b,x2b,y1b]
      
   
      ' border accent1 - Oberen und Linken Rahmen zeichnen
      ' Je nach Buttonstatus, setzen der Zeichenfarbe und des AlphaWertes
      Select Self.Status
         Case 0
            SetColor UnPackR(Self.BorderAccent1NormalRGBA), UnPackG(Self.BorderAccent1NormalRGBA), UnPackB(Self.BorderAccent1NormalRGBA)
            SetAlpha UnPackA(Self.BorderAccent1NormalRGBA)         
            
         Case 1
            SetColor UnPackR(Self.BorderAccent1HoverRGBA), UnPackG(Self.BorderAccent1HoverRGBA), UnPackB(Self.BorderAccent1HoverRGBA)
            SetAlpha UnPackA(Self.BorderAccent1HoverRGBA)         
            
         Case 2
            SetColor UnPackR(Self.BorderAccent1ClickedRGBA), UnPackG(Self.BorderAccent1ClickedRGBA), UnPackB(Self.BorderAccent1ClickedRGBA)
            SetAlpha UnPackA(Self.BorderAccent1ClickedRGBA)         
            
      End Select   
      
      ' Zeichne die Polygone
      DrawPoly UpperPoly
      DrawPoly LeftPoly

      
      ' border accent - Unteren und Rechten Rahmen zeichnen
      ' Je nach Buttonstatus, setzen der Zeichenfarbe und des AlphaWertes
      Select Self.Status
         Case 0
            SetColor UnPackR(Self.BorderAccent2NormalRGBA), UnPackG(Self.BorderAccent2NormalRGBA), UnPackB(Self.BorderAccent2NormalRGBA)
            SetAlpha UnPackA(Self.BorderAccent2NormalRGBA)         
            
         Case 1
            SetColor UnPackR(Self.BorderAccent2HoverRGBA), UnPackG(Self.BorderAccent2HoverRGBA), UnPackB(Self.BorderAccent2HoverRGBA)
            SetAlpha UnPackA(Self.BorderAccent2HoverRGBA)         
            
         Case 2
            SetColor UnPackR(Self.BorderAccent2ClickedRGBA), UnPackG(Self.BorderAccent2ClickedRGBA), UnPackB(Self.BorderAccent2ClickedRGBA)
            SetAlpha UnPackA(Self.BorderAccent2ClickedRGBA)         
            
      End Select   
      
      ' Zeichne Polygone
      DrawPoly LowerPoly
      DrawPoly RightPoly
      
      
      
      
      ' Hintergrund zeichnen
      Select Self.Status
         Case 0
            SetColor UnPackR(Self.BackgroundNormalRGBA), UnPackG(Self.BackgroundNormalRGBA), UnPackB(Self.BackgroundNormalRGBA)
            SetAlpha UnPackA(Self.BackgroundNormalRGBA)         
            
         Case 1
            SetColor UnPackR(Self.BackgroundHoverRGBA), UnPackG(Self.BackgroundHoverRGBA), UnPackB(Self.BackgroundHoverRGBA)
            SetAlpha UnPackA(Self.BackgroundHoverRGBA)         
            
         Case 2
            SetColor UnPackR(Self.BackgroundClickedRGBA), UnPackG(Self.BackgroundClickedRGBA), UnPackB(Self.BackgroundClickedRGBA)
            SetAlpha UnPackA(Self.BackgroundClickedRGBA)         
            
      End Select   
      
      DrawRect Self.x + Self.BorderWidth, Self.y + Self.BorderWidth , Self.width - Self.BorderWidth * 2, Self.height - Self.BorderWidth * 2
      
      
      Self.RenderText()
      
      ' Reset - Setze die Zeichenmethoden zurück
      SetColor 255 , 255 , 255
      SetAlpha 1
   End Method
   
   ' Funktion zum Zeichnen des Buttons anhand von 3 Bildern
   Method RenderImages()      
      ' Je nach Status, zeichne ein anderes Bild
      Select Self.Status
         Case 0
            SetAlpha Self.ImgNormalAlpha
            DrawImage Self.ImgNormal, Self.x, Self.y      
            
         Case 1
            SetAlpha Self.ImgHoverAlpha
            DrawImage Self.ImgHover, Self.x, Self.y      
            
         Case 2
            SetAlpha Self.ImgClickedAlpha
            DrawImage Self.ImgClicked, Self.x, Self.y         
         
      End Select   
      
      Self.RenderText()
      
      ' Reset
      SetColor 255 , 255 , 255
      SetAlpha 1
   End Method
   
   ' Funktion zum Zeichnen des ButtonTextes
   Method RenderText()
      ' Falls eine eigene Schriftart verwendet werden soll, verwende sie
      If Self.HasCustomFont = True Then
         SetImageFont Self.Font
      End If
      
      ' Soll Text-Schatten gezeichnet werden?
      If Self.HasTextShadow = True Then
         Local tempOffsetX:Int    = 0
         Local tempOffsetY:Int    = 0
         
         
         Select Self.Status
            Case 0
               SetColor UnPackR(Self.TextNormalShadowRGBA), UnPackG(Self.TextNormalShadowRGBA), UnPackB(Self.TextNormalShadowRGBA)
               SetAlpha UnPackA(Self.TextNormalShadowRGBA)         
               tempOffsetX = Self.TextShadowOffsetNormalX
               tempOffsetY = Self.TextShadowOffsetNormalY
               
            Case 1
               SetColor UnPackR(Self.TextHoverShadowRGBA), UnPackG(Self.TextHoverShadowRGBA), UnPackB(Self.TextHoverShadowRGBA)
               SetAlpha UnPackA(Self.TextHoverShadowRGBA)      
               tempOffsetX = Self.TextShadowOffsetHoverX
               tempOffsetY = Self.TextShadowOffsetHoverY   
               
            Case 2
               SetColor UnPackR(Self.TextClickedShadowRGBA), UnPackG(Self.TextClickedShadowRGBA), UnPackB(Self.TextClickedShadowRGBA)
               SetAlpha UnPackA(Self.TextClickedShadowRGBA)
               tempOffsetX = Self.TextShadowOffsetClickedX
               tempOffsetY = Self.TextShadowOffsetClickedY         
               
         End Select   
         
         ' Versetze den Text um den jeweiligen SchattenOffset
         DrawText Self.text , (Self.x * 2 + Self.width - TextWidth(Self.Text)) / 2 + tempOffsetX , (Self.y * 2 + Self.height - TextHeight(Self.Text)) / 2 + tempOffsetY
      End If

      
      ' Zeichne Text
      Select Self.Status
         Case 0
            SetColor UnPackR(Self.TextNormalRGBA), UnPackG(Self.TextNormalRGBA), UnPackB(Self.TextNormalRGBA)
            SetAlpha UnPackA(Self.TextNormalRGBA)         
            
         Case 1
            SetColor UnPackR(Self.TextHoverRGBA), UnPackG(Self.TextHoverRGBA), UnPackB(Self.TextHoverRGBA)
            SetAlpha UnPackA(Self.TextHoverRGBA)         
            
         Case 2
            SetColor UnPackR(Self.TextClickedRGBA), UnPackG(Self.TextClickedRGBA), UnPackB(Self.TextClickedRGBA)
            SetAlpha UnPackA(Self.TextClickedRGBA)         
            
      End Select   
      
      
      DrawText Self.text , (Self.x * 2 + Self.width - TextWidth(Self.Text)) / 2 , (Self.y * 2 + Self.height - TextHeight(Self.Text)) / 2
      
      ' Reset
      SetColor 255 , 255 , 255
      SetAlpha 1
      SetImageFont Null
   End Method

   
   
   ' Button-Status updaten
   Method Update()
   
      ' Befindet sich die Mouse über unsrem Buttons?
      If MouseX() >= Self.x And MouseX() <= Self.x + Self.width And MouseY() >= Self.y And MouseY() <= Self.y + Self.height Then
         
         ' Ist Darüber hinaus die Maustaste gedrückt?
         If MouseDown(1) Then
            ' Mouse ist gedrückt, status auf .clicked setzen
            Self.Status = 2   ' Es Wurde geklickt.
         
         ' Wurde die Taste zuletzt geclickt und nun wieder losgelassen?
         ElseIf Not MouseDown(1) And Self.Status = 2 Then
            ' Button ist gedrückt und Maustaste losgelassen!
            Self.HasBeenClicked = True
            Self.Status = 0
         
         ' Keine Maustaste gedrückt und keine der oberen Bedingungen erfüllt
         ElseIf Not MouseDown(1) Then
            Self.Status = 1      ' Status auf 1 = Hover setzen
            
         End If         
      Else
         ' Button wurde nicht angerührt. Status = 0 (normal)
         Self.Status = 0
      End If
   End Method
   
   ' Bequeme Methode um den Button zu zeichnen und abzufragen
   Method HandleButton()
      Self.Render()
      Self.Update()
   End Method
   
   ' Statusvariablen resetten, wenn Button geklicked wurde
   Method ResetButton()
      Self.HasBeenClicked = False
      Self.Status = 0
   End Method
End Type



' ====================================================================
'                 D E M O   -   A P P L I K A T I O N
' ====================================================================

Graphics 800 , 600
SetBlend ALPHABLEND

' Erstelle ein paar Buttons
' Methode 1: Die Schnelle:
' --------------------------------------------
Local ButtonNewGame:TButton = New TButton      ' Eine neue Instanz der Klasse anlegen
ButtonNewGame.SetPosition(200, 150)            ' Position auf X=200 und Y=150 setzen
ButtonNewGame.SetMargins(200 , 50 , 2)         ' Breite von 200 und Höhe von 50 setzen, sowie Rahmenstärke 2 Pixel
ButtonNewGame.SetText("New Game")            ' Eine Beschriftung wählen


' Methode 2: Ein BilderButton (ACHTUNG! Die Bilder müssen vorhanden sein!)
' --------------------------------------------
Local ButtonSaveGame:TButton = New TButton
ButtonSaveGame.SetPosition(200, 220)

' Die nötigen Images setzen. Erst für Status "normal", gefolgt vom Alphawert für "normal", dann für "Hover" mit Alphawert und dann "Clicked" mit Alphawert
ButtonSaveGame.SetImages("c:\temp\normal.bmp", 0.7, "c:\temp\hover.bmp", 0.85, "c:\temp\clicked.bmp", 1)
ButtonSaveGame.SetText("Save Game")


' Methode 3: Fast alle Attribute verändern
' --------------------------------------------
Local ButtonQuit:TButton = New TButton
ButtonQuit.SetPosition(200, 340)
ButtonQuit.SetMargins(200 , 50 , 2)
ButtonQuit.SetText("Quit")

' Eine eigene Schriftart verwenden. Erst den Pfad, dann die Schriftgröße, gefolgt von den nötigen Flags
ButtonQuit.SetFont("C:\windows\fonts\ARIALBI.TTF", 26, SMOOTHFONT|BOLDFONT|ITALICFONT)
ButtonQuit.SetTextShadow(2,2,3,3,0,0)      ' einen Textschatten festlegen. Offsets in x,y paaren für Normal, Hover und Clicked

' Farben setzen
ButtonQuit.SetBackgroundNormalColor(0,128,0,1)
ButtonQuit.SetBorderAccent1NormalColor(128,255,128,1)
ButtonQuit.SetBorderAccent2NormalColor(0,96,0,1)
ButtonQuit.SetTextNormalColor(255,255,0,1)
ButtonQuit.SetTextNormalShadowColor(0,255,255,1)

ButtonQuit.SetBackgroundHoverColor(0,196,0,1)
ButtonQuit.SetBorderAccent1HoverColor(255,255,255,1)
ButtonQuit.SetBorderAccent2HoverColor(255,255,255,1)
ButtonQuit.SetTextHoverColor(196,196,0,1)
ButtonQuit.SetTextHoverShadowColor(0,255,255,1)

ButtonQuit.SetBackgroundClickedColor(0,255,0,1)
ButtonQuit.SetBorderAccent1ClickedColor(255,0,0,1)
ButtonQuit.SetBorderAccent2ClickedColor(255,0,0,1)
ButtonQuit.SetTextClickedColor(128,128,0,1)
ButtonQuit.SetTextClickedShadowColor(0,255,255,1)



' Hauptschleife
While Not KeyHit(KEY_ESCAPE)
   Cls
   
   ' Arbeite die Buttons ab. Übrigens: Falls nötig kann man HandleButton() (welches Zeichnet und Updatet) gegen Render() und Update() austauschen, so dass man zwischen drin noch eingreifne kann (falls nötig)
   ButtonNewGame.HandleButton()
   ButtonSaveGame.HandleButton()
   ButtonQuit.HandleButton()
      
   ' Prüfe ob Buttons geklickt wurden
   If ButtonNewGame.HasBeenClicked = True Then
      ButtonNewGame.ResetButton()      ' Setze die Stati (wie Normal, Hover oder Clicked wieder zurück, sowie "HasBeenClicked" auf 0. Nurn ötig wenn danach der button erneut gezeichnet werden soll

      DrawText "NewGame!" , 50 , 50
      Flip
      Delay 2000
   End If   
         
   If ButtonSaveGame.HasBeenClicked = True Then
      ButtonSaveGame.ResetButton()
      DrawText "Saving...!" , 50 , 50
      Flip
      Delay 2000
   End If
   
   If ButtonQuit.HasBeenClicked = True Then
      ButtonQuit.ResetButton()
      End
   End If
   
   Flip
Wend




' ====================================================================
'                 H I L F S - F U N K T I O N E N
' ====================================================================

' Verpacke RGB in einen Integer
Function PackRGB:Int (red:Byte, green:Byte, blue:Byte)
   Return red Shl 16 | green Shl 8 | blue Shl 0
End Function

' Verpacke RGBA in einen Integer
Function PackRGBA:Int (red:Byte, green:Byte, blue:Byte, alpha:Float)
   ' Alphawert (0-1) in Byte-Wert (0-255) verwandeln
   Local intAlpha:Byte = Int(alpha * 255)
   
   Return IntAlpha Shl 24 | red Shl 16 | green Shl 8 | blue Shl 0
End Function

' Entpacke Alphaanteil aus einem Integer
Function UnPackA:Float (packed:Int)
   ' alphawert extrahieren
   Local intAlpha:Byte = (packed & $FF000000) Shr 24
   
   ' und in Float umrechnen
   Local floatAlpha:Float = Float(intAlpha) / 255

   Return floatAlpha
End Function

' Entpacke Rotanteil aus einem Integer
Function UnPackR:Byte (packed:Int)
   Return (packed & $FF0000) Shr 16
End Function

' Entpacke Grünanteil aus einem Integer
Function UnPackG:Byte (packed:Int)
   Return (packed & $FF00) Shr 8
End Function

' Entpacke Blauanteil aus einem Integer
Function UnPackB:Byte (packed:Int)
   Return (packed & $FF) Shr 0
End Function
War doesn't determine who's right,
war determines who's left...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group