Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 17-06-2010, 08:57   #1 (permalink)
Alter User
 
Registriert seit: Apr 2010
Ort: Deutschland
Beiträge: 128
Question Denkfehler in Klasse zur Maskenerstellung

Hiho!

in einem anderen Thread bin ich durch tatkräftige Hilfe von Forenmitgliedern von funktionalem Spaghetti-Code zur Erstellung einer Klasse zur Maskenanwendung geführt worden.

Das ist dabei herausgekommen:

PHP-Code:
// 
// call: 
// meinMaskiertesBild = new DynamicMaskedImage("imagePath", "maskPath", targetMC); 
// 
class DynamicMaskedImage 
    var 
i:Number 0;
    var 
imgMC:MovieClip
    var 
maskMC:MovieClip
    var 
target:MovieClip
    var 
imgLdr:MovieClipLoader
    var 
imgLdrLst:Object
    var 
maskLdr:MovieClipLoader
    var 
maskLdrLst:Object
    var 
imgPath:String
    var 
maskPath:String
    
// 
    // constructor 
    // 
    
function DynamicMaskedImage(iP:StringmP:Stringt:MovieClip) { 
        
imgPath    iP
        
maskPath   mP
        
target     t;
        
imgMC      target.createEmptyMovieClip("image_" itarget.getNextHighestDepth()); 
        
maskMC     target.createEmptyMovieClip("mask_" i++, target.getNextHighestDepth()); 
        
imgLdr     = new MovieClipLoader(); 
        
maskLdr    = new MovieClipLoader(); 
        
imgLdrLst  = new Object(); 
        
maskLdrLst = new Object(); 
        
imgLdrLst.onLoadInit onImageDone(this); 
        
imgLdr.addListener(imgLdrLst); 
        
maskLdr.addListener(maskLdrLst); 
        
imgLdr.loadClip(imgPathimgMC); 
        
maskLdr.loadClip(maskPathmaskMC); 
    } 
    
// 
    // loads mask once img load is done 
    // 
    
function onImageDone() { 
        
trace("image completely loaded"); 
        
maskLdrLst.onLoadInit finish(this); 
    } 
    
// 
    // applies image "processing" 
    // 
    
function finish() { 
        
trace("mask completely loaded"); 
        
trace("imgMC._name: " imgMC._name);    // "imgMC._name: image_0"
        
trace("maskMC._name: " maskMC._name);  // "maskMC._name: mask_0"
        
imgMC.setMask(maskMC); 
        
maskMC.blendMode 3
    } 

Ich glaube, da ist immer noch ein Denkfehler drin, da
- die Maske nicht angewendet wird (offensichtlich)
- mgMC.setMask(maskMC) aufgerufen wird, bevor die Bilder "gezeichnet" werden (sehe ich im Debugger), das ist in meinen simpel-Tests, die funktionieren, nicht so...

Ich habe schon versucht, mgMC.setMask(maskMC) am Schluss vom Konstruktor aufzurufen, das hat aber auch nichts gebracht.

Für Anregungen oder Denkanstösse wäre ich sehr dankbar!

Gruss,
T
twietee ist offline   Mit Zitat antworten
Alt 17-06-2010, 09:33   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Wenn Du Funktionen übergibst darfst Du sie nicht ausführen. Also:
PHP-Code:
var test;
var 
testFunc = function(){
   return 
"testReturn";
}

// nicht
test testFunc();
trace(test); // enthält jetzt den String "testReturn"

// sondern
test testFunc;
trace(test); // enthält jetzt die Function 
Außerdem solltest Du den Masken-Listener nicht erst hinzufügen, wenn das Bild schon geladen wurde. Denn dann ist die Maske warscheinlich auch schon geladen und der Listener wird nie ausgeführt. Ich hab die Klasse mal etwas umstrukturiert:
PHP-Code:
// 
// call: 
// meinMaskiertesBild = new DynamicMaskedImage("imagePath", "maskPath", targetMC); 
// 
class DynamicMaskedImage 
    
    public static var 
imageCount:Number 0;
    
    public var 
imgMC:MovieClip
    public var 
maskMC:MovieClip;
    public var 
imgLdr:MovieClipLoader
    public var 
maskLdr:MovieClipLoader;
    
// 
    // constructor 
    //
    
public function DynamicMaskedImage(imgPath:StringmaskPath:Stringtarget:MovieClip) {
        
        
imgMC      target.createEmptyMovieClip("image_" imageCounttarget.getNextHighestDepth());         
        
imgLdr     = new MovieClipLoader();
        
imgLdr.addListener( {
            
onLoadCompleteonImageDone
        
} );
        
imgLdr.loadClip(imgPathimgMC);
        
        
maskMC     target.createEmptyMovieClip("mask_" imageCounttarget.getNextHighestDepth()); 
        
maskLdr    = new MovieClipLoader();        
        
maskLdr.addListener( {
            
onLoadCompletefinish
        
} );    
        
maskLdr.loadClip(maskPathmaskMC); 
        
        
imageCount++;
    }
    
//
    //
    
public function onImageDone() { 
        
trace("image completely loaded");
    }     
    
// 
    // applies image "processing" 
    // 
    
public function finish() { 
        
trace("mask completely loaded"); 
        
trace("imgMC._name: " imgMC._name);    // "imgMC._name: image_0"
        
trace("maskMC._name: " maskMC._name);  // "maskMC._name: mask_0"
        
imgMC.setMask(maskMC);
        
maskMC.blendMode 3
    } 

Ob letztlich das hier etwas bringt, wage ich zu bezweifeln:
PHP-Code:
imgMC.setMask(maskMC);
maskMC.blendMode 3
Wenn Du etwas zu einer Maske machst wird es unsichtbar, weshalb es keinerlei Auswirkungen haben dürfte, wenn Du dann einen Blendmode zuweist.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (17-06-2010 um 15:17 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 17-06-2010, 11:22   #3 (permalink)
Alter User
 
Registriert seit: Apr 2010
Ort: Deutschland
Beiträge: 128
Arrow

Hallo Martin!

...und vielen Dank für deine Antwort!

Leider funktioniert das Snippet so nicht... Mal ein paar Fragen/Kommentare:

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Wenn Du Funktionen übergibst darfst Du sie nicht ausführen. Also:
PHP-Code:
var test;
var 
testFunc = function(){
   return 
"testReturn";
}

// nicht
test testFunc;
trace(test); // enthält jetzt den String "testReturn"

// sondern
test testFunc;
trace(test); // enthält jetzt die Function 
bei //nicht meintest du test = testFunc() richtig? Also mit Klammern funktioniert es nicht?!

Das Problem hier ist, dass ohne ein Übergeben von this die Klasse die "Referenz auf sich selbst" vergisst, also alle initiierten Variablen und Objekte nach dem Laden des ersten Bildes futsch sind...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Außerdem solltest Du den Masken-Listener nicht erst hinzufügen, wenn das Bild schon geladen wurde. Denn dann ist die Maske warscheinlich auch schon geladen und der Listener wird nie ausgeführt.
Die Idee war ja gerade, erst das Bild zu laden, dann die Maske zu laden, und nach Abschluss beider Sachen, die Maske zu setzen, weil eine Maske nicht auf nicht-fertig-geladene Objekte angewendet werden kann... und, soweit ich das verstanden hab, werden die callbacks auf z.B. onLoadInit immer ausgeführt, wenn die Ereignisse eintreten... es sollte also nicht passieren, dass ein Listener nie ausgeführt wird! Oder irre ich mich

Und im Debugger sehe ich, dass -- in der Version von mir -- "alles" ausgeführt und nur die Maske nicht angewendet wird. Meine Vermutung!!! ist, dass die Bilder zu spät gezeichnet werden... ...und das in der Klassenlogik geändert werden muss...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Ich hab die Klasse mal etwas umstrukturiert...
Vielen Dank für die Arbeit, die du dir gemacht hast!
Leider kann mein Compiler nichts mit diesen Statements anfangen:
PHP-Code:
 maskLdr.addListener( {
            
onLoadCompletefinish;
        } ); 
...ist das AS 3.0 Syntax? Ich bin nämlich noch auf AS 2.0 / Flash 8.

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Ob letztlich das hier etwas bringt, wage ich zu bezweifeln:
PHP-Code:
imgMC.setMask(maskMC);
maskMC.blendMode 3
Wenn Du etwas zu einer Maske machst wird es unsichtbar, weshalb es keinerlei Auswirkungen haben dürfte, wenn Du dann einen Blendmode zuweist.
Das ist nur noch ein Überbleibsel von Verzweiflungstests -- du hast aber natürlich vollkommen Recht!

Danke + Gruss,
T
twietee ist offline   Mit Zitat antworten
Alt 17-06-2010, 13:11   #4 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
Zitat:
Zitat von twietee Beitrag anzeigen
Das Problem hier ist, dass ohne ein Übergeben von this die Klasse die "Referenz auf sich selbst" vergisst, also alle initiierten Variablen und Objekte nach dem Laden des ersten Bildes futsch sind...
du könntest auch hundekotze übergeben und es würde genau so laufen problem ist das das event im scope des loaders gefeuert wird, du befindest dich also noch im loader, deshalb kannste auf die klasseneigenschaften nicht mehr zugreifen. wie man das in as2 jetzt richtig löst weiß ich aber auch nicht.

Zitat:
Zitat von twietee Beitrag anzeigen
Und im Debugger sehe ich, dass -- in der Version von mir -- "alles" ausgeführt und nur die Maske nicht angewendet wird. Meine Vermutung!!! ist, dass die Bilder zu spät gezeichnet werden... ...und das in der Klassenlogik geändert werden muss...
nein, das problem ist das das alles sofort ausgeführt wird weil, wie schon3 mal erwähnt, du die funktion mit klammern sofort ausführst ohne zu warten, die reihenfolge stimmt natürlich weil die klassenlogik an sich schon richtig ist.

lass dir mal per trace das callback des loader ausgeben, ich wette es ist undefined. statt den mc referenzen lass dir mal deren größe ausgeben, ist garantiert auch 0
ING ist offline   Mit Zitat antworten
Alt 17-06-2010, 15:13   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von ING Beitrag anzeigen
du könntest auch hundekotze übergeben ...
Einen Versuch wärs Wert

Im Ernst: Ich hatte diese ganze Scope-Kacke in AS2 schon verdrängt.

Habe Deine Klasse mal entsprechend angepasst:
PHP-Code:
// 
// call: 
// meinMaskiertesBild = new DynamicMaskedImage("imagePath", "maskPath", targetMC); 
// 
class DynamicMaskedImage 
    
    public static var 
imageCount:Number 0;
    
    public var 
imgMC:MovieClip
    public var 
maskMC:MovieClip;
    
    public var 
imgLdr:MovieClipLoader
    public var 
maskLdr:MovieClipLoader;
    
    public var 
loadCount:Number 0;
    
    
// 
    // constructor 
    //
    
public function DynamicMaskedImage(imgPath:StringmaskPath:Stringtarget:MovieClip) {
        
        var 
listener:Object = {
            
scopethis,
            
onLoadComplete: function() {
                
this.scope.loadCount++;
                if( 
this.scope.loadCount>=this.scope.showFinished();
            }
        }        
        
        
imgMC      target.createEmptyMovieClip("image_" imageCounttarget.getNextHighestDepth());         
        
imgLdr     = new MovieClipLoader();
        
imgLdr.addListenerlistener );
        
imgLdr.loadClip(imgPathimgMC);
        
        
maskMC     target.createEmptyMovieClip("mask_" imageCounttarget.getNextHighestDepth()); 
        
maskLdr    = new MovieClipLoader();        
        
maskLdr.addListenerlistener );    
        
maskLdr.loadClip(maskPathmaskMC); 
        
        
imageCount++;
    }
    
//
    //
    
public function showFinished():Void {
        
trace("mask completely loaded"); 
        
trace("imgMC._name: " imgMC._name);    // "imgMC._name: image_0"
        
trace("maskMC._name: " maskMC._name);  // "maskMC._name: mask_0"
        
imgMC.setMask(maskMC);
        
maskMC.blendMode 3;    
    }

P.S.: Oben waren ein paar Tippfehler drin - habe sie korrigiert.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (17-06-2010 um 15:18 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 17-06-2010, 15:39   #6 (permalink)
Alter User
 
Registriert seit: Apr 2010
Ort: Deutschland
Beiträge: 128
Thumbs up Und alle so yeaaaahhh! ;)

...uiiiii, unglaublich!

Hatte ja schon fast nicht mehr dran geglaubt, aber ihr seid _großartig_ und ES FUNZT!!!

Da hätte ich auf jeden Fall noch ein paar Wochen dran geknobelt, falls ich überhaupt drauf gekommen wär!

Vielen Dank nochmal!

Gruss,
T
twietee ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
klasse, maske, oop, setmask

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Denkfehler? DasPatte ActionScript 2 1 14-06-2007 17:22
denkfehler? mistermethod ActionScript 1 4 08-08-2006 16:46
denkfehler bei with arena ActionScript 1 6 05-10-2004 12:14
Denkfehler? Mali Flash und Datenbanken 6 17-09-2002 18:18
denkfehler? cedot ActionScript 1 5 06-09-2001 18:18


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:31 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele