externe Funktionen laden

Liutasil

Grünschnabel
Hallo!

Ich hab hier ein kleines Problem, an dem ich beinahe verzweifle:

es liegen wichtige Funktionen in einer externen .swf, die ich in die haupt .swf einladen möchte
das habe ich so versucht:
Code:
var configMC:MovieClip = createEmptyMovieClip("configMC", getNextHighestDepth());
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(this);
mcLoader.loadClip("config.swf", configMC);
var Angriffstaerke:Function;
Code:
function onLoadInit(mc:MovieClip) {

   _root.Angriffstaerke = Function(mc.Angriffstaerke);

}

das schein auch so weit zu klappen, mit der einzigen Einschränkung, dass alle _root Verweise in der geladenen Funktion nicht mehr funktionieren.
Die Einschränkung tritt aber nur nach der Veröffentlichung auf.
Teste ich den Film in Flash, wird die Funktion perfekt geladen und funktioniert so wie sie soll.

soll heißen:
Code:
function Angriffstaerke() { return 500; }
funktioniert
Code:
function Angriffstaerke() { return _root.var; }
funktioniert nicht

achja: es liegt kein _lockroot problem vor. Ich möchte mit _root in der externen Funktion die _root Ebene der haupt .swf ansprechen
 
Hallo.
Bitte achte stets auf die Nettiquette, vor allem auf die richtige Formatierung deiner Beiträge. Groß-/Kleinschreibung!

Eigentlich sollte das so funktionieren. Hast du das Ganze schonmal mit loadMovie() versucht? Ich habe nichts explizites dazu gefunden aber es scheint mir als würde diese ganze _root-Funktionalität nur mit loadMovie() gehen und als würde loadClip() automatisch den lockroot setzen. Ist aber eher eine Vermutung. Probier's mal aus :)

Gruß
.
 
Ich habe nichts explizites dazu gefunden aber es scheint mir als würde diese ganze _root-Funktionalität nur mit loadMovie() gehen und als würde loadClip() automatisch den lockroot setzen.

Hallo,

nein, der MovieClipLoader setzt kein _lockroot. Zwei Dinge sind mir aufgefallen:
1. Der Name der Variable "var" ist ein wenig unglücklich gewählt, zumal var eines der essentiellsten Schlüsselwörter in AS ist.

2. Mir leuchtet nicht ganz ein, warum du den Ausdruck "mc.Angriffstaerke" mit einem Function() einklammerst. Function () funktioniert nicht wie Number() oder Boolean(), die eine Typendefinition eines Variablenwerts erzwingen. Probier stattdessen einfach mal:
Code:
function onLoadInit(mc:MovieClip) {

   _root.Angriffstaerke = mc.Angriffstaerke;
	
  
}

gruss
 
Vielen Dank für eure Antworten!

Ich habe mal beides ausprobiert:
function onLoadInit(mc:MovieClip) {

mc._lockroot = false;

_root.Angriffstaerke = mc.Angriffstaerke;
}

Den Namen "var" habe ich hier nur benutzt, um zu verdeutlichen, dass es sich um irgendeine beliebige Variable handelt.
Ich habe mich mal weiter auf Fehlersuche begeben, und mir dafür mal _root von der Funktion zurückgeben lassen:
Code:
return _root;
Als Rückgabewert erhalte ich "_level0", beim testen in der Flash IDE und auch nach der Veröffentlichung, daraus schließe ich, dass der _root-Verweis wohl richtig ist, und es wohl kaum doch irgendwie an _lockroot liegen kann.
Sobald ich versuche, auf eine Variable aus der _root-Ebene zuzugreifen, funktioniert es jedoch nur noch in der Flash IDE beim Test und nach dem Exportieren nicht mehr.
Soll heißen:
Code:
return typeof(_root.variab);
Gibt beim internen Test "number", und nach dem Exportieren "undefined" aus.

Kann es also an irgendwelchen Veröffentlichungseinstellungen liegen, durch die Zugriffsprobleme von externen Movieclips auf die _root-Ebene entstehen können?
 
Hallo,

hab dir hier mal meinen Nachbau gepostet. Vielleicht findest du so den Fehler eher. Sicher wichtig ist, dass beide swfs für die gleiche AS-Version geschrieben wurden und ev. macht auch der Player, für den exportiert wurde, einen Unterschied, wobei ich das jetzt nicht getestet habe.

Gruss
 

Anhänge

  • test.zip
    9,6 KB · Aufrufe: 15
Vielen Dank für die Arbeit, die du dir machst!

Ich habe deinen code jetzt mal 1:1 in meine .fla eingesetzt und habe das gleiche Problem wie vorher auch.
Das sagt mir immerhin, dass mein Code scheinbar richtig ist.
Es muss also ein dümmerer (= schwerer zu findender) Fehler sein, der bewirkt, dass es bei mir nicht funktioniert.

Bevor ich mich jetzt weiter auf die lange und vermutlich erfolglose Fehlersuche mache:
Gibt es vielleicht eine andere Möglichkeit, mein Ziel zu erreichen, also externe Funktionen während der Laufzeit zu laden?
Ein Möglichkeit ohne eine externe .swf laden zu müssen?
 
:)
Das wollte ich ja gerade vermeiden.
Die Funktionen sind Teil eines recht großen Kampfscripts für ein Browsergame.
Darin enthalten sind alle wichtigen Einstellungen fürs Balancing.
Durch die Auslagerung wollte ich zum Einen erreichen, dass ich die selben Balancing-Einstellungen für verscheidene .swfs benutzen kann, und bei Änderungen nicht zig Funktionen anpassen muss. Zum Anderen wollte ich vermeiden, dass bei Balancing-Änderungen noch ein paar User mit der alten Version unterwegs sind wegen dem Browser-Cache.

Lassen sich Funktionen vielleicht aus einer .txt Datei laden, oder aus einem php-Script übernehmen?
 
Hallo,

nein, man kann Textdateien also Strings nur sehr beschränkt als ActionScript parsen. Generell ist dein Ansatz kein schlechter, mir leuchtet auch nicht ganz ein, was genau daran nicht klappt. Ein anderer wäre, dass du z.B. eine Klasse schreibst, die die ganze Kampffunktionalität abdeckt und die du dann universell einsetzen kannst, aber alle effektiven Werte (Balancing) in eine XML-Datei auslagerst. Die Klasse müsstest du dann halt immer noch kompilieren. Das Caching kannst du übrigens auch anders umgehen. Durchsuch das Forum mal nach dem Stichwort "timestamp".

Gruss
 
Hi,

mir leuchtet genauso wenig ein, warum es nicht funktioniert.
Ich teste den Film in Flash und alles klappt. Kaum ist er exportiert ist kein Zugriff auf die _root Ebene mehr möglich.
Teste ich exakt den selben Code außerhalb meines Scriptes in einer neuen Datei funktioniert wieder alles bestens.
Meine Veröffentlichungseinstellungen sind die selben und ich kann mir auch nicht vorstellen, was dieses Problem sonst verursachen könnte.
Das einzige was ich mir vorsellen könnte, ist, dass meine Socket-Verbindung irgendwie Probleme macht aber ansonsten habe ich nichts in meinem Code, das so ein komisches Problem verursachen könnte.
Daduch, dass das Problem erst nach dem Exportieren und nicht in der Flash IDE auftritt, ist eine Fehlersuche auch extrem schwierig, da kein Debugging.
 
Zurück