After building the following with help of previous post to the forum regarding dispatching events and delegating functions. I am stuck with the following problem.
I have 3 files.
main.fla
import classes.LevelObj;
var newLevel:LevelObj = new LevelObj();
var levelListener:Object = new Object();
levelListener.onLoaded = function(oEvent:Object) {
trace("Level success="+oEvent.success);
}
newLevel.addEventListener("onLoaded", levelListener);
newLevel.loadLevel("leveldata.xml");
LevelObj.as
// -------------------------------------------------------------------
// DEFAULT IMPORT:
// -------------------------------------------------------------------
import mx.utils.Delegate;
import mx.events.EventDispatcher;
// -------------------------------------------------------------------
import classes.GBXML;
class classes.LevelObj {
public var mapArray:Array;
private var testVar:String;
//for dispatch
function dispatchEvent() {};
function addEventListener() {};
function removeEventListener() {};
function LevelObj() {
EventDispatcher.initialize(this);
testVar = " bla ";
}
public function loadLevel(xmlSrcPath:String) {
trace("Loading Level:"+xmlSrcPath);
var XObj:GBXML = new GBXML();
var myListener:Object = new Object();
myListener.onLoaded = function(oEvent:Object):Void {
trace("LevelObj.XObj > "+oEvent.success);
if (oEvent.success) {
trace("LevelObj loaded file");
//THIS IS WHERE I WANT TO CALL THE OTHER FUNCTION IN THIS(LevelObj) CLASS
//when succes, convert XML to multi dim array
xmlToArray(XObj);
} else {
trace("LevelObj FAILED LOADING XML");
mapArray = [];
// set up the event object:
var eventObj:Object={target:this,type:"onLoaded"}
eventObj.success = false;
this.dispatchEvent(eventObj);
}
}
XObj.addEventListener("onLoaded",myListener);
XObj.loadFile(xmlSrcPath);
}
private function xmlToArray(GBXMLObj:GBXML) {
trace("xmlToArray");
var levelNode:XMLNode = GBXMLObj.getNode("level");
trace(levelNode.childNodes.length);
mapArray = ["this should be filled with new level array data"];
}
}
and GXML.as
// -------------------------------------------------------------------
// DEFAULT IMPORT:
// -------------------------------------------------------------------
import mx.utils.Delegate;
import mx.events.EventDispatcher;
class classes.GBXML {
//declare private properties:
private var _xml:XML;
private var senderObj:LoadVars;
private var loaderID:Number;
private var startLoadingTimer:Number;
public var loadState:String;
//for dispatch
function dispatchEvent() {};
function addEventListener() {};
function removeEventListener() {};
//
//constructor
function GBXML() {
EventDispatcher.initialize(this);
trace("new GBXML");
_xml = new XML();
_xml.ignoreWhite = true;
loadState = "empty";
_xml.onLoad = Delegate.create(this, onLoadEvent);
}
private function onLoadEvent(success:Boolean):Void {
if (success) {
//loaded, so kill interval
trace("GBXML loaded file");
loadState = "finished";
//terminate any running intervals
clearInterval(loaderID);
// set up the event object:
var eventObj:Object={target:this,type:"onLoaded"}
eventObj.success = true;
this.dispatchEvent(eventObj);
} else {
trace("XML failed to load.");
loadState = "error";
clearInterval(loaderID);
// set up the event object:
var eventObj:Object={target:this,type:"onLoaded"}
eventObj.success = false;
// dispatch the event
this.dispatchEvent(eventObj);
}
}
//LOAD THE XML FILE
public function loadFile(fileURL:String):Void {
trace("loadFile");
loadState = "loading";
//terminate any running intervals
clearInterval(loaderID);
var currentDate:Date = new Date();
startLoadingTimer = currentDate.getTime();
senderObj = new LoadVars();
senderObj.sendAndLoad(fileURL, _xml);
this.loaderID = setInterval(this, "loadingFeedback", 100, _xml);
}
//the progress monitor called by setInterval
private function loadingFeedback(xmlObj:XML):Void {
var amtLoaded:Number = xmlObj.getBytesLoaded();
if (amtLoaded <= 4) {
var currentDate:Date = new Date();
if ((startLoadingTimer+5000)>currentDate.getTime()){
trace("Requesting Data...");
} else {
trace("Request timed out");
loadState = "error";
//terminate any running intervals
clearInterval(loaderID);
}
} else {
trace("Loaded: " + Math.floor(amtLoaded / 1024) + " kilobytes");
}
}
}
Now this runs great but in the loadLevel function of LevelObj.as, when I receive the event from the GBXML class that it has finished loading I want to call another function within the same class (LevelObj) to continue with further processing the XML data.
What I make of it, is that I am still within the scope of the myListener object. Should I use a Delegate function here to get to the function within the LevelObj scope?
And how about properties from the LevelObj scope? When doing a simple trace of some testVar I get undefined. Logical ofcourse because it is not within the same scope. But I am stuck here.
This is the part that should contain the call to the function…
myListener.onLoaded = function(oEvent:Object):Void {
trace("LevelObj.XObj > "+oEvent.success);
if (oEvent.success) {
trace(testVar);
//CALL FUNCTION HERE IN SCOPE OF LevelObj
} else {
Any help is appreciated.