Ressource Modul Projekt

Übersicht Sonstiges Projekte

Neue Antwort erstellen

Hummelpups

Betreff: Ressource Modul Projekt

BeitragFr, Jan 07, 2011 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile Grundsätzlich
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:
user posted image


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 Smile

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 Smile

Neue Antwort erstellen


Übersicht Sonstiges Projekte

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group