Ressource Modul Projekt
Übersicht

![]() |
HummelpupsBetreff: Ressource Modul Projekt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Gemeinde.
Vor einiger Zeit habe ich angefangen mit Java für Android zu programmieren, was im Grunde eine schöne Sache ist. Allgemein gefiel mir das Ressourcen- management mit Eclipse und Java. Ich habe mir gedacht soetwas ähnliches könnte ich für BlitzMax umsetzen. Nun möchte ich ein wenig über dieses Projekt berichten ![]() ist zu sagen, das eine Ressource den Datentyp :Ressource bekommt und alle Ressourcentypen diesen basetype erweitern. Eine Ressource ist über eine XML Datei beschrieben, jede Ressource braucht mindestens eine XML-Datei. Ich fange einfach mal mit einem Beispiel an: Hier wird ein Bild (midhandled) gezeichnet und bei Mausklick ein ton abgespielt BlitzMax Code: [AUSKLAPPEN] SuperStrict
Import "ressource.mod/ressource.bmx" Graphics 800,600,0,60 Local res:Ressource=(New Ressource).Load("kerl.xml") Local snd:Ressource=(New Ressource).Load("sound.xml") Repeat Cls if mousehit(1) snd.play res.draw(MouseX(), MouseY() Flip Until KeyHit(KEY_ESCAPE) Or AppTerminate() kerl.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<image> <id>Kerl1</id> <name>Bild von einem Kerl</name> <singleframe> <image path="kerl.png" maskcolor="255,0,255"> <handle x="-IMAGEWIDTH/2" y="-IMAGEHEIGHT/2" /> </image> </singleframe> </image> sound.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<sound> <id>Sound1</id> <name>macht bzzzzzz</name> <sound path="snd1.wav" /> </sound> Würde man beim Sound Tag nun repeat als Element hinzufügen, wird der Ton im Loop abgespielt, sobald der Spieler einmal klickt: sound.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<sound> <id>Sound1</id> <name>macht bzzzzzz</name> <sound path="snd1.wav"> <repeat /> </sound> </sound> Man kann aber auch Ambient Sounds erstellen, die sich wiederholen und automatisch starten: sound.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<sound> <id>Sound1</id> <name>macht bzzzzzz</name> <sound path="ambient.wav"> <autoplay /> <repeat /> </sound> </sound> Tja, das is ansich ja noch nicht spannend, einfacher würde es mit loadimage, drawimage gehen, aber man sieht am <singleframe> das auch animationen möglich sind beispielsweise solche: kerl.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<image> <id>Kerl1</id> <name>Bild von einem Kerl</name> <multiframe> <image path="kerl.png" maskcolor="255,0,255"> <handle x="-IMAGEWIDTH/2" y="-IMAGEHEIGHT/2" /> </image> <tileset path="kerl_tileset.png" framew="32" frameh="32" frames="5" maskcolor="255,0,255"> <handle x="-IMAGEWIDTH/2" y="-IMAGEHEIGHT/2" /> </tileset> </multiframe> </image> Nun hat diese ressource insgesamt 6 Frames, das erste Frame (0) ist kerl (welches auch eine ganz andere größe haben kann als die tileset framegröße. Frame 1-5 sind dann die tiles des animimages. nun ließe sich das mit Code: [AUSKLAPPEN] res.setFrame(4) 'beispiel
res.draw(x,y) oder Code: [AUSKLAPPEN] res.draw(x,y,frame) ' Method draw(x,y,frame=0)
zeichnen. Das ist aber noch lange nicht alles. Nun lässt sich für JEDE Ressource, wenn nötig noch scripten. Jeder Ressource kann lua werte bereitstellen und wieder entnehmen. Ich habe nun einfach mal die großgeschriebenen Variablen vorher übergeben und lese sie nach abarbeitung des SCriptes wieder aus. Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<image> <id>Kerl1</id> <name>Bild von einem Kerl</name> <multiframe> <image path="kerl.png" maskcolor="255,0,255"> <handle x="-IMAGEWIDTH/2" y="-IMAGEHEIGHT/2" /> </image> <tileset path="kerl.png" framew="32" frameh="32" frames="5" maskcolor="255,0,255"> <handle x="-IMAGEWIDTH/2" y="-IMAGEHEIGHT/2" /> </tileset> </multiframe> <script default="play"> <lua name="play" timeout="500"> CURRENT_FRAME=CURRENT_FRAME+1; If(CURRENT_FRAME>=ANIMATION_FRAMES) Then CURRENT_FRAME=0; End </lua> <lua name="stop" timeout="2000"> --Tue nichts </lua> </script> </image> Hiermit lässt sich, ohne irgendein zutun vom BlitzMax code eine animation abspielen. Mit res.setScript("stop") wir das script gewechselt und nichts mehr ausgeführt. Das Timeout im luascript steht da nicht ohne Grund. Das Problem an scripten ist, das sie sehr langsam werden, wenn man sie häufig und in großer Menge durchlaufen lässt. Hier kann der Programmierer selber bestimmen, wie häufig ein script überhaupt abgespielt werden muss. Soll die Animation sowieso nur alle 500ms wechseln, reicht es ja vollkommen, das SCript nur alle 500ms auszuführen. Ich hoffe der sinn ist klar geworden. ist timeout nicht angegeben, wird es jeden Frame ausgeführt. jeder Ressource hat eine eigene LuaVM, wenn Scripts angegeben sind, in den ersten Beispielen ist das <script> Tag nicht in der XML vorhanden, also wird erst garkeine LuaVM eingerichtet um Speed einzusparen. der LuaVM einer Ressource könnt ihr eigene Variablen und Funktionen zuweisen, das siese sich auch zurück melden können oder irgendetwas triggern. Nun gibt es schon andere, bereits implementierte Ressourcentypen. Die aktuelle liste sind: Image/Animation, MaxGui, Sound, INI, XML ini.bmx Code: [AUSKLAPPEN] SuperStrict
Import "ressource.mod/ressource.bmx" Local ini:Ressource=(New Ressource).Load("ini.xml") Print ini.get("Kategorie.schluessel") ini.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<ini path="ini.ini" /> ini.ini Code: [AUSKLAPPEN] SchluesselOhneKat=Wert
[Kategorie] schluessel=wert oder ini.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<ini>SchluesselOhneKat=Wert [Kategorie] schluessel=wert</ini> Kommen wir mal zum interessanten maxGui Part (wxMax oder irgendwelche anderen GUIs ließen sich auch als Ressource erweitern) BlitzMax Code: [AUSKLAPPEN] SuperStrict
Import "ressource.mod/ressource.bmx" local windowapp:Ressource=(new Ressource).load("window_canvas.xml") CreateTimer(30) While True WaitEvent Select EventID() Case EVENT_TIMERTICK SetGraphics CanvasGraphics(GadgetHandler.get("canvas2")) Cls DrawText MilliSecs(),5,5 Flip EndGraphics Case EVENT_WINDOWCLOSE Select EventSource() Case GadgetHandler.get("hWnd") End End Select End Select Wend window_canvas.xml Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<root> <window id="hWnd" name="window1" x="100" y="50" width="400" height="300"> <menu id="10" text="File"> <menu id="101" text="load" /> <menu id="102" text="save" /> </menu> <menu id="20" text="Ressource von"> <menu id="201" text="xml" /> <menu id="202" text="ini" /> </menu> <label text="Hallo" x="5" y="5" width="100" height="25" /> <canvas id="canvas" x="5" y="40" width="100" height="100" /> <window id="w2" name="window2" x="200" y="150" width="200" height="200"> <canvas id="canvas2" x="5" y="40" width="100" height="100" /> </window> </window> </root> erzeugt: Hier wird im Grunde jetzt schon alles von maxGui unterstützt, was man zum initialisieren von Gadgets gebrauchen kann, GadgetColor, SHape, Style, Alpha, Nodes, GadgetItems und Nodes (Wobei bei mir alles Items sind und er automatisch heraus findet ob es ein Node oder ein Gadgetitem werden soll) Code: [AUSKLAPPEN] <?xml version="1.0" ?>
<root> <window id="hWnd" name="window1" x="100" y="50" width="400" height="300"> <menu id="10" text="File"> <menu id="101" text="Close" /> </menu> <listbox id="lb1" x="5" y="5" width="200" height="50"/> <item text="Hallo" /> </listbox> </window> </root> - Alle Ressourcen unterstützen Scripte durch Lua - Sounds können flags wie autoplay, repeat usw haben - XML Dateien können leicht ausgelesen werden durch integriertes bah.libxml - INI files können mit ressource.get("Kategorie.Schluessel") oder ressource.get("Schluessel"), ressource.save... - MaxGui mit GadgetHandler um Fenster zu erstellen - handle(x,y) für Bilder und Animationen sind keine statischen werte sondern Terme die aktuell mit Holzchopfs Math/Calc Mod berechnet werden. Ich denke ich muss dies aber noch auf bah.muParser umbauen. Aktuelle Module die verwendet werden: - bah.libxml - bah.muparser - zeke.luajit2 - holzchopf.calc Hier einmal Vielen Dank an Holzchopfs Modul ![]() Was ist noch geplant? - Unterstützung für Logic GUI Professional https://www.blitzforum.de/showcase/311/ - Ausarbeitung der Ressourcentypen - Ausarbeitung der lua-Schnittstelle Soviel erstmal dazu, ich zeige nachher noch mehr aber dieser Text hat mich erstmal lang genug von der Arbeit abgehalten ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group