Skalierung eines swf in Air

BIAsTeR

Mitglied
Moin,

ich habe ein Flash-Projekt (Flash 8), welches externe Daten läd und verarbeitet (skaliert).
Wenn ich das ganze mit nem Flashplayer starte ist alles wunderbar.

Integrier ich aber diese SWF-Datei in ein Airprojekt (ich brauch die Dateizugrifffunktion von Adobe Air) wird zwar wunderbar die SWF-Datei geladen und alle Daten sind verfügbar, aber die Daten werden nicht skaliert.
Konkret geht es darum, das in Flash eine Karte mit 2600x2816 Pixeln auf Bildschirmgröße skaliert wird, während in Air nur die linke obere Ecke (halt 0,0) von der Karte zu sehen ist.

Der Code in der Air-Datei sieht so aus:
Code:
//importieren der JPGEncoderklasse
import com.adobe.images.JPGEncoder;

//importieren der nötigen Adobe AIR Pakete
import flash.filesystem.File;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;


//Zählervariable wird initialisiert
var count:int = 0;

//Listener für den Savebutton ruft die Funktion save auf
btn_export.addEventListener(MouseEvent.CLICK, save);
function save(e:MouseEvent) : void{

	//legt die Qualität der Bilder fest
	var myJpgEncoder = new JPGEncoder(100);

	//neues Objekt mit den Abmaßen der späteren Bilder
	var bmd:BitmapData = new BitmapData(1024,768);
	//zeichnen des Objektes (hier root, also die komplette Bühne)
	bmd.draw(root);
	//enkodieren des Bildobjektes
	var ba = myJpgEncoder.encode(bmd);

	//Erstellen einer Datei auf dem Desktop im Ordner Export, Dateien werden durchnummeriert
	var file:File = File.desktopDirectory.resolvePath("Export/pic" + count++ +".jpg");
	
	//Ordner wird erstellt
	var dir:File = File.desktopDirectory.resolvePath("Export/");
	//Falls Ordner noch nicht existiert wird er erstellt
	if(!dir.exists){
		dir.createDirectory();
	}

	//neues Streamingobjekt wird erstellt
	var fileStream:FileStream = new FileStream();
	//Stream wird geöffnet im Schreibmodus
	fileStream.open(file, FileMode.WRITE);
	//Daten werden geschrieben
	fileStream.writeBytes(ba);
	//Stream wird geschlossen
	fileStream.close();
}

//Adresse des zu ladenden Flashfilms wird festgelegt
var request:URLRequest = new URLRequest("./Kartenfilm.swf");
//neues Ladeobjekt wird erstellt
var loader:Loader = new Loader();
//Flashfilm wird geladen
loader.load(request);


//Objekt wird hinzugefügt
addChild(loader);
//wechseln der Ebenen, damit der Button zum speichern über dem geladenen Flashfilm liegt
swapChildren(loader,btn_export);

Kann es sein, dass es Probleme gibt, weil die SWF-Datei in Flash 8 und Air neuer ist?

Ben
 
Skalieren funktioniert insofern, dass ich mit "LocalConnection" arbeite und somit auf die Funktionen des geladenen SWF zugreifen kann.
In Air sieht der Code so aus:
Code:
               //localconnection wird erstellt
		var AVM_lc:LocalConnection = new LocalConnection();
               //die localconnection sendet das ziel und die auszuführende funktion
                AVM_lc.send("AVM2toAVM1", "saveautoplay");
		// loader wird erstellt
		var loader:Loader = new Loader();
		//Adresse des zu ladenden Flashfilms wird festgelegt
		loader.load(new URLRequest("externe_swf_mit_flash8_erstellt.swf"));
		addChild(loader);

Damit ich dann die Funktionen aus dem importierten swf bekomme brauch ich auch Code in der swf-Datei:
Code:
		// localconnection wird erstellt
		var AVM_lc:LocalConnection = new LocalConnection();

		// spielt automatisch die zeitschritte ab
		AVM_lc.saveautoplay = function(){
    				saveautoplay();
				legendeeinblenden();
		}
		//skaliert mc_bilder nachträglich in air
		AVM_lc.skalieren = function(){	
			_root.mc_bilder._xscale = 29;
			_root.mc_bilder._yscale = 29;
			_root.mc_bilder._x = 120;
			_root.mc_bilder._y = 0;
		}

		// wartet auf verbindung von "AVM2toAVM1"
		AVM_lc.connect("AVM2toAVM1");

Das funktioniert also soweit.

Nun habe ich aber auch noch dynamische Buttons die auf die Fläche um den jeweiligen Button skalieren wenn ich drauf drücke. Im original SWF geht das ohne Probleme. In Air natürlich nicht. Beim Zoomen verwende ich unter anderem "this._x". Diese Definition kann aber leider nicht mit Air umgesetzt werden. Der Code in AS2 sieht so aus:
Code:
this.onEnterFrame = function(){
	for(i=0;i<XMLsublocation_name.length;i++){	
	       this.mc_bilder.mc_hintergrundkarte.mc_layer_sublocations["btn_sl_"+XMLsublocation_name[i]].onPress = function(){		
		        subloczoom = true;
                        //skalieren des MovieClips
			_root.mc_bilder._xscale = 500;
			_root.mc_bilder._yscale = 500;
				
			_root.mc_bilder._x = Stage.width/2-this._x*6;
			_root.mc_bilder._y = Stage.height/2-this._y*6;

                       //Panel zum bewegen im gezoomten Modus
			_root.mc_zoom_move._visible = true;
		}
	}
}
Wenn ich das this._x bzw. _y mit entsprechender absoluter Definition ersetze, nimmt Flash immer den gleichen Wert. Ich vermute vom letzten Button. Daher zoomt der immer auf die gleiche Stelle.
Ich bekomme aber auch innerhalb der onPress Funktion nicht den jeweiligen "i-Wert", so dass ich zum Beispiel x und y vorher in einem Array speichern und so darauf zugreifen könnte.
Hat wer von euch ne Idee, wie ich das umgehen kann?

Ben
 
Auch das Problem ist gelöst...

Hab über den Namen des jeweiligen Buttons auf ein Array mit x und y Wert zugreifen können. Damit kann ich nun auch entpsrechend an mein Ziel zoomen.

Ben
 
Zurück