| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| 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. |
| | |
| | #2 (permalink) |
| muh 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:
__________________ »Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!) |
| | |
| | #3 (permalink) |
| 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 |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |