Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 31-12-2004, 02:44   #1 (permalink)
Waffe==Verstand
 
Benutzerbild von p-flash
 
Registriert seit: Jul 2004
Ort: Düsseldorf
Beiträge: 724
Für jedes Objekt einer Klasse einen anderen Intervall-Namen

Nabend,

habe in einer Klasse eine Objekt-Methode in der ein Intervall aufgerufen wird.
Da mehrere Objekte dieser Klasse erstellt werden, kommt es zu ueberschneidungen mit den Intervall Namen.

Wie kann man das Problem lösen?

Lösungsansatz: Der Name des Intervall ist der Name des Objektes + "ID". Durch die Hilfsfunktion, soll das Intervall gelöscht werden. Ich weiß nicht welches Argument ich dem clearInterval in der Hilfsfunktion übergeben muss, damit das Intervall gelöscht wird.

PHP-Code:
Klasse.prototype.test = function(pQuellMc)
{
    
//...Anweisungen
    
this[pQuellMc._name+"ID"] = setInterval(pQuellMc.Hilfsfunktion1000pQuellMc);
};

Klasse.prototype.Hilfsfunktion = function(pQuellMc)
{
    
clearInterval(pQuellMc._name+"ID"); // Klappt nicht. this[pQuellMc._name+"ID"] auch nicht. Mit eval() auch nicht.
};
einKlasseObjekt.test(this); 
Schonmal vielen Dank.

p-flash

Geändert von p-flash (31-12-2004 um 02:47 Uhr)
p-flash ist offline   Mit Zitat antworten
Alt 31-12-2004, 08:37   #2 (permalink)
nerdig working
 
Benutzerbild von michael
 
Registriert seit: Jul 2001
Ort: Hamburg
Beiträge: 5.832
ActionScript:
  1. Klasse.prototype.test = function (pQuellMc)
  2. {
  3.     this.intervalID = setInterval (this, "Hilfsfunktion", 1000);
  4. };
  5. Klasse.prototype.Hilfsfunktion = function (pQuellMc)
  6. {
  7.     clearInterval (this.intervalID);
  8. };
  9. einKlasseObjekt.test (this);
michael ist offline   Mit Zitat antworten
Alt 31-12-2004, 11:07   #3 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
eben verstehe auch nicht warum es sich in die quere kommen sollte
objecte sind in sich gekapselt das heißt jedes object hat einen eigenen scope(geltungsbereich) und von da her können sie sich gar nicht in die quere kommen.

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 31-12-2004, 12:07   #4 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
jaja ato...die objekte innerhalb, also in sich, haben einen eigenen gekapselten scope, aber leider werden die intervalobjekte global verwaltet.
es ist zum bsp nicht nötig einen pfad zu einem interval anzugeben, um ihn zu löschen bzw. zu räumen.
das zeigt, dass flash hier einen globale verwaltung, allein anhand des objekt/intervalnamens hat und darauf zugreift.

also stellt das schon ein problem dar...

ich würde hier mit folgendem arbeiten.
merk dir doch einfach in einer globalen variabeln, namens: lastInterval - den letzten interval anhand des intervalnamens und lösch ihn bevor du ihn wieder neu erstellst.
vergiss aber nicht beides zu machen, zu räumen UND zu löschen, das heißt:

clearInterval(deinInterval);

und

delete deinInterval;


also:
ActionScript:
  1. _global.lastInterval = null;
  2.  
  3. Klasse.prototype.test = function(pQuellMc){
  4.            //...Anweisungen
  5.            var int = pQuellMc._name +'ID';
  6.            this[int] = setInterval(pQuellMc.Hilfsfunktion, 1000, pQuellMc);
  7.            _global.lastInterval = this[int];
  8. };
  9.  
  10. Klasse.prototype.Hilfsfunktion = function(pQuellMc){
  11.            clearInterval(lastInterval); //sollte jetzt klappen.
  12.            delete lastInterval;
  13. };
  14. einKlasseObjekt.test(this);


greetz

kelor

Geändert von kelor (31-12-2004 um 12:27 Uhr)
kelor ist offline   Mit Zitat antworten
Alt 31-12-2004, 12:57   #5 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
@kelor ich kann dir nicht folgen. das macht doch keinen sinn. folgendes kleines script veranschaulicht das die intervalVariable schon objectgebunden ist. setInterval gibt ja auch nix weiter zurück als eine Number als welche incrementiert wird.

PHP-Code:
o1 = {};
o1.interval setInterval(o1"testFunction"200);
o1.testFunction = function() {
    
trace("o1");
}

o2 = {};
o2.interval setInterval(o2"testFunction"300);
o2.testFunction = function() {
    
    
trace("o2");
}

// es passiert gar nichts wie erwartet man muß o1.interval oder o2.interval übergebn
clearInterval(interval); 
mfg
alex

btw. schon zu sehen das du dich mal wieder im FF blicken läßt
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:02   #6 (permalink)
Waffe==Verstand
 
Benutzerbild von p-flash
 
Registriert seit: Jul 2004
Ort: Düsseldorf
Beiträge: 724
Hmm...das klappt auch nicht. Wenn ich _global.lastInterval trace, dann wird undefined angezeigt. Das intervall wird nicht gelöscht.

Das verstehe ich nicht! Habt ihr noch andere Vorschläge?

DANKE!

p-flash
p-flash ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:11   #7 (permalink)
Waffe==Verstand
 
Benutzerbild von p-flash
 
Registriert seit: Jul 2004
Ort: Düsseldorf
Beiträge: 724
Ich poste am besten mal mein script.

PHP-Code:
Partner1.prototype.init = function()
{
    
this.setEnergie(this.TOTAL_ENERGIE);
    
this.setStaerke(10);
    
setInterval(this.schiessen3500this);
};
Partner1.prototype.schiessen = function(pQuellMc)
{
    var 
temp _global.AktuelleGegner_array;
    if(
temp.length 0)
    {
        
// Zufaellig ein Array-Element aussuchen.
        // Immer groesser Null, wegen der if-Anweisung.
        
var Math.floor(Math.random() * temp.length); 
        if(eval(
temp[r]) != undefined)
        {
            
_root.createEmptyMovieClip"Partner1Schuss"16001);
            
with (_root.Partner1Schuss)
            {
                
lineStyle(10xff0000100);
                
moveTo(pQuellMc._xpQuellMc._y);
                
lineTo(temp[r]._xtemp[r]._y); 
            }
            
temp[r].dekrementiereEnergie(pQuellMc.Staerke);
            
temp[r].sterben();
            if(
temp[r].Energie <= 0)
            {
                
// Aus AktuelleGegner_array loeschen
                
temp.splice(r1); 
            }
            var 
iv pQuellMc._name+"ID";
            
this[iv] = setInterval(pQuellMc.Hilfsfunktion1000);
            
_global.lastInterval this[iv];
        }
        
// Wenn "broken-link", dann loesche es und warte wieder die Intervall-Zeit ab.
        
else
        {
            
temp.splice(r1);
        }
    }
        
};

/** Objekt-Methode: Hilfsfunktion
 *  Beschreibung: Hilfsfunktion fuer Methode schiessen
 *                Loescht das setInterval und das Schuss-Mc.
 */
Partner1.prototype.Hilfsfunktion = function()
{
    
trace("Dieser Text darf nur einmal pro Intervall angezeigt werden");
    
removeMovieClip(_root.Partner1Schuss);
    
clearInterval(_global.lastInterval);
    
delete _global.lastInterval;
}; 
Das Problem ist vllt, dass die Methode-schiessen in einem intervall aufgerufen wird und selbst wieder ein interval enthält.

p-flash

Geändert von p-flash (31-12-2004 um 13:13 Uhr)
p-flash ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:23   #8 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
ich weiß nicht was daran nun noch soschwer ist

PHP-Code:
clearInterval(this.interval);
this.interval setInterval(this"Hilfsfunktion"1000); 

Partner1.prototype.Hilfsfunktion = function()
{
    
trace("Dieser Text darf nur einmal pro Intervall angezeigt werden");
    
removeMovieClip(_root.Partner1Schuss);
}; 
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:32   #9 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
ato...vergiss was ich geschrieben hab...ich bin scheinbar nicht ganz bei trost...
es wird global natürlich ein numerischer wert und kein name gespeichert.


aufpassen bei interval-aufrufen einer funktion...auch wenn diese eine methode einer klasse ist, geht der scope des obejktes verloren undsetzt sich auf das intervalobejkt selbst.


greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:33   #10 (permalink)
Waffe==Verstand
 
Benutzerbild von p-flash
 
Registriert seit: Jul 2004
Ort: Düsseldorf
Beiträge: 724
Das geht doch nicht, oder verstehe ich das falsch.

Die Methode-Schiessen wird alle 3,5 sec aufgerufen, in ihr wird eine Linie dynamisch erzeugt. Diese Linie soll nach 1 sec verschwinden mit Hilfe der Hilfsfunktion. Aber wenn das clearInteral in der schiessen-methode ist, dann wird die linie erst nach dem nächtens aufruf von schiessen gelöscht, also erst nach 2,5 sec.

Oder stimmt das nicht?

p-flash
p-flash ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:51   #11 (permalink)
querdenker
 
Benutzerbild von kelor
 
Registriert seit: Jun 2001
Ort: formel1-stadt hockenheim
Beiträge: 4.731
ich sage es gerne nochmals...

trace mal innerhalb von schiessen dein this: du wirst überrascht sein, was da kommt.

schiessen wird via interval aufgerufen - dadurch ändert sich der scope der funktion, die via interval aufgerufen wird.
aus dem eigentlichen objekt, zu dem die methode gehörte, wird nun innerhalb von schiessen das interval-objekt selbst.

aus dem grund ist ein
this[interval] innerhalb der funktion schiessen bestimmt nicht das, was du wolltest.
du wolltest wohl deiner klasseninstanz das intervalobjekt ankleben, oder?!
und nicht dem intervalobejkt 1 das intervalobejkt 2, oder sehe ich das flasch?



greetz

kelor
kelor ist offline   Mit Zitat antworten
Alt 31-12-2004, 13:59   #12 (permalink)
Waffe==Verstand
 
Benutzerbild von p-flash
 
Registriert seit: Jul 2004
Ort: Düsseldorf
Beiträge: 724
Da hast du Recht. Danke an euch beiden. Habe es endlich geschafft. Ein Remix aus euren Tips.

Hier der richtige Code.

PHP-Code:
Partner1.prototype.schiessen = function(pQuellMc)
{
    var 
temp _global.AktuelleGegner_array;
    if(
temp.length 0)
    {
        
// Zufaellig ein Array-Element aussuchen.
        // Immer groesser Null, wegen der if-Anweisung.
        
var Math.floor(Math.random() * temp.length); 
        if(eval(
temp[r]) != undefined)
        {
            
_root.createEmptyMovieClip"Partner1Schuss" pQuellMc.SchussTiefepQuellMc.SchussTiefe);
            
with (_root["Partner1Schuss" pQuellMc.SchussTiefe])
            {
                
lineStyle(10xff0000100);
                
moveTo(pQuellMc._xpQuellMc._y);
                
lineTo(temp[r]._xtemp[r]._y); 
            }
            
temp[r].dekrementiereEnergie(pQuellMc.Staerke);
            
temp[r].sterben();
            if(
temp[r].Energie <= 0)
            {
                
// Aus AktuelleGegner_array loeschen
                
temp.splice(r1); 
            }
            
pQuellMc.ID setInterval(pQuellMc.Hilfsfunktion350pQuellMc);
        }
        
// Wenn "broken-link", dann loesche es und warte wieder die Intervall-Zeit ab.
        
else
        {
            
temp.splice(r1);
        }
    }
        
};

/** Objekt-Methode: Hilfsfunktion
 *  Beschreibung: Hilfsfunktion fuer Methode schiessen.
 *                Loescht das setInterval und das Schuss-Mc.
 */
Partner1.prototype.Hilfsfunktion = function(pQuellMc)
{
    
removeMovieClip(_root["Partner1Schuss" pQuellMc.SchussTiefe]);
    
clearInterval(pQuellMc.ID);
}; 
Nochmals danke.

p-flash
p-flash 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 13:21 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele