Using brl.json to parse Texture Packer json files
Monkey Forums/Monkey Programming/Using brl.json to parse Texture Packer json files
| ||
Texture Packer outputs the following json:{"frames": { "frame-abc.png": { "frame": {"x":41,"y":2,"w":256,"h":256}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":256,"h":256}, "sourceSize": {"w":256,"h":256} }, "someframe": { "frame": {"x":2,"y":2,"w":37,"h":382}, "rotated": false, "trimmed": false, "spriteSourceSize": {"x":0,"y":0,"w":37,"h":382}, "sourceSize": {"w":37,"h":382} } } } Yet I am having a hard time parsing it using brl.json... in fact I don't know where to start!! :( This is what I've got so far and its not much: Local str:String = LoadString("sprites.json") Local jso:JsonObject = New JsonObject(str) Local sprites:JsonValue = jso.Get("frames") Print sprites.ToJson() This outputs all the frames to the console, but how do I parse those objects to create "sprites"? |
| ||
Must have been tired last night: Still not happy about changing the "objects" to json all the time... and its fugly... but it works... |
| ||
You could use GetData() to retrieve the underlying StringMap<JsonValue>, then iterate through the map, eg:Local str:=LoadString("sprites.json") Local jso:=New JsonObject(str) Local sprs:=JsonObject( jso.Get("frames") ) For Local it:=EachIn sprs.GetData() Local key:=it.Key 'eg: frame-abc.png Local spr:=JsonObject( it.Value ) Local frame:=JsonObject( spr.Get( "frame" ) ) Print "x,y,w,h="+frame.GetInt( "x" )...etc... Next (IMO, frames should really be an array...) There's an issue if the order of the frames is important, in which case brl.json would need to be modified, eg: a GetOrderedKeys:String[]() method could be added to JsonObject... |
| ||
Ah thats a lot nicer! Thanks Mark! And I do agree that Frames should be an array, but its not my format ;) Oh, just found out the TexturePacker can output two types of JSON, one in Hash format (above) and Array based (below): {"frames": [ { "filename": "axe.png", "frame": {"x":2,"y":364,"w":128,"h":126}, "rotated": true, "trimmed": true, "spriteSourceSize": {"x":0,"y":1,"w":128,"h":126}, "sourceSize": {"w":128,"h":128} }, { "filename": "sword.png", "frame": {"x":117,"y":199,"w":126,"h":126}, "rotated": false, "trimmed": true, "spriteSourceSize": {"x":1,"y":0,"w":126,"h":126}, "sourceSize": {"w":128,"h":128} }], "meta": { "app": "http://www.codeandweb.com/texturepacker ", "version": "1.0", "image": "array.png", "format": "RGBA8888", "size": {"w":256,"h":542}, "scale": "1", "smartupdate": "$TexturePacker:SmartUpdate:<SNIP>" } } |
| ||
You don't have to use JSON as an exporter from texturepacker, I prefer simple textfiles. Put the following in a textfile and save under TexturePacker\bin\exporters\[yourname] to get a simple one line per image file. {% for sprite in allSprites %}{{sprite.trimmedName}} {{sprite.frameRect.x}} {{sprite.frameRect.y}} {{sprite.frameRect.width}} {{sprite.frameRect.height}} {{sprite.cornerOffset.x}} {{sprite.cornerOffset.y}} {{sprite.untrimmedSize.width}} {{sprite.untrimmedSize.height}} {% if sprite.rotated %}1{% else %}0{% endif %}{% if not forloop.last %} {% endif %}{% endfor %} Then copy exporter.xml from another exporter in \exporters\ to your dir and change the name etc in the xml file. It should have the following values: <fileExtension>txt</fileExtension> <supportsTrimming>yes</supportsTrimming> <supportsRotation>yes</supportsRotation> <rotationDirection>cw</rotationDirection> <supportsNPOT>no</supportsNPOT> <supportsTrimSpriteNames>yes</supportsTrimSpriteNames> <supportsTextureSubPath>yes</supportsTextureSubPath> Here's an image class that can load from the above exporter: Class bbImage Field Name:String Field Width Field Height Field OffX Field OffY Field Rotated? 'If rotated in textureatlas to save space Field Img:Image Method Draw(atx#,aty#) If Rotated Then DrawImage(Img, atx+OffX, aty + OffY + Width, 90,1,1) Else DrawImage(Img, atx+OffX, aty+OffY) End End Function LoadFromTexturePacker:bbImage[](filename:String) Local Atlas := LoadImage(filename+".png") If Atlas = Null Then Error "Can't find ~q"+filename+"~q" Return End Local lines := app.LoadString(filename+".txt").Split("~n")[1..] Local result := New List<bbImage>() For Local i := Eachin lines Local c := i.Split(" ") Local bb := New bbImage() bb.Name = c[0] Local x := Int(c[1]) Local y := Int(c[2]) Local w := Int(c[3]) Local h := Int(c[4]) bb.Img = Atlas.GrabImage(x,y,w,h) bb.OffX = Int(c[5]) bb.OffY = Int(c[6]) bb.Width = Int(c[7]) bb.Height = Int(c[8]) bb.Rotated = Int(c[9]) = 1 result.AddLast(bb) End Return result.ToArray() End End |
| ||
Thanks Erik, I was also using it to learn how to use the brl.json module :) One thing with the JSON output from TexturePacker is that it doesn't tell you what rotation to do if the image has been rotated, which is weird... |