Frage zur Selfmade Routine

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Ronon_Dex

Betreff: Frage zur Selfmade Routine

BeitragSo, Feb 12, 2012 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Zusammen,
Ich wollte euch mal fragen was an der Routine die Ich geschrieben habe, schlecht bzw gut ist und was ich Verbessern könnte.

Ich hoffe man kann sie nicht total in die Tonne klopfen weil sie bei mehreren Anwendungen garnicht funktionieren wird.

BlitzBasic: [AUSKLAPPEN]

Graphics 800,600,16,0
SetBuffer BackBuffer()

buttonclose=LoadImage("gfx\buttonclose.png")

Repeat
Cls

If ClickButton(750,0,buttonclose,"Ende") End

Flip
Until KeyHit(1)
End


Function ClickButton(bx,by,picture,bt$="")
DrawImage picture,bx,by
Local newmx=MouseX() : newmy=MouseY()
If newmx > bx And newmx < bx+ImageWidth(picture) Then
If newmy > by And newmy < by+ImageHeight(picture) Then
If MouseHit(1) Then
Return 1
Else
Text newmx+10,newmy+10,bt
EndIf
EndIf
EndIf
End Function


mfg
Ron

Nicdel

BeitragSo, Feb 12, 2012 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest MouseHit zwischenspeichern damit du mehrere Buttons machen kannst.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7

ZaP

BeitragSo, Feb 12, 2012 12:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem bei MouseHit ist ja, dass jeder weitere Aufruf 0 zurückgeben wird, d.h. wenn Du jetzt deine Funktion aufrufst, und anschließend eine andere Funktion, die mit MouseHit arbeitest, aufrufst, wird diese niemals erfahren, dass die Maustaste gedrückt wurde. Abhilfe schafft eine Global. Ansonsten finde ich den Funktionsnamen etwas wenig aussagekräftig, aber das ist dann wohl Geschmackssache.
Starfare: Worklog, Website (download)
 

Ronon_Dex

BeitragSo, Feb 12, 2012 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Würde es auch FlushMouse tun oder sollte ich wirklich den Mausklick zwischenspeichern ?

BladeRunner

Moderator

BeitragSo, Feb 12, 2012 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Zwischenspeichern, denn Flushmouse löscht ja nur die gespeicherten Klicks.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

SpionAtom

BeitragSo, Feb 12, 2012 13:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich speichere auch immer die Mauskoordinaten zwischen. Und zwar auch global zu Beginn des Hauptschleifendurchlaufs.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Jamagin

Betreff: ButtonClick

BeitragSo, Feb 12, 2012 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!

Ich würde das so machen! Ist zwar fast gleich wie deines!


lg. Jamagin

Code: [AUSKLAPPEN]

Graphics3D 800, 600, 16, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

Global vsync   = CreateTimer(60)
Global mx, my, ButtonClick = 0
Global greenButtontext$ = "ICH BIN DER GRUENE BUTTON...!"

FlushKeys() : FlushMouse()
Repeat
   WaitTimer (vsync)
   mx = MouseX() : my = MouseY()   
   Color 255, 255, 255 : Rect 750, 0, 50, 50, 0
   Color 255, 255, 255 : Rect 550, 50, 50, 50, 0
   
   SubProgramm()
   
   Select ButtonClick
      Case 1
         ; Programm beenden
          End
      Case 2   
         ; einen anderen Button wählen
         Text 10, 30, greenButtontext$
         
      Case 3
         ; und so weiter ...
   End Select
Text 10, 10, "mx= "+mx+"   my="+my+"   ButtonClick="+ButtonClick
Flip 0
Cls
Until KeyHit(1)
End


Function SubProgramm()
   ; Programm schließen
   If mx > 750 And my < 50
      If RectsOverlap (mx, my, 1, 1, 750, 0, 50, 50)
         Color 255, 0, 0 : Rect 751, 1, 48, 48, 1
         If MouseHit(1) Then ButtonClick = 1
      EndIf
   ElseIf mx > 550 And mx < 600 And my > 50 And my < 100
      If RectsOverlap (mx, my, 1, 1, 550, 50, 50, 50)
         Color 0, 255, 0 : Rect 551, 51, 48, 48, 1
         If MouseHit(1) Then ButtonClick = 2
      EndIf   
   Else
      If MouseHit(1) Then ButtonClick = 0
      ButtonClick = 0
   EndIf
End Function

Xeres

Moderator

BeitragSo, Feb 12, 2012 23:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist so nicht sinnvoll. ButtonClick gibt ohne return keinen Wert zurück (und ohne Klammern sowieso nicht) und im Prinzip sollte Mousehit in eine Globale Variable kommen, wofür du hier nur einen komplizierten Umweg nimmst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Jamagin

BeitragSo, Feb 12, 2012 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres

Aha! Sollte ButtonClick einen Wert zurückliefern? Wieso, das tut es ja, weil die Variable Global ist. Die letzte Zeile in der Funktion löscht ja nur den ButtonClickwert wenn man außerhalb der Buttons herumklickt und das sollte ja vermieden werden, denn wenn man außerhalb klickt und dann mit der Mouse über das X für Programm beenden fährt (rotes Rechteck) wird es auch beendet und das soll aber erst beendet werden, wenn man im Bereich dessen draufklickt! Ansonsten habe ich die Fragestellung einfach falsch verstanden! Sorry!

lg. Jamagin
Bevor du etwas neues beginnst, erledige das alte

Xeres

Moderator

BeitragSo, Feb 12, 2012 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach, mein Fehler; ich hielt ButtonClick für die Funktion... Um den Mausklick überall zu haben und Funktionen wirklich nützlich zu machen (Parameter benutzen statt Hardcoden!) würde ich es aber so ähnlich machen:
BlitzBasic: [AUSKLAPPEN]
Global gfx_w = 400, gfx_h = 600
Graphics(gfx_w,gfx_h,32,2)
SetBuffer BackBuffer()
Local Timer = CreateTimer(60)

Const KEY_ESC=1
Global mx,my,mh1

Repeat
Cls

mx=MouseX()
my=MouseY()
mh1=MouseHit(1)

Local HoverText$=""

;* If, falls der klick genügt und Hover ignoriert werden kann (oder anders herum)
If Button("Start", gfx_w*.5, gfx_h*.3)=2 Then HoverText="Neues Spiel"

;* Select um alle möglichen Werte zu verarbeiten
Select Button("Ende", gfx_w*.5, gfx_h*.8)
Case 1
End
Case 2
HoverText="Beenden"
End Select

Text(gfx_w*.5, gfx_h*.9,HoverText,True,True)

Flip(0)
WaitTimer(Timer)
Until KeyHit(KEY_ESC)

Function Button(txt$, x, y, w=128, h=32)
Rect(x-w/2,y-h/2,w,h,False)
Text(x,y,txt,True,True)
If MouseInRect(x-w/2,y-h/2,w,h) Then
;* Hovereffekt:
Rect(x-(w/2)+2,y-(h/2)+2,w-4,h-4,False)
Rect(x-(w/2)+4,y-(h/2)+4,w-8,h-8,False)
If mh1 Then
;* Geklickt
Return 1
Else
;* nur auf dem Button
Return 2
EndIf
EndIf
End Function

;* Mouse on the Road, siehe Codearchiv -
Function MouseInRect(x, y, w, h)
If mx <= x Then Return False
If my <= y Then Return False
If mx >= x + w Then Return False
If my >= y + h Then Return False
Return True
End Function

Statt Text, kann man auch ein Bild/Bilder benutzen, aber: Alles was oft und überall benutzt wird 1x in Variablen speichern und ruhig für spezifische Problemstellungen eine Hilfsfunktion benutzen, da bleibt die Übersicht gewahrt und man kann sie sicherlich noch mal irgendwo gut gebrauchen.
Ronon_Dex war also schon ganz gut dabei.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group