Loading Files at Runtime
Monkey Forums/Monkey Programming/Loading Files at Runtime
| ||
Is there a way to load files during run-time? I just want to have the ability to do so when designing levels/UI so I can see the changes without having to recompile. |
| ||
Take a look at DataBuffer.Load. Depending on the target, you can also use FileStream. The APIs section of the docs is a pretty good quick reference for finding 'how do I?' stuff like this. |
| ||
I was playing with this but couldn't seem to get it to load properly. Does it only accept .bin files? Here's what I was doing:// I'm passing "monkey://data/chunkDB.xml" as the path parameter. Method New (path:String) Super.New() _instances = New StringMap<Graphic>() Local e:XMLError = New XMLError() #if CONFIG="debug" Local stream:DataStream = New DataStream(DataBuffer.Load(path)) // null error here Print("LEN: " + stream.Length) Print("DATA: " + stream.ReadString(stream.Length)) '_xmlData = ParseXML(_dataBuffer.Load(0), e) #else _xmlData = ParseXML(LoadString(path), e) #end If (e.error) Error(e.ToString()) End As I commented in the code, I'm getting a crash because of a null error. |
| ||
What target are you using? This works here on glfw/html5:Import brl.datastream Function Main() Local stream:=New DataStream( DataBuffer.Load( "monkey://data/test.xml" ) ) Print stream.ReadByte() End Strictly speaking, binary files should have a .bin or .dat extension (or you can use #DATA_FILES+="*.blah"), but since .xml is also a text file type, the file should be recognized anyway. |
| ||
I'm using Flash - I see on the docs that availability for both DataStream and DataBuffer are "All" so I assume it should work for Flash also? |
| ||
Have you tried my code above? It works here with flash, so I can only assume there's something else wrong with your code. It'd help if you could post a runnable sample. |
| ||
Whoops - operator error. I was changing the wrong path var, heh. Thanks mate! |
| ||
Hrm while it is running now, I can't seem to get it to reload the new XML file after I've made changes. The class I have this in is huge and contains a lot of irrelevant code, which is why I didn't post it before. But here's what I'm doing now:Method Added:Void () Super.Added() Local e:XMLError = New XMLError() #if CONFIG="debug" Local stream:DataStream = New DataStream(DataBuffer.Load("monkey://data/" + _path)) Local raw:String = stream.ReadString(stream.Length) _xmlData = ParseXML(raw, e) Print(raw) #else '_xmlData = ParseXML(LoadString(_path), e) #end If (e.error) Error(e.ToString()) ' SNIP load stuff with xml ... I've simply setup a hotkey to re-add my UI object, which calls the "Added()" function above. After I've made some changes to the XML and reloaded, I can see that the result of Print(raw) does not reflect the changes I made. |
| ||
Oops, should have mentioned - stuff in data/ is 'baked into' the app. With Flash, you don't have as many options as other targets - have you tried HttpRequest? Or perhaps you could develop on glfw target, which gives you full filesystem access etc. |
| ||
Ah, that would make sense. I haven't tried HttpRequest yet as the docs say its not supported on Flash. |
| ||
LoadString() works on all targets. |