tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
2
ZUGRIFFE
1504
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    BIAsTeR BIAsTeR ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Beiträge
    79
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    //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
     

  2. #2
    BIAsTeR BIAsTeR ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Beiträge
    79
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
                   //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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
            // 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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    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
     

  3. #3
    BIAsTeR BIAsTeR ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Beiträge
    79
    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
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 15.10.10, 15:43
  2. Skalierung eines MovieClips
    Von msw im Forum Flash Plattform
    Antworten: 5
    Letzter Beitrag: 29.10.07, 11:07
  3. Skalierung
    Von chickenwings im Forum CSS
    Antworten: 1
    Letzter Beitrag: 29.08.06, 17:07
  4. Umgebung verschiebt sich bei Skalierung eines Objektes
    Von NoGFX im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 06.06.06, 23:13
  5. Skalierung
    Von devStorm im Forum Photoshop
    Antworten: 13
    Letzter Beitrag: 17.06.04, 19:38