Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 03-09-2008, 20:54   #1 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
Objekt Wirrwarr bei der verwendung von setInterval (OOP)

Hallo,

ich habe ein etwas schwieriges Problem was ich mir leider nicht mehr erklären kann. Es geht dabei um die Objektorientierte Programmierung mit AS1, ich muss leider noch mit AS1 arbeiten bin mir aber nicht sicher ob das Problem daher rührt oder nicht. Erstmal das Problemkind...

Code:
   // Klasse Game #######################################################################################
   Game = function() { // Konstuktor
      this.woBinIch = "Ich bin in einem Spiel Objekt";
   }
   Game.prototype.startGame = function() {
      trace(this.woBinIch); // this bezieht sich hier auf das Time Objekt wenn es aus dem setInterval aufgerufen wird !?
   }
   
   // Klasse Time #######################################################################################
   Time = function() { // Konstuktor
      this.timer      = 0;
      this.zaehler    = 0;
      this.callback   = 0;
      this.woBinIch   = "Ich bin in einem Zeit Objekt";
   }
   Time.prototype.setCountdown = function(seconds,callback) { // Parameter: 1.Sekunden des Countdowns | 2.Callback Funktion
      this.zaehler  = seconds;
      this.callback = callback;

      var thisTime = this; // Workaround
      
      this.timer = setInterval(
         function() { 
            // this ist hier undefined !
            // Die zuvor deklarierte Variable >>thisTime<< kann ich aber ansprechen
            
            thisTime.zaehler--;               // countdown runterzählen
            trace(thisTime.zaehler);          // countdown ausgeben
            
            if (thisTime.zaehler == 0) {      // Countdown abgelaufen?
               thisTime.callback();           // Callback aufrufen
               clearInterval(thisTime.timer); // timer löschen
            }
         },
         1000                                 // timer interval = 1000 ms
      );
   }
   
   myGame = new Game;
   myTime = new Time;
   
   myTime.setCountdown(3,myGame.startGame); // 3 sekündigen Countdown starten und danach startGame des Spiel Objekts aufrufen

Ich habe alles entfernt was nicht mit dem Problem zu tun hat, der Code ist aber so ausführbar. Wie man sieht gibt es 2 Klassen (die Funktionen dienen als Konstruktor). Ein Teil der Time Klasse ist ein Countdown (setCountdown) der nach ablauf das Spiel starten soll. Nun treten 2 Probleme auf...

1. Innerhalb von setInterval ist this == undefined. Ich hatte zuerst vor als Callback ebenfalls eine Methode der Klasse Time auszulösen was geht aber innerhalb der Methode ist this ebenfalls undefined, von daher habe ich als Workaround die function direkt in dem setInterval platziert und zuvor eine Variable thisTime mit der Objektreferenz angelegt die ich ansprechen kann.

2. Jetzt wird es richtig komisch, wenn der Countdown abgelaufen ist wird die Callback function zwar aufgerufen aber aus mir unverständlichen gründen als eine Methode des Time Objekts und nicht der Klasse Game, sprich this bezieht sich auf das Time Objekt.

Auch das 2te Problem könnte ich mit einem umständlichen Workaround lösen (Objektzeiger hin und her kopieren) aber ich würde das Problem gerne verstehen damit ich weiß was da passiert.
ING ist offline   Mit Zitat antworten
Alt 03-09-2008, 21:07   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
setInterval kann zwei Modi, einmal einfach eine Funktion ohne Scope, und einmal ein Scope mit einer Methode (als String). Letztere ist was du suchst, sieht bei dir so aus:
PHP-Code:
// Klasse Game #######################################################################################
   
Game = function() { // Konstuktor
      
this.woBinIch "Ich bin in einem Spiel Objekt";
   }
   
Game.prototype.startGame = function() {
      
trace(this.woBinIch); // this bezieht sich hier auf das Time Objekt wenn es aus dem setInterval aufgerufen wird !?
   
}
   
   
// Klasse Time #######################################################################################
   
Time = function() { // Konstuktor
      
this.timer      0;
      
this.zaehler    0;
      
this.callback   0;
      
this.woBinIch   "Ich bin in einem Zeit Objekt";
   }
   
Time.prototype.setCountdown = function(seconds,scopecallback) { // Parameter: 1.Sekunden des Countdowns | 2.Callback Funktion
      
this.zaehler  seconds;
      
this.scope scope;
      
this.callback callback;
      
      
this.timer setInterval(this"intervalHandler",
         
1000                                 // timer interval = 1000 ms
      
);
   }

   
Time.prototype.intervalHandler = function() { 
            
this.zaehler--;               // countdown runterzählen
            
trace(this.zaehler);          // countdown ausgeben
            
            
if (this.zaehler == 0) {      // Countdown abgelaufen?
               
this.callback.call(this.scope);           // Callback aufrufen
               
clearInterval(this.timer); // timer löschen
            
}
         }
   
   
myGame = new Game;
   
myTime = new Time;
   
   
myTime.setCountdown(3,myGamemyGame.startGame); // 3 sekündigen Countdown starten und danach startGame des Spiel Objekts aufrufen 
Interessant wären für dich wohl die Suchbegriffe "Delegate" und "Closure"
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 03-09-2008, 22:17   #3 (permalink)
ING
whatever
 
Registriert seit: May 2008
Beiträge: 419
Ach, Super!
Wußte wirklich nicht das es bei setInterval() 2 funktionsweisen gibt, so lässt sich das Problem natürlich schön beheben. Jetzt weiß ich endlich auch was mit "Scoping" gemeint ist. Zu den erwähnten Begriffen bin ich grad debei mich schlau zu lesen

Vielen Dank Janoscharlipp, hast mir sehr geholfen
ING 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 23:03 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele