Eigener Button
Übersicht

ShyioxBetreff: Eigener Button |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Heyho,
ich bin vor ein Paar Tagen durch einen Wettbewerb in der Schule mal wieder auf BB aufmerksam geworden und habe auch mein Projekt für diesen Wettbewerb mit BB geschrieben. Dort ging es jedoch nur darum, das es funktioniert, das "wie" war egal. Jetzt jedoch beschäftige ich mich mit BB auch wieder in meiner Freizeit und ich bin gerade dabei ein kleines aber feines Spiel zu programmieren, um meine Kenntnisse wieder aufzufrischen. Dieses mal jedoch geht es mir aber auch um die Effektivität die ich in meiner Programmierung verwende, da man ja stets bestrebt ist diese zu verbessern. Also, nun zum eigentlichen Problem, zudem ich leider in der Suchfunktion nichts gefunden habe ![]() Ich bin gerade dabei mir meine eigene Button-Funktion zu schreiben, die folgende Eigenschaften hat: - Button wird erst wirklich geklickt, wenn man die Maus über ihm wieder loslässt - Button wird nicht geklickt, wenn man die Maus außerhalb des Buttons loslässt - andere Buttons werden von dem Mausklick der auf dem Button gestartet wurde NICHT geklickt - Animation (nebensächlich - der Code ist wichtig) Mein Code sieht bis jetzt so aus: BlitzBasic: [AUSKLAPPEN] Function button(id,x,y,sx,sy,t$) Die globalen Variablen im Hauptprogramm sind: BlitzBasic: [AUSKLAPPEN] Global mp wobei BlitzBasic: [AUSKLAPPEN] mh=MouseHit(1) Die Button Funktion wird also Beispielsweise so aufgerufen: BlitzBasic: [AUSKLAPPEN] button(ID,x-Position,y-Position,x-Größe,y-Größe,"Beschriftung")
Beispiel: BlitzBasic: [AUSKLAPPEN] If button(2,128,208,128,64,"Button") Then Nun zu mein Problem. Ich würde gerne bei den Buttons ohne ID arbeiten, jedoch müsste ich dafür intern der Funktion eine Variable speichern können (mp = ob auf dem Button bereits der erste Teil des Klicks stattgefunden hat). Mir ist jedoch keine Möglichkeit bekannt, bei einer Funktion die bei jedem Schleifen-Aufruf neu initialisiert wird, mit der man eine Variable länger als diesen einen Schleifendurchlauf speichern könnte. Weiß da vielleicht jemand was? Ansonsten bin ich offen für Verbesserungsvorschläge meiner Button-Funktion ![]() Mfg - Shyiox |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klingt nach einem Fall für Type![]() ![]() |
||
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 |
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich denke nicht, dass das so funktionieren wird, da ich ja den "state" Wert aus dem Return der Button-Funktion für if-Abfragen benötige.
Wie soll man denn bei einer if-Abfrage herauskriegen, ob irgend ein Objekt (Button) auf dem Bildschirm dessen ID nichtmal bekannt ist, da man ja hier mit Types arbeitet, gedrückt wurde oder nicht? Das neue "Objekt" wird bei mir auch direkt durch die if-Abfrage erstellt, dass heißt wenn man zwei if-Abfragen hat die nach dem "State" des Buttons verlangen, sind auch 2 Buttons auf dem Bildschirm. Ich hoffe du kannst mir so weit folgen. Tut mir leid, aber ich wüsste echt nicht wie ich das realisieren sollte mit Types, vor allem da ich so gut wie überhaupt nicht damit gearbeitet habe bisher (oder wenn dann unter anderem Namen, und anderer Syntax). Vielleicht kannst du mir das ja nochmal kurz erläutern - wäre nett ![]() Mfg - Shyiox |
||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich kann deinem problem leider nicht ganz folgen.
Wenn du das problem darin siehst, das du dann einen Button duplizierst / Neu erschaffst, dann umgeh das problem doch einfach. Bladerunner hat dich bereits auf die lösung hingewiesen ![]() Update: 1) Deine Buttons pappst du in ein Type (breite, höhe, wurde zuletzt gedrückt, ist pink gefärbt, hat einen alten großvater) - sprich alle werte, die du für diesen button benötigst. 2) Kommt es nun zum mausdruck, gehst du mit each den Button-Type durch und überprüfst anhand der koordinaten ob der Button gedrückt wurde (mouseDown). Ist dem so, speicherst du in einem globalen isLastPressed den button. 3) Wird die maus nun losgelassen (isLastPressed <> null & MouseDown(1) = 0), überprüfst du erneut die position der Maus und schaust, ob isLastPRessed immernoch "unter der maus" liegt. Wenn ja -> Do whatever you want! PS: isLastPressed wieder auf null / 0 setzen. Zum zeichnen: 1) Deine buttons sind immernoch im selben type vorliegend, keinerlei kopien oder duplikate sollte vorhanden sein ![]() 2) Willst du zeichnen, schreibe dir zb eine DrawButton(x,y,w,h, isPressed) funktion. Gehe nun jeden Type Button durch und rufe "DrawButton" mit den entsprechenden Button-fields auf. isPressed kannst du ermitteln, wenn isLastPressed existiert und isLastPressed = momentaner button des each-durchlaufs ist. In dem fall kannst zb eine sonderform des zeichnens innerhalb der funktion nutzen (aka leicht eingedrückt, ne schrille grüne farbe, nen ausrufezeichen daneben..) 3) Flip nicht vergessen ![]() So hast du: Keinerleid ungewünschte kopien. Saubere und aufgeräumte programmierform Gute performance Gute übersicht Ein Buttontype, was du später evtl noch erweitern kannst (zb einen wert speichern, welche funktion bei einem maus-druck ausgeführt werden soll... keine ahnung, wie man das in BB macht, sorry!) Einen "sichtbaren" button, der immer mit den selben werten wie die update funktion arbeitet. Gruß, PhillipK ![]() (ps: Fertigen code bitte posten, dann lern ich noch was *grins*) |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Deine Methode würde unglaublich viel redundanten Code generieren, Shyiox, denn überleg mal wieviele dieser If-Schachteln du bräuchtest wenn Du ein ganzes Programm mit Buttons versorgst. Noch schlimmer: nehmen wir an Du möchtest das ein Benutzer variablen Input je nach Situation geben kann, dann ändert sich die Anzahl der Buttons dynamisch zur Laufzeit des Programms. Das ist bei deiner Methode quasi nicht zu händeln.
Die Types sind btw. keine Unbekannten, denn Du kannst ihnen intern weiter eine ID zuweisen als auch ihr Objecthandle abfragen. Dieses kann deine Funktion auch als return-Wert nutzen, denn es wird ja immer nur ein Button zur gleichen Zeit gedrückt sein bei einer normalen Mausabfrage. Selbst wenn es mehrere sein sollten wäre der Type noch im Vorteil, Du kannst ihn zB in ein Antwort-array eintragen. Arbeite mal die Beispiele zu Types in der OnlineHilfe durch und verrsuch sie zu verstehen. Types sind das mächtigste Instrument was BB an Bord hat. |
||
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 |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo auch.
Types sind möglich und sicher langfristig die bessere Wahl, wenn man den Funktionsumfang erweitern möchte, aber auch ein, zwei Funktionen hätten ihren Reiz, wenn es klein und simpel bleiben soll. Einem Anfänger kann man nur raten, sich gleich mit Types auseinander zu setzen - der Mechanismus ist codetechnisch aber grundsätzlich recht leicht um zu schreiben (wenn man schon etwas geübter ist, jedenfalls). Aber praktische Tipps für alle Fälle: Das ist suboptimal: BlitzBasic: [AUSKLAPPEN] If mx>x Then Man schreibt solche Blöcke höchstens einmal - und zwar in eine Funktion MouseInRect, MouseOutOfRect - welche Variante halt gefragt ist - und ruft diese dann aus Button aus auf. Ferner: IDs sind Unfug. Entweder man hat eine Funktion und reagiert auf dessen Rückgabewert - dann weiß man, was gedrückt wurde - oder man man fragt das Objekt (die Version mit Types) ab - dann weiß man auch, wo und in welcher Situation man ist. Für die Information, ob die Maustaste losgelassen wurde, brauchst du wohl eine eigene Funktion und eine Globale Variable. Das Problem hat aber nichts mit Buttons zu tun. Alles hübsch in Funktionen gliedern: Teile und Herrsche! |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bitte bitte benutze And![]() |
||
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke erstmal an euch ![]() Das mit den Types habe ich jetzt verstanden denke ich mal, und werde es dann auch ausprobieren. Bei der Lösung mit den Types: Ich muss aber trotzdem irgendwie definieren wo welcher Button liegt?! Wie löse ich das dann am geschicktesten? Ein Data Feld am Ende des Programms sieht nämlich ziemlich dumm aus... oder gibt es keine andere Lösung? ![]() Mfg - Shyiox |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du Types benutzt, kannst du ja das Erstellen von der Abfrage trennen.
Pseudo: BlitzBasic: [AUSKLAPPEN] Type TButton Rückgabewerte von Funktionen richtig definieren nicht vergessen: BlitzBasic: [AUSKLAPPEN] Function CreateButton.TButton(_data) |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
- Zuletzt bearbeitet von Xeres am Sa, Dez 08, 2012 15:00, insgesamt einmal bearbeitet
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich nehme mal an dieses "_data" bedeutet so viel wie, dass er alle Daten übernimmt?
Ich hab in letzter Zeit öfter sowas mit "_irgendwas" gesehen, weiß aber bis jetzt nicht genau wofür das gut ist? ![]() Mfg - Shyiox |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das ist nur eine Namenskonvention - viele Programmierer kennzeichnen mit dem _ eine Variable die in einem Type liegt oder die für eine Zuweisung deklariert wird. Das kannst Du handhaben wie du willst, nur konsistent solltest du dann sein ![]() EDIT: Und um es klar zu machen: das _data ist nur ein Beispiel und bedeutet nicht dass automatisch alle Felder eines Types befüllt werden! |
||
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 |
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Denn bei mir macht er aus dem "_data" ein "_Data" (blau) und sagt dann "Expecting Identifier" ![]() Btw: Die "Clicked" Funktion muss ich auch noch erstellen richtig? Oder ist das auch ein Type? ._. Mfg - Shyiox PS: Sorry das ich so viele Fragen stelle xD Edit: Ahh ok ![]() |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verzeihung, es muss natürlich "B\Data = ..." in BB sein... und ja: der Code oben soll nur ein paar Möglichkeiten darstellen und muss ausgeweitet werden, wenn er laufen soll. | ||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Shyiox |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ok... ich hab erstmal irgendwas geschrieben und das Programm gibt zumindest keine Fehler zurück ![]() Aber ich wette ich habe 1000 Fehler gemacht - leider habe ich keine Ahnung wo ![]() Die ganzen Funktionen: BlitzBasic: [AUSKLAPPEN] Type TButton Im Hauptprogramm: BlitzBasic: [AUSKLAPPEN] Graphics 640,480,32,2 Sorry, ist erstmal ne ganze Menge... aber ich werde durch die ganzen kurzen Onlinehilfen zu Types nicht wirklich schlauer hab ich das Gefühl ![]() Hoffe ihr könnt mir sagen wo hier mein (vermutlich ständiger) Denkfehler liegt. Mfg - Shyiox |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Als kleine Änderung würde ich anmerken, dass man Return gleich verwenden kann, also:
BlitzBasic: [AUSKLAPPEN] Function MouseInRect(x,y,x2,y2)Zusätzliche Variablen braucht man nicht, und Konstanten schaffen immer bessere Übersicht. Was du natürlich gar nie machen darfst ist BlitzBasic: [AUSKLAPPEN] Local StartButton.TButton = CreateButton(12,12,64,128,"Button")in der Hauptschleife aus zu führen! Damit erzeugst du jeden Schleifendruchlauf einen neuen Button bis dir der Speicher ausgeht. Außerdem: Timer immer in Verbindung mit Flip(0) ![]() Ansonsten sieht's doch aber gut aus. ![]() |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group