Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 22-06-2009, 16:34   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
[AS2] attach/create Funktion mit Eintrag in Array

Hallo Leute,

ich habe mir gerade eine eigene Funktion für die Erstellung von MCs gebaut. Sie unterstützt "createEmptyMovieClip" und "attachMovieClip". Natürlich werdet ihr jetzt sagen: "Wieso brauch ich das? Dafür gibt es doch schon Funktionen." Ja, das ist richtig, aber ich brauchte etwas, das die MCs auch in einen Array einfügt, wenn ich das möchte, damit ich sie nachher ohne großen Aufwand wieder mit einer Schleife von der Bühne schmeißen kann.
Also hier der Code

Die Funktion an sich:
ActionScript:
  1. inhalt = new Array(); //Diese Variable dient dazu die MCs zu sammeln und muss vorhanden sein
  2.  
  3. MovieClip.prototype.newMC = function (methode: String, essential: Boolean, idName: String, neuerName: String, depth, initObject: Array){
  4.    
  5.     if (methode == "attach"){
  6.         trace(methode);
  7.         if (essential != true){
  8.             inhalt.push(this.attachMovie(idName, neuerName, depth, initObject));
  9.             result = inhalt[inhalt.length-1];
  10.         }
  11.         else{
  12.             result = this.attachMovie(idName, neuerName, depth, initObject);
  13.         }
  14.        
  15.         return result;
  16.     }
  17.    
  18.     if (methode == "create"){
  19.         trace(methode);
  20.         depth2 = Number(neuerName);
  21.         if (essential != true){
  22.             inhalt.push(this.createEmptyMovieClip(idName, depth2));
  23.             result = inhalt[inhalt.length-1];
  24.         }
  25.         else{
  26.             result = this.createEmptyMovieClip(idName, depth2);
  27.         }
  28.         for (i in depth){
  29.             result[i] = depth[i];
  30.         }
  31.         return result;
  32.    
  33.     }
  34. }

Ihr seht ja schon, dass sie eigentlich genau so funktioniert, wie die von Flash zu Verfügung gestellten Funktionen.
Der Unterschied liegt einfach daran, dass ihr MCs bestimmen könnt, die bei einem Durchlauf von "inhalt" von der Bühne entfernt sollen. Dazu setzt ihr einfach "essential" auf false. Sollte "essential" auf true gesetzt sein, so wird der MC, der erstellt oder attached wird, nicht in den Array "inhalt" eingefügt. Das heißt aber auch, dass ihr ihn ggf. manuell entfernen müsst oder einen weiteren Array einführt, in dem diese MCs gesammelt werden.
Zudem bietet diese Funktion die Möglichkeit neu erstellten MCs (createEmptyMovieClip) gleich Eigenschaften zuzuweisen, wenn ihr dies für nötig haltet. Hat auch nicht jeder


Der für einen NEU ERSTELLTEN Mc:
ActionScript:
  1. newMC("create", false, "neuer_mc", this.getNextHighestDepth(), { _x: 200, _y: 500});


Der für einen AUS DER BIBLIOTHEK geladenen Mc:
ActionScript:
  1. newMC("attach", false, "libary_link", "neuer_mc", this.getNextHighestDepth(), {_width: 100, _height: 100, _x: 50, _y: 50});


Für Verbesserungsvorschläge und Kritik (ob positiv oder negativ) bin ich immer offen.


Gr33tZ
Rn

Geändert von regsnerven (22-06-2009 um 17:00 Uhr)
regsnerven ist offline   Mit Zitat antworten
Alt 22-06-2009, 16:53   #2 (permalink)
no guts no glory
 
Benutzerbild von readme.txt
 
Registriert seit: May 2004
Ort: Nordhorn
Beiträge: 7.998
Prinzipiell keine schlechte Idee ... aber wär nicht ne Klasse schöner?
__________________
Bitte keine Privaten Nachrichten mit Fragen, dazu ist das Forum selbst da. Danke.

'We live in an amazing, amazing world, and it's wasted on the crappiest generation of spoiled idiots.'
readme.txt ist offline   Mit Zitat antworten
Alt 22-06-2009, 17:01   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Klasse xD mach mal :P

Ne, find ich gut mit der Klasse. Ich hab nur leider keine Ahnung, wie das bei AS mit den Klassen genau funzt.
Kannst da ja gerne ne Klasse draus machen

Ich frage mich nur, ob das für nur eine Funktion so viel Sinn macht. Also meiner Erfahrung nach sind Klassen eigentlich eher so Übersichtlichkeitsding, also man lagert darin alle Funktionen eines "Themas" aus und verliert so nicht die Übersicht in einem 10km-Code. Oder hab ich was übersehen? ^^

Geändert von regsnerven (22-06-2009 um 17:02 Uhr)
regsnerven ist offline   Mit Zitat antworten
Alt 22-06-2009, 18:09   #4 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
Bisschen verwirrend das "depth2"--> "NeuerName" ist
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 26-06-2009, 12:23   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Ja, ging halt nicht anders. Wollte nicht, dass man dann leere Parameter übergeben muss.
Kann man ja noch ändern, also den Namen der Variable xD
regsnerven ist offline   Mit Zitat antworten
Alt 07-08-2009, 13:54   #6 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Kleines Update, da so der Zugriff auf die MCs im Inhalt-Array besser gewährleistet wird.

ActionScript:
  1. MovieClip.prototype.newMC = function (methode: String, essential: Boolean, idName: String, neuerName: String, depth, initObject: Array){
  2.    
  3.     if (methode == "attach"){
  4.         if (essential != true){
  5.             inhalt[neuerName] = this.attachMovie(idName, neuerName, depth, initObject);
  6.             result = inhalt[neuerName];
  7.         }
  8.         else{
  9.             essential_array[neuerName] = this.attachMovie(idName, neuerName, depth, initObject);
  10.             result = essential_array[neuerName];
  11.         }
  12.         return result;
  13.     }
  14.    
  15.     if (methode == "create"){
  16.         depth2 = Number(neuerName);
  17.         if (essential != true){
  18.             inhalt[idName]  = this.createEmptyMovieClip(idName, depth2);
  19.             result = inhalt[idName];
  20.         }
  21.         else{
  22.             essential_array[idName] = this.createEmptyMovieClip(idName, depth2);
  23.             result = essential_array[idName];
  24.         }
  25.        
  26.         for (i in depth){
  27.             result[i] = depth[i];
  28.         }
  29.         return result;
  30.    
  31.     }
  32. }
regsnerven ist offline   Mit Zitat antworten
Alt 07-08-2009, 17:24   #7 (permalink)
hilft gerne...
 
Registriert seit: Feb 2007
Ort: Carlsberg
Beiträge: 416
Die Klasse könnte zum Beispiel so aussehen. parentMC ist der MovieClip, in den der neu erstellte MovieClip attached oder created wird...
ActionScript:
  1. class MovieClipContainer {
  2.     private var inhalt:Array;
  3.  
  4.     function MovieClipContainer() {
  5.         inhalt = new Array();
  6.     }
  7.    
  8.     public function attachMC(essential:Boolean, parentMC:MovieClip, idName:String, newName:String, depth:Number, initObject:Object):MovieClip {
  9.         var mc:MovieClip;
  10.         if (essential != true) {
  11.             mc = inhalt[newName] = parentMC.attachMovie(idName, newName, depth, initObject);
  12.         } else {
  13.             mc = parentMC.attachMovie(idName, newName, depth, initObject);
  14.         }
  15.         return mc;
  16.     }
  17.    
  18.     public function createMC(essential:Boolean, parentMC:MovieClip, newName:String, depth:Number):MovieClip {
  19.         var mc:MovieClip;
  20.         if (essential != true) {
  21.             mc = inhalt[newName] = parentMC.createEmptyMovieClip(newName, depth);
  22.         } else {
  23.             mc = parentMC.createEmptyMovieClip(newName,depth);
  24.         }
  25.         return mc;
  26.     }
  27.    
  28.     //Löscht alle MovieClips, die sich im Array befinden
  29.     public function flush():Void {
  30.         for (var i:String in inhalt) {
  31.             removeMovieClip(inhalt[i]);
  32.         }
  33.     }
  34.    
  35.     //Traced die Namen aller MovieClips, die sich im Array befinden
  36.     public function traceList():Void {
  37.         for (var i:String in inhalt) {
  38.             trace(i+": "+inhalt[i]);
  39.         }
  40.     }
  41. }
Angehängte Dateien
Dateityp: rar MovieClipContainer.rar (464 Bytes, 1x aufgerufen)
__________________
MfG Jan

Meine 2 besten Freunde: Flash-Hilfe und die Foren-Suche =)

Geändert von McMannus (07-08-2009 um 17:26 Uhr)
McMannus ist offline   Mit Zitat antworten
Alt 10-08-2009, 09:58   #8 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Ja, dnan habe ich aber wieder 2 Funktionen. Ist nicht unbedingt schlimm, aber nervig ^^

Außerdem habe ich bei deiner Ausführung keine Möglichkeit dem neu ERSTELLTEN MC Eigenschaften zu zu weisen, was bei deiner Ausführung allerdings nen bisschen leichter zu ergänzen wäre - also Umfunktionierung von Variablen.

Gr33tZ
Rn
regsnerven ist offline   Mit Zitat antworten
Alt 10-08-2009, 11:16   #9 (permalink)
hilft gerne...
 
Registriert seit: Feb 2007
Ort: Carlsberg
Beiträge: 416
Du hast bei meiner Version genauso die Möglichkeit, den erstellten oder attachten MovieClips Eigenschaften zuzuweisen bzw. zu ändern, da du ja als Rückgabe in beiden Fällen eine Referenz auf den MovieClip erhältst, d.h. du kannst den Funktionsaufruf mit einer Variable vom Typ MovieClip gleichsetzen und an dieser Variable(=Referenz) Eigenschaften ändern.
__________________
MfG Jan

Meine 2 besten Freunde: Flash-Hilfe und die Foren-Suche =)
McMannus ist offline   Mit Zitat antworten
Alt 10-08-2009, 13:28   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Nein, das meine ich nicht. Schau dir meinen CREATE-Code noch einmal an.
Ich weise schon beim Funktionsaufruf die Eigenschaften zu.
Das habe ich gemeint.
regsnerven ist offline   Mit Zitat antworten
Alt 10-08-2009, 16:31   #11 (permalink)
hilft gerne...
 
Registriert seit: Feb 2007
Ort: Carlsberg
Beiträge: 416
Zitat:
#
if (methode == "create"){
#
depth2 = Number(neuerName);
#
if (essential != true){
#
inhalt[idName] = this.createEmptyMovieClip(idName, depth2);
#
result = inhalt[idName];
#
}
#
else{
#
essential_array[idName] = this.createEmptyMovieClip(idName, depth2);
#
result = essential_array[idName];
#
}
#

#
for (i in depth){
#
result[i] = depth[i];
#
}
#
return result;
#

#
}
Erzähl mir mal, wo du in der Funktion dem Movieclip Eigenschaften zuweist?
__________________
MfG Jan

Meine 2 besten Freunde: Flash-Hilfe und die Foren-Suche =)
McMannus ist offline   Mit Zitat antworten
Alt 11-08-2009, 10:39   #12 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
ActionScript:
  1. for (i in depth){
  2.  
  3. result[i] = depth[i];
  4.  
  5. }

Genau an dieser Stelle Ist ein bisschen verwirrend, weil die Variable "depth" heißt, aber naja.
Deswegen habe ich ja auch die Tiefe, die bei dem "create"-Fall in "neuerName" steht, ganz am Anfang in "depth2" geschrieben.

Gr33tZ
Rn
regsnerven ist offline   Mit Zitat antworten
Alt 14-08-2009, 12:46   #13 (permalink)
hilft gerne...
 
Registriert seit: Feb 2007
Ort: Carlsberg
Beiträge: 416
Okay, ein wenig verwirrend, aber genau das kannst du doch in die Klasse miteinbauen.

ActionScript:
  1. class MovieClipContainer {
  2.     private var inhalt:Array;
  3.  
  4.     function MovieClipContainer() {
  5.         inhalt = new Array();
  6.     }
  7.    
  8.     public function attachMC(essential:Boolean, parentMC:MovieClip, idName:String, newName:String, depth:Number, initObject:Object):MovieClip {
  9.         var mc:MovieClip;
  10.         if (essential != true) {
  11.             mc = inhalt[newName] = parentMC.attachMovie(idName, newName, depth, initObject);
  12.         } else {
  13.             mc = parentMC.attachMovie(idName, newName, depth, initObject);
  14.         }
  15.         return mc;
  16.     }
  17.    
  18.     public function createMC(essential:Boolean, parentMC:MovieClip, newName:String, depth:Number, initObject:Object):MovieClip {
  19.         var mc:MovieClip;
  20.         if (essential != true) {
  21.             mc = inhalt[newName] = parentMC.createEmptyMovieClip(newName, depth);
  22.         } else {
  23.             mc = parentMC.createEmptyMovieClip(newName,depth);
  24.         }
  25.         for (var i:String in initObject) {
  26.             mc[i] = initObject[i];
  27.         }
  28.         return mc;
  29.     }
  30.    
  31.     //Löscht alle MovieClips, die sich im Array befinden
  32.     public function flush():Void {
  33.         for (var i:String in inhalt) {
  34.             removeMovieClip(inhalt[i]);
  35.         }
  36.     }
  37.    
  38.     //Traced die Namen aller MovieClips, die sich im Array befinden
  39.     public function traceList():Void {
  40.         for (var i:String in inhalt) {
  41.             trace(i+": "+inhalt[i]);
  42.         }
  43.     }
  44. }
__________________
MfG Jan

Meine 2 besten Freunde: Flash-Hilfe und die Foren-Suche =)

Geändert von McMannus (14-08-2009 um 12:54 Uhr)
McMannus ist offline   Mit Zitat antworten
Alt 25-08-2009, 15:16   #14 (permalink)
Neuer User
 
Registriert seit: Jan 2009
Beiträge: 133
Ja, ich weiß. Ich sagte ja nur, dass du sie vergessen hattest.
Klasse Klasse, muss ich ja schon sagen ^^

Vllt. bau ich die sogar in mein aktuelles Projekt mit ein.
Allerdings müsste ich dann mein Skript wieder komplett umschreiben, weil ich ja mit meiner Funktion newMC "attachMovie" und "createEmptyMovieClip" in einer Funktion vereine.

Egal. ^^

Ich hab noch 2 neue Funktionen für die Klasse..muss nur mal gerade die Zeilenangaben löschen....
ActionScript:
  1. Array.prototype.in_array = function(searchFor) {
  2.    // andr3a [ 25 / 03 / 2004 ]
  3.    // check if a value is inside an array
  4.    for( var a = 0; a < this.length; a++ ) {
  5.       if( this[a] == searchFor ) {
  6.          return true;
  7.       }
  8.       else if( this[a] instanceof Array ) {
  9.          return this[a].in_array(searchFor);
  10.       }
  11.    }
  12.    return false;
  13. }
  14.  
  15. //Prototypes nicht als Eigenschaften der Arrays anzeigen
  16. ASSetPropFlags(Array.prototype,['in_array'],1,1);
  17.  
  18. class MovieClipContainer {
  19.     private var inhalt:Array;
  20.    
  21.     function MovieClipContainer() {
  22.       inhalt = new Array();
  23.     }
  24.    
  25.    
  26.     public function attachMC(essential:Boolean, parentMC:MovieClip, idName:String, newName:String, depth:Number, initObject:Object):MovieClip {
  27.         var mc:MovieClip;
  28.        
  29.         if (essential != true) {       
  30.             mc = inhalt[newName] = parentMC.attachMovie(idName, newName, depth, initObject);
  31.         } else {
  32.         mc = parentMC.attachMovie(idName, newName, depth, initObject);
  33.         }
  34.         return mc; 
  35.     }
  36.    
  37.    
  38.     public function createMC(essential:Boolean, parentMC:MovieClip, newName:String, depth:Number, initObject:Object):MovieClip {
  39.     var mc:MovieClip;
  40.        
  41.         if (essential != true) {
  42.             mc = inhalt[newName] = parentMC.createEmptyMovieClip(newName, depth);
  43.         } else {
  44.             mc = parentMC.createEmptyMovieClip(newName,depth);
  45.         }
  46.        
  47.         for (var i:String in initObject) {
  48.             mc[i] = initObject[i];
  49.         }
  50.         return mc;   
  51.     }
  52.    
  53.    
  54.    
  55.     //Löscht alle MovieClips, die sich im Array befinden
  56.     public function flush():Void { 
  57.         for (var i:String in inhalt) { 
  58.             removeMovieClip(inhalt[i]);
  59.         }   
  60.     }
  61.    
  62.     //Löscht bestimmte MovieClips und dessen "Eintrag" aus dem Array
  63.     public function removeMCs(mc_names:Array){
  64.         for (var mc:String in mc_names){
  65.             removeMovieClip(inhalt[mc_names[mc]]);
  66.             delete inhalt[mc_names[mc]];
  67.         }
  68.     }
  69.    
  70.     //Löscht alle MovieClips und dessen "Einträge" außer den angegebenen aus dem Array
  71.     public function keepMCs(mc_names:Array){
  72.         for (var mc:String in inhalt){
  73.             if(!mc_names.in_array(mc)){
  74.                 removeMovieClip(inhalt[mc]);
  75.                 delete inhalt[mc];
  76.             }
  77.         }
  78.     }
  79.    
  80.    
  81.     //Traced die Namen aller MovieClips, die sich im Array befinden
  82.     public function traceList():Void {
  83.         for (var i:String in inhalt) {
  84.             trace(i+": "+inhalt[i]);
  85.         }   
  86.     }
  87. }

Ich weiß nicht, ob der Prototype mit in die Klasse soll oder wo sonst hin ^^ Arbeite nicht so oft-gar nicht mit Klassen.


Gr33tZ
Rn
regsnerven ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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



Alle Zeitangaben in WEZ +1. Es ist jetzt 19:10 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele