Seite 1 von 1

Buttons im Fullscreen modus

Verfasst: 10.10.2004 19:59
von Hellboy
Ich würde gerne im Fullscreenmodus Buttons benutzen. Dafür hab ich diese Routine geschrieben. Leider funzt se nicht so wie sie soll.
Die Routine erkennt nicht wann der Button geklickt wurde und wann nicht.
Würde mich sehr freuen wenn ihr mir helfen könntet.

Code: Alles auswählen

Global OldMausButton.b

InitKeyboard()
InitSprite()
InitMouse()

Structure Button
 x1.w
 y1.w
 x2.w
 y2.w
 inactive.b
 text.s
EndStructure

Dim Button.Button(100)

Button(0)\x1 = 10
Button(0)\y1 = 10
Button(0)\x2 = 80
Button(0)\y2 = 19
Button(0)\text = "Neu"

Button(1)\x1 = 110
Button(1)\y1 = 10
Button(1)\x2 = 80
Button(1)\y2 = 19
Button(1)\text = "Laden..."

OpenScreen(1024, 768, 16, "Gothic Editor")

LoadSprite(0, "gfx\Cursor.bmp", 0)     ;Sprites laden
TransparentSpriteColor(0 ,255 ,0 ,255)

Procedure.b DrawButton(button.b)
MausButton1.b = MouseButton(1)

If StartDrawing(ScreenOutput()) <> 0
 If MausButton1.b And OldMausButton.b = 0
  If MouseX() < Button(button.b)\x1 + Button(button.b)\x2 And MouseX() > Button(button.b)\x1 And MouseY() < Button(button.b)\y1 + Button(button.b)\y2 And MouseY() > Button(button.b)\y1
   Wert.b = 2 ;geklickt
  EndIf
 ElseIf MausButton1.b = 0 And OldMausButton.b
  If MouseX() < Button(button.b)\x1 + Button(button.b)\x2 And MouseX() > Button(button.b)\x1 And MouseY() < Button(button.b)\y1 + Button(button.b)\y2 And MouseY() > Button(button.b)\y1
   Wert.b = 1 ;losgelassen
  EndIf
  Box(Button(button.b)\x1 - 1, Button(button.b)\y1 - 1, Button(button.b)\x2, Button(button.b)\y2, 16777215)
 EndIf
 
  Box(Button(button.b)\x1, Button(button.b)\y1, Button(button.b)\x2, Button(button.b)\y2, 10197915)
  Locate(Button(button.b)\x1 + 1, Button(button.b)\y1 + 1)
  DrawingMode(1)
  If Button(button.b)\inactive  = 0
   FrontColor(0, 0, 0)
  Else 
   FrontColor(100, 100, 100)
    Wert.b = 0
  EndIf
  DrawText(Button(button.b)\text)
 StopDrawing()

 OldMausButton.b = MausButton1.b
 ProcedureReturn Wert.b
 EndIf
EndProcedure

Repeat
 
 FlipBuffers()
 ClearScreen(25,25,5) ;Hintergrundfarbe

 Bu0$ = Str(DrawButton(0))
 Bu1$ = Str(DrawButton(1))
 
 If StartDrawing(ScreenOutput()) <> 0
  DrawingMode(1)
  FrontColor(155,155,155)
  Locate(100, 100)
  DrawText("B0 - " + Bu0$)
  Locate(100, 120)
  DrawText("B1 - " + Bu1$)
  StopDrawing()
 EndIf

 If Bu0$ <> "0" Or Bu1$ <> "0"
  Delay(300)
 EndIf
 
 ExamineMouse()
 ExamineKeyboard()
 DisplayTransparentSprite(0, MouseX(), MouseY())

Until KeyboardPushed(#PB_Key_Escape)
End

Verfasst: 10.10.2004 21:02
von Andre
Schau auch mal ins CodeArchiv, da gibt es einen Ordner "Graphics\Sprites&Screen\ButtonsOnScreen" mit einigen Beispielen zum Thema. :D

Verfasst: 10.10.2004 21:29
von Hellboy
Hab ich schon gemacht, hilft mir auch nicht weiter den code zu debuggen... :wink:

Verfasst: 11.10.2004 16:50
von Hellboy
Hab das ganze jetzt nochmal geändert, aber es funzt immer noch nicht. Der 1. Button funktioniert so, wie er soll, aber der 2. funktioniert nur manchmal.. :?
Ich brauche eure hilfe ich bin schon am verzeifeln... :cry:

Code: Alles auswählen

Global OldMausButton.b

InitKeyboard()
InitSprite()
InitMouse()

Structure Button
 x1.w
 y1.w
 x2.w
 y2.w
 inactive.b
 text.s
EndStructure

Dim Button.Button(100)

Button(0)\x1 = 10   ;Buttons deklarieren
Button(0)\y1 = 10
Button(0)\x2 = 80
Button(0)\y2 = 19
Button(0)\text = "Neu"

Button(1)\x1 = 110
Button(1)\y1 = 10
Button(1)\x2 = 80
Button(1)\y2 = 19
Button(1)\text = "Laden..."

OpenScreen(1024, 768, 16, "Editor")

LoadSprite(0, "gfx\Cursor.bmp", 0)
TransparentSpriteColor(0 ,255 ,0 ,255)

Procedure.b DrawButton(button.b)
ExamineMouse()
MausButton1.b = MouseButton(1)

If StartDrawing(ScreenOutput()) <> 0

 If MouseX() < Button(button.b)\x1 + Button(button.b)\x2 And MouseX() > Button(button.b)\x1 And MouseY() < Button(button.b)\y1 + Button(button.b)\y2 And MouseY() > Button(button.b)\y1 And MouseButton1.b = 0
  
 EndIf

 If MausButton1.b = 1 And OldMausButton.b = 0
  If MouseX() < Button(button.b)\x1 + Button(button.b)\x2 And MouseX() > Button(button.b)\x1 And MouseY() < Button(button.b)\y1 + Button(button.b)\y2 And MouseY() > Button(button.b)\y1
   Wert.b = 2 ;geklickt
  EndIf
 ElseIf MausButton1.b = 0 And OldMausButton.b = 1
  If MouseX() < Button(button.b)\x1 + Button(button.b)\x2 And MouseX() > Button(button.b)\x1 And MouseY() < Button(button.b)\y1 + Button(button.b)\y2 And MouseY() > Button(button.b)\y1
   Wert.b = 1 ;losgelassen
  EndIf
 Else
  Box(Button(button.b)\x1 - 1, Button(button.b)\y1 - 1, Button(button.b)\x2, Button(button.b)\y2, 16777215)
 EndIf
 
 Box(Button(button.b)\x1, Button(button.b)\y1, Button(button.b)\x2, Button(button.b)\y2, 10197915)
 Locate(Button(button.b)\x1 + 1, Button(button.b)\y1 + 1)
 DrawingMode(1)
 If Button(button.b)\inactive  = 0
  FrontColor(0, 0, 0)
 Else 
  FrontColor(100, 100, 100)
  Wert.b = 0
 EndIf
 DrawText(Button(button.b)\text)
  
 FrontColor(155,155,155)
 Locate(100, 140)
 DrawText("MB:  " + Str(MausButton1.b))
 Locate(100, 160)
 DrawText("OMB: " + Str(OldMausButton.b))
 FrontColor(0, 0, 0)
  
 StopDrawing()

 OldMausButton.b = MausButton1.b
 ProcedureReturn Wert.b
EndIf

EndProcedure

Repeat
 
 FlipBuffers()
 ClearScreen(25,25,5) ;Hintergrundfarbe

 Bu0$ = Str(DrawButton(0))
 Bu1$ = Str(DrawButton(1))
 
 If StartDrawing(ScreenOutput()) <> 0
  DrawingMode(1)
  FrontColor(155,155,155)
  Locate(100, 100)
  DrawText("B0 - " + Bu0$)
  Locate(100, 120)
  DrawText("B1 - " + Bu1$)
  StopDrawing()
 EndIf

 Delay(80)
 
 ExamineMouse()
 ExamineKeyboard()
 DisplayTransparentSprite(0, MouseX(), MouseY())

Until KeyboardPushed(#PB_Key_Escape)
End

Verfasst: 11.10.2004 17:08
von DarkDragon
Hmm... Ich hab dir mal ne ganz simple Methode gebastelt:

Code: Alles auswählen

;/////////////////INFOS\\\\\\\\\\\\\\\\\\\
;Autor:       DarkDragon
;WWW:         http://www.bradan.net/
;Description: This is a easy method to make buttons in a screen.

InitSprite()
InitMouse()
InitKeyboard()

Procedure Draw()
  StartDrawing(ScreenOutput())
  DrawText("Buttonexample - by DarkDragon http://www.bradan.net/")
  StopDrawing()
EndProcedure

Procedure ScreenDrawButton(Sprite, X.l, Y.l, Width, Height, *Proc) ;Sprite is horizontally tiled in 3 Parts: Normal|Hover|Pressed
  MX = MouseX()
  MY = MouseY()
  If MX > X And MX < X+Width And MY > Y And MY < Y+Height
    If MouseButton(1)
      ClipSprite(Sprite, (Width/3)*2, 0, Width/3, Height)
      CallFunctionFast(*Proc)
    Else
      ClipSprite(Sprite, Width/3, 0, Width/3, Height)
    EndIf
  Else
    ClipSprite(Sprite, 0, 0, Width/3, Height)
  EndIf
  ProcedureReturn DisplayTransparentSprite(Sprite, X, Y)
EndProcedure

OpenScreen(1024, 768, 32, "Test")

;Create a Button
CreateSprite(0, 300, 30)
StartDrawing(SpriteOutput(0))
Box(0  , 0, 100, 30, RGB(255, 0, 0))
Box(100, 0, 100, 30, RGB(0, 255, 0))
Box(200, 0, 100, 30, RGB(0, 0, 255))
StopDrawing()

Repeat
  If IsScreenActive()
  ExamineMouse()
  ExamineKeyboard()
  ReleaseMouse(0)
  ClearScreen(0, 0, 0)
  ScreenDrawButton(0, 100, 100, 300, 30, @Draw()) ;Display the Button
  
  ;Draw the mousecursor
  StartDrawing(ScreenOutput())
  Box(MouseX(), MouseY(), 2, 2, $FFFF00)
  StopDrawing()
  FlipBuffers()
  EndIf
Until KeyboardPushed(#PB_KEY_ESCAPE)
FreeSprite(0)
CloseScreen()
End
>>EDIT:
Achja, kann ins CodeArchiv aufgenommen werden, damit man das nicht nochmal im Forum frägt, war glaub schon oft da wenn ich mich recht entsinne.

Verfasst: 11.10.2004 17:26
von Hellboy
Hm.. Ich will doch nur den Bug in meiner Routine finden. :cry:
Außerdem ist bei dir auch nen Bug drinn, weil man noch 200 Pixel weiter rechts vom Button auf denselbigen klickern kann.

Verfasst: 11.10.2004 23:33
von Andre
DarkDragon hat geschrieben:>>EDIT:
Achja, kann ins CodeArchiv aufgenommen werden, damit man das nicht nochmal im Forum frägt, war glaub schon oft da wenn ich mich recht entsinne.
Mache ich doch gerne, aber erst wenn der kleine Bug mit der Mausabfrage bereinigt ist... :wink:

Verfasst: 11.10.2004 23:54
von Deeem2031

Code: Alles auswählen

;/////////////////INFOS\\\\\\\\\\\\\\\\\\\ 
;Autor:       DarkDragon 
;WWW:         http://www.bradan.net/ 
;Description: This is a easy method to make buttons in a screen. 

InitSprite() 
InitMouse() 
InitKeyboard() 

Procedure Draw() 
  StartDrawing(ScreenOutput()) 
  DrawText("Buttonexample - by DarkDragon http://www.bradan.net/ and Deeem2031 http://www.deeem2031.de.vu/") 
  StopDrawing() 
EndProcedure 

Procedure ScreenDrawButton(Sprite, x.l, y.l, Width, Height, *Proc) ;Sprite is horizontally tiled in 3 Parts: Normal|Hover|Pressed 
  MX = MouseX() 
  MY = MouseY() 
  If MX > x And MX < x+Int(Width/3) And MY > y And MY < y+Height 
    If MouseButton(1) 
      ClipSprite(Sprite, (Width/3)*2, 0, Width/3, Height) 
      CallFunctionFast(*Proc) 
    Else 
      ClipSprite(Sprite, Width/3, 0, Width/3, Height) 
    EndIf 
  Else 
    ClipSprite(Sprite, 0, 0, Width/3, Height) 
  EndIf 
  ProcedureReturn DisplayTransparentSprite(Sprite, x, y) 
EndProcedure 

OpenScreen(1024, 768, 32, "Test") 

;Create a Button 
CreateSprite(0, 300, 30) 
StartDrawing(SpriteOutput(0)) 
Box(0  , 0, 100, 30, RGB(255, 0, 0)) 
Box(100, 0, 100, 30, RGB(0, 255, 0)) 
Box(200, 0, 100, 30, RGB(0, 0, 255)) 
StopDrawing() 

Repeat 
  If IsScreenActive() 
    ExamineMouse() 
    ExamineKeyboard() 
    ReleaseMouse(0) 
    ClearScreen(0, 0, 0) 
    ScreenDrawButton(0, 100, 100, 300, 30, @Draw()) ;Display the Button 
    
    ;Draw the mousecursor 
    StartDrawing(ScreenOutput()) 
    Box(MouseX(), MouseY(), 2, 2, $FFFF00) 
    StopDrawing() 
    FlipBuffers() 
  EndIf 
Until KeyboardPushed(#PB_Key_Escape) 
FreeSprite(0) 
CloseScreen() 
End

Verfasst: 12.10.2004 00:00
von Andre
Sehr schön, damit ist Dir ein weiterer Eintrag im CodeArchiv sicher.... :mrgreen: