Buttons im Fullscreen modus

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Hellboy
Beiträge: 14
Registriert: 11.09.2004 11:20

Buttons im Fullscreen modus

Beitrag 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
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Schau auch mal ins CodeArchiv, da gibt es einen Ordner "Graphics\Sprites&Screen\ButtonsOnScreen" mit einigen Beispielen zum Thema. :D
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Hellboy
Beiträge: 14
Registriert: 11.09.2004 11:20

Beitrag von Hellboy »

Hab ich schon gemacht, hilft mir auch nicht weiter den code zu debuggen... :wink:
Benutzeravatar
Hellboy
Beiträge: 14
Registriert: 11.09.2004 11:20

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Hellboy
Beiträge: 14
Registriert: 11.09.2004 11:20

Beitrag 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.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Sehr schön, damit ist Dir ein weiterer Eintrag im CodeArchiv sicher.... :mrgreen:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Antworten