Erweiterbare und Skinnbare GUI + benötigte weitere Klassen
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
M0rgensternBetreff: Erweiterbare und Skinnbare GUI + benötigte weitere Klassen |
So, März 06, 2011 16:08 Antworten mit Zitat |
|
---|---|---|
Hallo Leute.
Nachdem ich gestern Abend und heute damit zugebracht habe eine GUI zu programmieren möchte ich sie euch nicht vorenthalten. Bisher gibt es eigentlich nur zwei Komponenten: Fenster und Buttons. Die Fenster können als Vollbildfenster erstellt werden und sind dann unsichtbar oder als sichtbare Komponenten in beliebigen Größen. Die Buttons haben eine im Type vorgegebene Größe. Die kann abgeändert werden, ich rate jedoch dazu die Grafiken in der gleichen Größe zu erstellen. Die Grafiken werden zwar entsprechend skaliert, aber das könnte unter Umständen blöd aussehen. Der Unterschied zwischen Vollbildfenstern und kleineren Fenstern mag seltsam anmuten, jedoch ist es so, dass jedes GUI Element (also z.B. Buttons) nur zu einem Fenster gehören kann. Ein alleinstehendes GUI Element kann es nicht geben. Man kann also über ein Fenster eine ganze Reihe Buttons ein und ausschalten, man hat aber auch die Möglichkeit einzelne Buttons ein- und auszuschalten. Ich muss eins dazu sagen: Die GUI baut auf drei von mir selbst geschriebenen Klassen auf. Darunter zwei Verwaltungsklassen für Bilder und eine Vektorklasse. Die drei Klassen kommen also auch hier in diesen Beitrag. Außerdem wird ein INIParser benötigt. Der Einfachheit halber stelle ich auch den, den ich noch habe rein. Ihr könnt für alles beliebige Grafiken verwenden, der entsprechende Pfad muss dann halt in der INI Datei reingeschrieben werden und der Pfad für die INI Datei muss auch in der GUI geändert werden. Langer Rede kurzer Sinn, hier die Klassen: Vektorklasse: BlitzMax: [AUSKLAPPEN] Type TVector2D 'A Vector Class which can do any Operation on 2D Vectors Bilderklassen: BlitzMax: [AUSKLAPPEN] AutoMidHandle(True) INIParser: BlitzMax: [AUSKLAPPEN] Function GetValue:String(sLine:String) 'Gibt den Wert, also das was rechts vom "=" steht zurück Die GUI: BlitzMax: [AUSKLAPPEN] Type TGui 'Type für die GUI Der Inhalt der momentanen INI Datei: Zitat: [Windows]
Imagename = GUIWinImage Imagepath = Data/gfx/GUI/Window.png [Buttons] Imagename = GUIButImage Imagepath = Data/gfx/GUI/ButtonCamouflage.png CellWidth = 150 Cellheight = 50 Totalframes = 2 Die Buttongrafik: https://www.blitzforum.de/upload/file.php?id=10379 Die Fenstergrafik (die mir nicht so gut gelungen ist): https://www.blitzforum.de/upload/file.php?id=10380 Und hier ist noch ein kleines Testprogramm. Der erste Teil demonstriert einfach verschiedene Fenstergrößen. Wenn man dann Escape drückt kommt man in den zweiten Teil. Dort ist ein kleines Menü aufgebaut. JEDER Button erfüllt hier eine Funktion. BlitzMax: [AUSKLAPPEN] SuperStrict Über Kritik oder Anregung würde ich mich sehr freuen. Hoffe, dass jemand was damit anfangen kann. Achja, ich weiß dass im Titel erweiterbar steht: Die GUI ist im Prinzip auch leicht mit neuen Elementen erweiterbar. Dazu muss man der Fensterklasse nur eine neue Liste für das entsprechende Element spendieren und das Element implementieren. In der TGUI Klasse muss dann nur noch die entsprechende Liste in den Fenstern durchgegangen werden. lg, M0rgenstern |
||
blackgecko |
So, März 06, 2011 19:15 Antworten mit Zitat |
|
---|---|---|
Also ohne das getestet zu haben fällt mir auf, dass du im Testcode den Kompiler-Flag für MacOS setzt und gar nicht wieder schließt
2. Ich würde deine GUI sehr gern testen, aber mir die Codes zusammenzukopieren und dann noch in den Dateien rumzueditieren ist mir zu aufwändig. Pack doch bitte alles was man braucht in ein Archiv, das man in einem Rutsch runterladen kann |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
M0rgenstern |
So, März 06, 2011 19:53 Antworten mit Zitat |
|
---|---|---|
Hast ja Recht, tut mir Leid.
So ists einfacher: https://www.blitzforum.de/upload/file.php?id=10381 Das mit der Kompilerflag: Ich arbeite momentan auf nem Mac, von daher war die eh unnütz. Ist jetzt entfernt. Lg, M0rgenstern |
||
empet |
So, März 06, 2011 22:25 Antworten mit Zitat |
|
---|---|---|
habs auch mal getestet und mir ist aufgefallen, dass man das fenster verliert wenn man zu schnell mit der maus fährt. vielleicht kannst du das noch beheben. irgendwie prüfen ob man beim letzten rendern ein fenster in der hand hatte und dann (wenn mousedown=1) immer noch verschieben. | ||
blackgecko |
Mo, März 07, 2011 23:33 Antworten mit Zitat |
|
---|---|---|
Also wie schon gesagt, Verschieben von Fenstern ist sehr hakelig, besonders beim Verschieben nach oben.
Ich hab auch mal ein bisschen durch den Code geschaut. Vom Aufbau gar nicht schlecht, Funktionspointer bei den Buttons, gefällt mir. Aber eine Sache muss ich doch heftig kritisieren: Beim Erstellen eines Buttons muss man als Parent den Namen des Fensters (also das was in der Titelleiste steht) angeben! Finde ich vorsichtig ausgedrückt eine sehr fragwürdige Methode. Warum nicht einfach die Variable des Fensters mitgeben? BlitzMax: [AUSKLAPPEN] Function Create:TButton(sName:String, bActive:Byte, fxPos:Float, fyPos:Float, fpfunction:Int(), sParentName:String)Dann kannst du dir auch die aufwändige Schleife danach sparen um das richtige Fenster zu suchen und du hast nicht mehr das Problem dass mehrere Fenster nicht den gleichen Namen haben dürfen (Oder hat das noch einen anderen Grund?) Bleibt noch zu sagen, dass das kleine Beispielprogramm meine CPU-Auslastung auf 100% hochjagt - warum auch immer. |
||
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die. |
M0rgenstern |
Di, März 08, 2011 13:53 Antworten mit Zitat |
|
---|---|---|
Also, wegen der Fenstersache: Das ist mir auch schon aufgefallen und ich weiß im Prinzip auch, woran es liegt.
Muss da nur ein wenig feintuning bei der Berechnung etc betreiben, dann sollte das passen. @blackgecko: 1. Bei mir bleibt die CPU Auslastung konstant unter 30%, warum das bei dir also so ist, weiß ich nicht. Versuch mal in das Beispielprogramm nen Timer einzubauen, momentan läufts nämlich mit der maximal möglichen Framezahl, weil ich keinen Timer eingebaut habe. 2. Das was du mit dem Fensternamen bemängelst war ein Knackpunkt bei der Implementation. Ich wollte es zuerst so machen, wie du vorschlägst. Aber: Dann muss man jedes Fenster folgendermaßen erstellen: BlitzMax: [AUSKLAPPEN] Local/Global Options:TWindow = TWindow.Create(...) Das heißt man hat X Instanzen in Variablen da rumliegen. Ich fand das einfach die unschönere Lösung als sich den Namen zu merken. Wie gesagt, ich finds einfach unnötig, die Fenster in einer Liste UND als Instanzen vorliegen zu haben. Vielleicht überleg ich mir noch ne andere Lösung. Lg, M0rgenstern |
||
DaysShadow |
Di, März 08, 2011 16:28 Antworten mit Zitat |
|
---|---|---|
Da musst du aber noch ein wenig mehr betreiben als Feintuning.
Klicke ich in die Titelleiste verschiebt sich das Fenster schon, die Fenster werden nicht sortiert, sodass das aktive Fenster unter den inaktiven bleibt und die inaktiven Fenster bewegen sich wenn ich ein anderes unter dessen Titelleiste schiebe. Zudem treibt dein Programm einen Quadcore mit 3,4 GHz insgesamt auf über 40%, das ist meiner Meinung nach inakzeptabel, denn wie soll das bitte bei kleineren Rechnern aussehen? Dazu ist dein Beispiel ja nichtmal wirklich umfangreich. Da musst du nochmal ordentlich ran. |
||
Blessed is the mind too small for doubt |
Macintosh |
Mi, März 09, 2011 15:53 Antworten mit Zitat |
|
---|---|---|
Hey, ich arbeite zz. auch an einer UI für BMax.
Diese ist schon relativ fortgeschritten und nutzt FBO's für das rendern der views. Somit wird ein View nur neu gezeichnet, wenn das auch benötigt wird. Zu deiner UI: Das bewegen der Fenster ist leider sehr schwieirig, auch springt es immer zum mittelpunkt, also die maus. Funktionspointer für die Button actions zu nutzen halte ich auch nicht für so gut, am besten währe hier reflection. Ansonsten ganz nett :) |
||
M0rgenstern |
So, März 13, 2011 23:03 Antworten mit Zitat |
|
---|---|---|
@DaysShadow: Also, ich weiß nicht, was das ist, aber bei mir ist die Auslastung viel viel geringer und ich habe keinen so Leistungsfähigen PC.
Was genau meinst du mit mein Beispielprogramm ist nicht wirklich umfangreich? Da ist im Prinzip alles gezeigt was man machen kann, was fehlt dir denn? @Macintosh: Das mit den Fenstern ist mir wie gesagt aufgefallen. Auf die Gefahr hin mich zu outen, aber: Was zu Hölle ist reflection? Lg, M0rgenstern |
||
Xaymarehemals "Cgamer" |
So, März 13, 2011 23:09 Antworten mit Zitat |
|
---|---|---|
BlitzMax: [AUSKLAPPEN] Function Hello:Object() Das afaik |
||
Warbseite |
M0rgenstern |
So, März 13, 2011 23:15 Antworten mit Zitat |
|
---|---|---|
Sorry, aber wie kann man das für Buttons nutzen?
Lg, M0rgenstern |
||
n-Halbleiter |
So, März 13, 2011 23:40 Antworten mit Zitat |
|
---|---|---|
@Xaymar: Das ist Polymorphismus in Ansätzen.
Reflection (Modul BRL.Reflection) ist die Möglichkeit, anhand von Namen Types und darin enthaltene Methoden und Felder anzusprechen. Es gibt auf bb.com - für die Leute, die mehr Funktionen benötigen - eine Erweiterung, die mehr Funktionen mit sich bringt (so kann man bspw. Pointer und Funktionen nutzen). Beispielcodes gibt's in der Dokumentation, allerdings mag das Arrayverhalten nicht direkt einleuchtend sein. @Morgenstern: Du kannst Reflection zum Beispiel nutzen, indem du deinen Buttons eine TMethod als Feld gibst, die dann bei einem Klick aufgerufen wird. |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
DaysShadow |
So, März 13, 2011 23:44 Antworten mit Zitat |
|
---|---|---|
Mit "nicht umfangreich" meine ich, dass nicht viel Inhalt in deinem Beispiel vorhanden ist, dass die Auslastung rechtfertigen würde.
Dein Beispielprogramm allein schwankt um die 25% Auslastung und was zeigst du? 4 Fenster und 5 Buttons. Meinst du ernsthaft, dass die 25% Auslastung beanspruchen sollten? Bzw. frag doch mal ganz ehrlich dich selbst, ob du fremden Code nutzen würdest der diese Eigenschaft hätte? Ich habe bei meinen Projekten noch einen GUI-Versuch von mir, von dem ich nicht behaupten würde, dass er meinen jetzigen Ansprüchen genügen würde und er ist auch nicht vollständig. Damit kann ich allerdings ebenfalls skinbare Fenster und Buttons anzeigen, die Objekte sind geordnet und reagieren wie man es erwartet wenn man sie in der Titelleiste zieht. Mein Testprogramm dazu schwankt bei mir um die 0-2% Auslastung. Meine Ansichten sind halt beim Programmieren so ausgelegt, dass die Auslastung dem Aufwand entsprechen muss und allgemein versuche ich immer die niedrigste Auslastung mit meinem Code zu erzielen. Wenn er nichts hochgradig komplexes verarbeitet, erwarte ich eben, dass die Auslastung z.B. <= 5% ist. Ich will dein Projekt ja nicht schlecht machen, allerdings denke ich ganz einfach, dass dein Code erhebliche Überarbeitung bis zum Rewrite braucht oder du irgendwo, grob gesagt, Mist geschrieben hast der eben zum Angesprochenen führt. Kann auch sein, dass ich da zu hart bin, da mich die Sache mit der Auslastung so lange quälen würde bis ich es behoben hätte. Es ist gut, wenn es in meinen Augen perfekt ist Naja, viel Text, aber vielleicht gibt es dir ja zu denken. |
||
Blessed is the mind too small for doubt |
- Zuletzt bearbeitet von DaysShadow am So, März 13, 2011 23:54, insgesamt einmal bearbeitet
Xaymarehemals "Cgamer" |
So, März 13, 2011 23:47 Antworten mit Zitat |
|
---|---|---|
@n-halbleiter: Ich dachte immer reflection=reflektieren -> eine variable steht für eine bestimmte sache, hier Object/Type | ||
Warbseite |
n-Halbleiter |
So, März 13, 2011 23:55 Antworten mit Zitat |
|
---|---|---|
Das wäre Polymorphismus.
Quasi-Definition: Eine Objektreferenz kann in verschiedene Überklassen "gecastet" werden, bzw. als diese gespeichert werden (macht z.B. bei Containerklassen Sinn). Memo an mich: Nicht einfach an die englischen Begriffe die deutsche Endung ranpacken, im Deutschen heißt das ganze "Polymorphie", im Englischen "polymophism". Wikipedia sagt dazu |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
Macintosh |
Mo, März 14, 2011 1:59 Antworten mit Zitat |
|
---|---|---|
Mit der Reflection und dem Button:
Der Button besitzt 2 Felder. Ein mal sein Target (ein Objekt) und als Zweites eine TMethod die im Target aufgerufen werden soll. Dann kannst du dir deine Controller-Klasse schreiben, und ihre Instanz als target des Buttons setzen. Der Kann dann auch der Klasse methoden aufrufen. Das ist weit aus sauebrer und man braucht die views/gadgets nicht mehr als globale wie wenn du Funktionspointer benutzt. |
||
M0rgenstern |
Mo, März 14, 2011 15:05 Antworten mit Zitat |
|
---|---|---|
So, also, wegen der Reflection: Sorry, aber ich hab kaum was verstanden.
Wäre lieb, wenn mir das bitte jemand etwas grundlegender erklären könnte. @DaysShadow: Du hast Recht, wenn nichts komplexes berechnet wird etc sollte ein Programm kaum Auslastung haben und 25% sind einfach zu viel, da hast du auch Recht. Ich habe jetzt extra was ausprobiert und: Meine erste Vermutung, die ich schon schrieb, war richtig. Ich wollte nämlich anfangs wissen, wie viele FPS mit der GUI momentan möglich sind und habe den Timer rausgelassen. Jetzt habe ich den Timer nur mal in die zweite Schleife eingebaut, aber nicht in die erste. Und siehe da: zwischen 1 und 4% Auslastung, was ich für vollkommen in Ordnung halte, oder wie siehst du das? Es liegt also nicht an nem groben Schlitzer in der GUI sondern daran, dass ich keinen Timer benutzt habe. Lg, M0rgenstern |
||
n-Halbleiter |
Mo, März 14, 2011 16:27 Antworten mit Zitat |
|
---|---|---|
Ich dachte, das was ich schrieb, sei grundlegend genug.
Egal, nochmal zum mitschreiben: BlitzMax-Dokumentation hat Folgendes geschrieben: BlitzMax provides limited support for a form of runtime reflection.
Using reflection, programs can 'inspect' objects and types at runtime. You can determine the fields and methods contained in an object or type, set and get object fields and invoke - or 'call' - object methods. Bedeutet: Du kannst über die Namen, die du im Quellcode genutzt hast, deine Types und Objekte ansprechen und deren Werte verändern. |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
M0rgenstern |
Mo, März 14, 2011 22:16 Antworten mit Zitat |
|
---|---|---|
Okay, ich hab mir jetzt mal die brl.Reflections angesehen und verstehe jetzt was Reflections sind.
Was ich aber nicht verstehe: Wie hilft das bei Buttons weiter, bzw warum macht das Buttons einfacher, bzw wie kann man das für Buttons benutzen? Kann mir bitte jemand dazu ein Beispiel dazu geben, wie das funktioneirt, weil ich mir das momentan nicht vorstellen kann. Lg, M0rgenstern |
||
BladeRunnerModerator |
Di, März 15, 2011 7:34 Antworten mit Zitat |
|
---|---|---|
Ich persönlich würde dir im Normalfall sogar eher davon abraten, da Reflection zumindest bei größerem Gebrauch recht schwerfällig sein kann. Ansonsten ist es aber eine schöne Sache, denn Du kannst all deinen Objekten passende Methoden mitgeben und die mittels eines frei setzbaren Strings(!) aufrufen. | ||
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 |
Übersicht BlitzMax, BlitzMax NG Codearchiv & Module
Powered by phpBB © 2001 - 2006, phpBB Group