gui problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Boris1993

Betreff: gui problem

BeitragSo, Mai 16, 2010 3:52
Antworten mit Zitat
Benutzer-Profile anzeigen
hallo
ich versuche grad eine gui zu schreiben und habe ein ersten test geschrieben mit 2 buttons
der erste button funktioniert einwandfrei aber der zweite nicht und ich weiß nicht woran das liegen könnte
hier der code:
Code: [AUSKLAPPEN]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

txt1$ = "Button 1"
txt2$ = "Button 2"

Repeat
   Cls
   If button(10, 10, txt1) a = 1
   If button(10, 40, txt2) b = 1
   Text 150, 10, a
   Text 150, 40, b
   Flip
Until KeyHit(1)

End

Function button(x, y, txt$)
   Local on_btn
   Local mx = MouseX()
   Local my = MouseY()
   Local mh = GetMouse()
   If mx >= x And my >= y And mx <= x + 100 And my <= y + 20 Then
      on_btn = 1
   End If
   If on_btn = 0 Then
      Color 255, 0, 0
   ElseIf on_btn = 1 Then
      Color 0, 255, 0
   EndIf
   Rect x, y, 100, 20
   x = x + 100 / 2
   y = y + 20  / 2
   Color 0, 0, 0
   ctr_txt(x, y, txt)
   Color 255, 255, 255
   If on_btn = 1 And mh = 1 Then
      Return 1
   End If
   Return 0
End Function

Function ctr_txt(x, y, txt$)
   Local txt_len = Len(txt)
   txt_x_mid = txt_len * 8 / 2
   x = x - txt_x_mid
   txt_y_mid = 6
   y = y - txt_y_mid
   Text x, y, txt
End Function


danke für eure hilfe
mfg Boris1993

Eingeproggt

BeitragSo, Mai 16, 2010 9:33
Antworten mit Zitat
Benutzer-Profile anzeigen
das alte Problem mit der Maus-gedückt-Abfrage.
Du speicherst zwar den Wert von GetMouse ab - allerdings nur Local in der Funktion button.
Mach die Maus-Veriablen global (und frage sie nicht in der Funktion sondern einmal in der hauptschleife ab) und es solte klappen.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9
 

Boris1993

BeitragSo, Mai 16, 2010 9:59
Antworten mit Zitat
Benutzer-Profile anzeigen
ne daran kanns nicht liegen denn beim ersten button funktionierts ja sogar und die butten ändern auch beide ihre farbe wenn man mit dem zeiger über ihnen ist nur die variable die sie verändern sollen verändert sich nur beim ersten button

Lobby

BeitragSo, Mai 16, 2010 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
*Hust*,
Les dir das was Eingeproggt dir geantwortet hat bitte noch einmal durch und vergleiche das dann mit deiner Antwort mit folgendem Wissen:
MouseX() und MouseY() können selbstverständlich auch öfters als jeweils nur einmal pro Schleifendurchgang ohne Probleme aufgerufen werden da sie lediglich eine Position die immer irgendwie vorhanden ist zurückliefern.
Nun hingegen sind die Tastenabfragen, wie etwa auch GetMouse(), darauf ausgelegt, nur Klicks seit ihrem letzten Aufruf zu berücksichtigen.

D.h. nun für dein Programm, dass das MouseOver zwar einwandfrei funktioniert, nicht jedoch die Tastenerkennung für den zweiten Button da Klicks die diesen erreichen sollen zwischen dem Aufruf von GetMouse() bei Button1 und dem Aufruf von GetMouse() bei Button2 erfolgen müssten was eher unwahrscheinlich ist. Die meisten Klicks werden zwischen Button2 und Button1 erfolgen und können so auch nur von diesem abgefangen werden(Grund hierfür ist Flip welches das Programm in deinem Fall immer kurz anhält um auf die gewünschten 60FPS zu kommen).

Ich habe mir erlaubt deinen Code kurz daraufhin anzupassen, und voilà, es funktioniert:
BlitzBasic: [AUSKLAPPEN]
Graphics 800, 600, 32, 2 
SetBuffer BackBuffer()

Global mx
Global my
Global mh

txt1$ = "Button 1"
txt2$ = "Button 2"

Repeat
mx = MouseX()
my = MouseY()
mh = GetMouse()
Cls
If button(10, 10, txt1) a = a + 1
If button(10, 40, txt2) b = b + 1
Text 150, 10, a
Text 150, 40, b
Flip
Until KeyHit(1)

End

Function button(x, y, txt$)
Local on_btn
If mx >= x And my >= y And mx <= x + 100 And my <= y + 20 Then
on_btn = 1
End If
If on_btn = 0 Then
Color 255, 0, 0
ElseIf on_btn = 1 Then
Color 0, 255, 0
EndIf
Rect x, y, 100, 20
x = x + 100 / 2
y = y + 20 / 2
Color 0, 0, 0
ctr_txt(x, y, txt)
Color 255, 255, 255
If on_btn = 1 And mh = 1 Then
Return 1
End If
Return 0
End Function

Function ctr_txt(x, y, txt$)
Local txt_len = Len(txt)
txt_x_mid = txt_len * 8 / 2
x = x - txt_x_mid
txt_y_mid = 6
y = y - txt_y_mid
Text x, y, txt
End Function
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Hubsi

BeitragSo, Mai 16, 2010 10:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz schön dreist... Ne Scherz am Rande Mr. Green Probier den Tip von Eingeproggt, gefühlsmäßig wage ich zu behaupten das es dann funktioniert. Und wegen dem warum such im Forum mal nach MouseHit. Ist vom Prinzip dasselbe wie GetMouse Du wirst sicher einige Erklärungen finden Wink

Edit: Also erstens zu langsam und zum anderen, Du sollst nicht GetMouse mit MouseHit tauschen, nur die Suche wird mehr passende Ergebnisse ausspucken. Das nur weil ich beim Korrekturlesen gemerkt habe das die Formulierung problemlos falsch verstanden werden könnte Smile
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

Boris1993

BeitragSo, Mai 16, 2010 10:41
Antworten mit Zitat
Benutzer-Profile anzeigen
ich begreifs nich Laughing ich hab das von eingeproggt ja sogar probiert und das ergebnis war das gleiche und als ichs nach euren antworten nochmal versucht hab hats geklappt
hmm zwischendurch hab ich auch einmal den pc neu gestartet vllt hats erst desshalb geklappt
danke für die hilfe
ist sowas bei euch auch mal gewesen dass ein prog nach der verbesserung noch nicht funktioniert hat aber nach dem neustart
denn wenn man weiß wann sowas auftritt kann man sich viel grübelei ersparen^^

Thunder

BeitragSo, Mai 16, 2010 11:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Du darfst mh nicht in derselben Funktion aktualisieren wie die Buttons! Für den Anfang kannst du es einfach in der Hauptschleife aktualisieren.
Außerdem: Text gibt dir von Haus aus die Möglichkeit, den Text zentriert auszugeben:
BlitzBasic: [AUSKLAPPEN]
Text x+50,y+10,"Hallo",True,True


mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

Hangman

BeitragSo, Mai 16, 2010 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
So ist das gemeint und es geht:

Code: [AUSKLAPPEN]
Graphics 800, 600, 32, 2
SetBuffer BackBuffer()

txt1$ = "Button 1"
txt2$ = "Button 2"

Global mh=0

Repeat
   Cls
   mh = GetMouse()
   If button(10, 10, txt1) a = 1
   If button(10, 40, txt2) b = 1
   Text 150, 10, a
   Text 150, 40, b
   Flip
Until KeyHit(1)

End

Function button(x, y, txt$)
   Local on_btn
   Local mx = MouseX()
   Local my = MouseY()
 
   If mx >= x And my >= y And mx <= x + 100 And my <= y + 20 Then
      on_btn = 1
   End If
   If on_btn = 0 Then
      Color 255, 0, 0
   ElseIf on_btn = 1 Then
      Color 0, 255, 0
   EndIf
   Rect x, y, 100, 20
   x = x + 100 / 2
   y = y + 20  / 2
   Color 0, 0, 0
   ctr_txt(x, y, txt)
   Color 255, 255, 255
   If on_btn = 1 And mh = 1 Then
      Return 1
   End If
   Return 0
End Function

Function ctr_txt(x, y, txt$)
   Local txt_len = Len(txt)
   txt_x_mid = txt_len * 8 / 2
   x = x - txt_x_mid
   txt_y_mid = 6
   y = y - txt_y_mid
   Text x, y, txt
End Function
Ich habe Berthold gebrochen.

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group