PDA

Volledige versie bekijken : setInterval werkt (weer) niet: deel 2


Flashoom
%Europe/Berlin %979 %2005, 00:29
Hallo,

Met de hulp van Dauntless raakte ik gisteren een stuk verder maar vandaag zit ik weer met problemen ivm het gebruik van setInterval en voor clearInterval in een Class. Zie de code hieronder. Ik heb een setInterval opgestart die de functie showPic herhaalt. In die functie zit een conditional die de interval kan clearen maar dat gebeurt niet. Ik heb al vanalles geprobeerd met de syntax van die conditional maar ik slaag er niet in om die clearInterval aan te roepen. De interval blijft dus lopen. Ik gebruik "this" dus daar ligt het niet aan. Ik las ergens wat over de scope van variabelen in classes. Misschien maak ik daar een fout. Heeft iemand een idee? Alvast bedankt!

class Box extends MovieClip {
private var mc:MovieClip;
private var mc2:MovieClip;
private var width_adapt: Number;
private var height_adapt: Number;
public var showPicTimer:Number;
public var resizeBoxTimer: Number;
public var checkLoadTimer:Number;
public var displayPicTimer:Number;
private var bytesloaded: Number;
private var totalloaded: Number;

// constructor
public function Box() {
_root.createEmptyMovieClip("box", 10);
mc = _level0.box;
_root.createEmptyMovieClip("pic", 2);
mc2 = _level0.pic;
}
// on initialise, draw a basic box
public function drawBox():Void {
mc.lineStyle(0, 0xFFFFFF);
mc.moveTo(0, 0);
mc.lineTo(150, 0);
mc.lineTo(150, 100);
mc.lineTo(0, 100);
mc.lineTo(0, 0);
mc._x = (Stage.width - _level0.box._width) / 2;
mc._y = (Stage.height - _level0.box._height) / 2;
loadPic();
}
// load pic but don't show
private function loadPic():Void {
mc2.loadMovie("http://www.educared.org.ar/tamtam/kmages/La-muerte-de-L-Junio-Bruto.pg.jpg");
mc2._alpha = 0;
checkLoadTimer = setInterval(this, "checkLoad", 5);
}
// check whether load is complete
private function checkLoad():Void {
bytesloaded = mc2.getBytesLoaded()/1024;
totalloaded = mc2.getBytesTotal()/1024;
if (bytesloaded == totalloaded) {
width_adapt = Math.abs((_level0.pic._width - _level0.box._width)/100);
height_adapt = Math.abs((_level0.pic._height - _level0.box._height)/100);
resizeBoxTimer = setInterval(this, "resizeBox", 1);
}
}
// resize box according to pic dimensions
private function resizeBox():Void {
clearInterval(checkLoadTimer);
if((mc2._width - mc._width) < 1 && (mc2._width - mc._width)>=0){
_level0.box._x = (Stage.width - _level0.box._width) / 2;
_level0.box._y = (Stage.height - _level0.box._height) / 2;
clearInterval(resizeBoxTimer);
mc2._x = mc._x;
mc2._y = mc._y;
mc._width = mc2._width;
mc._height = mc2._height;
showPicTimer = setInterval(this, "showPic", 50);
}
else{
_level0.box._width += width_adapt;
_level0.box._height += height_adapt;
_level0.box._x = (Stage.width - _level0.box._width) / 2;
_level0.box._y = (Stage.height - _level0.box._height) / 2;
}
}
// now show the pic
private function showPic():Void {
if(mc2._alpha < 20){
mc2._alpha += 2;
}
else {
displayPicTimer = setInterval(this, "displayPic", 5000);
clearInterval(showPicTimer);
}
}
// not finished yet: timer for showing the pic - evacuate pic - resize box back to initial dimensions
private function displayPic():Void {
mc2._alpha = 2;
clearInterval(displayPicTimer);
}
}

Dauntless
%Europe/Berlin %994 %2005, 00:52
Hier ben ik weer ;).

De scoping is voor zover ik zie idd juist, toch zegt flash dat hij hem niet kan clearen (hij doet het toch niet). Ik weet wel de oplossing, maar niet waarom het een probleem is ;). Ik denk eigenlijk eerder een bug in de Flash compiler oid...

Anyway, de oplossing:
private function showPic () : Void
{
if (mc2._alpha < 20)
{
mc2._alpha += 2;
}
else
{
displayPicTimer = setInterval (this, "displayPic", 5000);
clearInterval (this["showPicTimer"]);
}
}

Enjoy! :)

(En sorry dat je 33 minuten moest wachten ;))

Pimm
%Europe/Berlin %999 %2005, 00:59
The master has spoken...

Flashoom
%Europe/Berlin %002 %2005, 01:04
Hey Dauntless,

Ik hoopte al dat je in de buurt was. Er is toch nog iets dat niet klopt. Ik paste jouw suggestie toe en werkte ook die laatste functie daarmee verder uit: zodat de pic na 5000 verdwijnt. Maar daarna begint de zaak weer te flippen: alpha slaat alle richtingen uit.

// now show the pic
private function showPic():Void {
if(mc2._alpha < 100){
mc2._alpha += 2;
}
else {
displayPicTimer = setInterval(this, "displayPic", 5000);
clearInterval(this["showPicTimer"]);
}
}
// not finished yet: timer for showing the pic - evacuate pic - resize box back to initial dimensions
private function displayPic():Void {
mc2._alpha = 0;
clearInterval(this["displayPicTimer"]);

Dauntless
%Europe/Berlin %007 %2005, 01:10
Blijkbaar werkt die eerste clearInterval (uit m'n post) ook niet :I
Maar ik zoek verder :D 'k zal m'n post hier dan editen.

Dauntless
%Europe/Berlin %030 %2005, 01:43
Grrr, dit is verschrikkelijk frustrerend! Ik heb ondertussen al 4 dingen geprobeerd: Delegate, setInterval(function(){}, 10), int = setInterval(this, "function", 10, int) en euhm, nog iets waar ik niet meer kan opkomen, maar echt niets werkt! Dit is verschrikkelijk frustrerend ! :D

Morgen (strax) nog maar eens verder zoeken, met een nuchter hoofd...

Flashoom
%Europe/Berlin %477 %2005, 12:27
Toch al heel erg bedankt Dauntless. Ik ga vandaag nog maar eens in het Moock boek duiken. Zien wat ik daar nog kan vinden.

Flashoom
%Europe/Berlin %950 %2005, 23:48
Met wat hulp uiteindelijk toch de oplossing gevonden: je mag geen nieuwe setInterval beginnen vooraleer je een vorige hebt gestopt. Je intervals mogen maw niet 'in elkaar haken'. Toch een bug in Flash dus. Want vermits elke interval een eigen "interval identifier" krijgt, zou je verwachten dat overlappende intervals geen probleem vormen. Wel dus. Ik wilde het maar even delen met jullie.

Dauntless
%Europe/Berlin %982 %2005, 00:34
Da's leuk om te weten! :)
Hoe ben je er achter gekomen??

theFlashWizard
%Europe/Berlin %028 %2005, 01:41
dit klopt idd.. dit heb ik zat meegemaakt..

Flashoom
%Europe/Berlin %422 %2005, 11:08
Ik wist bijna zeker dat er een bug moest zijn want had mijn code bij wijze van test tot een minimum herleid: alle conditionals eruit en enkel setInterval en clearInterval overgehouden. En dat bleek ook niet te werken. Dus moest er wat met die intervals zijn. Maar het was een kennis (met meer ervaring) die me wees op het problematische van overlappende intervals. Een bug die volgens hem slecht gedocumenteerd is. Er zou uitleg staan op www.quasimondo.com maar die ligt momenteel plat.
Dit gezegd zijnde: kunnen we op deze site geen lijst van meest nuttige websites, weblogs etc aanleggen waarop documentatie van bugs en dat soort nuttige dingen terug te vinden is? Zoiets kan iedereen toch uren zoekwerk besparen?

Groeten?