PDA

Volledige versie bekijken : setInterval werk niet?


Flashoom
%Europe/Berlin %864 %2005, 21:45
Hallo allemaal,

Ik ben een beetje aan het oefenen in AS2 en classes. Maar een simpele setInterval wil om een of andere redenen niet werken. Ziet iemand de fout? Hieronder de code van de class

class square extends MovieClip {
public var rotateTimer: Number;
// constructor
public function square() {
}

public function rotateIt() {
_level0.film.vierkant._rotation = 5;
}
public function animate() {
_level0.film.attachMovie("square_mc", "vierkant", 1);
rotateTimer = setInterval(this, "rotateIt", 1000);
}
}

En dan de code in de movie

var Test:square = new square();
Test.animate();

Roenes
%Europe/Berlin %869 %2005, 21:51
je syntax van setInterval is verkeerd:
rotateTimer = setInterval(rotateIt, 1000);
Dit zou moeten werken. Even iets anders: Volgens mij moet de naam van je classe ook perse met een hoofdletter beginnen. :)

Dauntless
%Europe/Berlin %874 %2005, 21:59
je syntax van setInterval is verkeerd:

Nope, die's juist, je kan hem op verschillende manieren gebruiken:
Usage 3: This example uses a method of an object. You must use this syntax when you want to call a method that is defined for an object.

obj = new Object();
obj.interval = function() {
trace("interval function called");
}

setInterval( obj, "interval", 1000 );
Even iets anders: Volgens mij moet de naam van je classe ook perse met een hoofdletter beginnen. :)
Da's denk ik ook niet waar hoor... Het is een wel een goede gewoonte om je classes met een hoofdletter te beginnen en instances van classes met een kleine letter (het omgekeerde van wat jij doet).

Maar trace 'this' eens te tracen in de rotateIt method. Wat geeft dat?

Ohja, je doet nogal vreemde dingen in je class (waardoor het nut van de class een beetje overbodig is). Maak bv een var aan om een referentie naar je vierkant in te zetten en gebruik die dan ipv _level0.film, etc. Het is ook handig als je _level0.film meegeeft in de constructor. Want als je nu (ok, het is een oefening, maar toch) plots de structuur van je fla wilt veranderen moet je overal in je code gaan duiken.

Het zou dan eerder iets zijn als dit:
class square extends MovieClip {
public var rotateTimer: Number;
private var vierkant_mc:MovieClip;
private var root:MovieClip;
// constructor
public function square(root) {
this.root = root;
}

public function rotateIt() {
vierkant_mc._rotation = 5;
}
public function animate() {
vierkant_mc = root.attachMovie("square_mc", "vierkant", 1);
rotateTimer = setInterval(this, "rotateIt", 1000);
}
}

//Usage:
var Test:square = new square(this.film);
Test.animate();

Roenes
%Europe/Berlin %880 %2005, 22:07
Dauntless je hebt gelijk over de syntax van setInterval. Stomme AS-ref! Bovenin staat alleen mijn variant en ik heb niet naar beneden gescrolled. :)

Maar die this als eerste parameter zal waarschijnlijk voor het probleem zorgen. :)

En over die hoofdletter: Ik was vrij zeker dat dat wel moest. Ik kan alleen zo snel geen bevestiging vinden. Maar het zal wel weer zo'n "best practise" zijn :)

Flashoom
%Europe/Berlin %884 %2005, 22:14
Dauntless,

Een trace(this) in de method geeft voortdurend [Object object]. Ergo, de setInterval werkt maar dat vierkant draait niet.
Je hebt gelijk met je opmerkingen voor de rest (correcte syntax). Maar eigenlijk is dit maar een snelle oefening (die dus niet werkt). Ik ben bezig aan een slideshow class en heb daarin ook problemen met setInterval. Ik heb de indruk dat er een of andere bug zit in AS2 en setInterval.

Dauntless
%Europe/Berlin %889 %2005, 22:21
Maar het zal wel weer zo'n "best practise" zijn :)
Jup :). Volgens Colin Moock (Essential ActionScript 2.0, O'Reilly press):

To create, or define, an Actionscript 2.0 class, we use a class declaration, which starts with the class keyword, as follows:
class ClassIdentifier {
}
where ClassIdentifier is the name of the class (which, by convention, should start with a capital letter)


Btw: dit werkt hoor!

class Square extends MovieClip
{
private var root:MovieClip;
private var vierkant_mc:MovieClip;
// constructor
public function Square (root)
{
this.root = root;
}
public function rotateIt ()
{
root.vierkant._rotation = 5;
}
public function animate ()
{
vierkant_mc = root.attachMovie ("square_mc", "vierkant", 1);
var rotateTimer:Number = setInterval (this, "rotateIt", 1000);
//rotateTimer heb je dan weer waarschijnlijk _niet_ in de rest van je class nodig,
//dus lokale declaratie
}
}
//Usage:
var mySquare:Square = new Square(this);
mySquare.animate();


//Edit: je fout zit hem dus idd in het pad. Probeer het eens op 'mijn manier', dan werk je met relatieve paden en ga je minder snel een fout maken.

Roenes
%Europe/Berlin %889 %2005, 22:21
Ik heb de indruk dat er een of andere bug zit in AS2 en setInterval.Dat is wle heel snel geconcludeerd. Ik denk dat er een heel klein foutje in je code zit. Maar ik hoorde van dauntless dat hij daar nu druk mee bezig is dus ik ga ervan uit dat dit binnen een paar minuutjes is opgelost ;)

En over die hoofdletter: Dauntless zocht het net op en kwam met deze tekst op de proppen:
.... where ClassIdentifier is the name of the class (which, by convention, should start with a capital letter).
Het komt er dus op neer dat het een best practise is. :)

Damn! Heeft dauntless me op 2 fouten in 1 post gepakt! :rolleyes:

//Edit
En nu is ie ook nog eerder in reageren. Ik denk dat ik vroeg naar bed moet vandaag :p

Dauntless
%Europe/Berlin %892 %2005, 22:24
Damn! Heeft dauntless me op 2 fouten in 1 post gepakt! :rolleyes: Eindelijk :D Het werd tijd ;)

//Edit
En nu is ie ook nog eerder in reageren. Ik denk dat ik vroeg naar bed moet vandaag :p
Of een snellere internet verbinding kopen? :p

Roenes
%Europe/Berlin %895 %2005, 22:29
Eindelijk :D Het werd tijd ;)Dat was nergens voor nodig ;)

Of een snellere internet verbinding kopen? :pNeh! Betijds naar bed doet wonderen ;)

En nu weer back on-topic :)

Flashoom
%Europe/Berlin %900 %2005, 22:37
Nope Dauntless,

Ik heb je code overgenomen maar dat vierkant draait welgeteld één keer. Da's het rare, volgens die trace(this) loop de interval maar hij voert de rotate functie blijkbaar wel maar één keer uit. Heb geprobeerd met publish preview en al.

Dauntless
%Europe/Berlin %903 %2005, 22:41
Euhm, ja, da's logisch :D

root.vierkant._rotation = 5;
//wordt:
root.vierkant._rotation += 5; ;)

Flashoom
%Europe/Berlin %918 %2005, 23:02
Ok! Die += deed het. Pfff, stomme fout van me. Ik heb er nu een conditional aan toegevoegd om de setInterval te clearen en ook dat werkt dus. Oefening dus geslaagd! Dankjewel, Dauntless.
Nu terug naar mijn slideshow project om te zien wat er daar schort aan die interval. Mag ik je eventueel die code eens tonen ter verificatie?

Groetjes

Dauntless
%Europe/Berlin %928 %2005, 23:17
Mag ik je eventueel die code eens tonen ter verificatie?

Sure , doe maar :).

Flashoom
%Europe/Berlin %942 %2005, 23:37
Tof van je. Here goes.

Ik heb een aantal zaken ge-comment voorlopig. Ik laad nu een pic van het web - als test - bedoeling is om hier een xml array op aan te sluiten in de toekomst. Probleem is momenteel dat de pic onzichtbaar moet zijn (alpha 0) tot de functie Testit wordt aangeroepen. Maar dat gebeurt dus niet. De foto is al eerder zichtbaar.
Je zal zien: de functie resizeBox wordt herhaald via een setInterval. Daarin zit een conditional: als de box de grootte van de pic (bijna) heeft moet de interval gestopt worden en gaan we over naar de Testit functie waarin de pic visible wordt gezet. Maar blijkbaar wordt bij elk overlopen van de resizeBox functie die foto al zichtbaar gezet. Ik snap er niets van. Heb jij een idee? Heel erg bedankt alvast

Hier de code:

class Box extends MovieClip {
public var mc:MovieClip;
private var mc2:MovieClip;
private var width_adapt: Number;
private var height_adapt: Number;
public var showPicTimer;
public var resizeBoxTimer: Number;
public var checkLoadTimer;
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
function drawBox() {
mc.lineStyle(0, 0xFF0000);
mc.moveTo(0, 0);
mc.lineTo(150, 0);
mc.lineTo(150, 100);
mc.lineTo(0, 100);
mc.lineTo(0, 0);
mc._x = (Stage.width - mc._width) / 2;
mc._y = (Stage.height - mc._height) / 2;
loadPic();
}
function loadPic() {
mc2.loadMovie("http://www.londonlee.com/Pop%20Heaven/pics/bowie_640.jpg");
mc2._alpha = 0;
checkLoadTimer = setInterval(this, "checkLoad", 5);
}
function checkLoad(){
bytesloaded = mc2.getBytesLoaded()/1024;
totalloaded = mc2.getBytesTotal()/1024;
if (bytesloaded == totalloaded) {
width_adapt = Math.abs((mc2._width - mc._width)/20);
height_adapt = Math.abs((mc2._height - mc._height)/20);
resizeBoxTimer = setInterval(this, "resizeBox", 20);
}
}
function resizeBox(){
clearInterval(checkLoadTimer);
if((mc2._width - mc._width) < 6){
mc._x = (Stage.width - mc._width) / 2;
mc._y = (Stage.height - mc._height) / 2;
//showtimer = setInterval(this, "showit", 3000);
clearInterval(resizeBoxTimer);
mc2._x = mc._x;
mc2._y = mc._y;
mc._width = mc2._width;
mc._height = mc2._height;
Testit();
//mc2._y = mc._y;
//showPicTimer = setInterval(this, "showPic", 50);
}
else{
mc._x = (Stage.width - mc._width) / 2;
mc._y = (Stage.height - mc._height) / 2;
mc._width += width_adapt;
mc._height += height_adapt;
}
}

function Testit(){
if(mc._width == mc2._width){
mc2._alpha = 10;
}
}
function showPic(){
if(mc2._alpha < 100){
mc2._alpha += 2;
}
else{
clearInterval(showPicTimer);
}
}
}

Dauntless
%Europe/Berlin %958 %2005, 23:59
function resizeBox ()
{
clearInterval (checkLoadTimer);
if ((mc2._width - mc._width) < 6 && (mc2._width - mc._width)>=0)
{
mc._x = (Stage.width - mc._width) / 2;
mc._y = (Stage.height - mc._height) / 2;
//showtimer = setInterval(this, "showit", 3000);
clearInterval (resizeBoxTimer);
trace("olé");
mc2._x = mc._x;
mc2._y = mc._y;
mc._width = mc2._width;
mc._height = mc2._height;
Testit ();
//mc2._y = mc._y;
//showPicTimer = setInterval(this, "showPic", 50);
}
else
{
mc._x = (Stage.width - mc._width) / 2;
mc._y = (Stage.height - mc._height) / 2;
mc._width += width_adapt;
mc._height += height_adapt;
}
}
Wanneer je je box aanmaakt is die 150 breed, en je mc2 blijkbaar nog 0. Door die extra check werkt het.

Ps: Niet persoonlijk natuurlijk, maar je Class is niet echt goed geschreven. Je maakt totaal geen gebruik van de mogelijkheden van classes en eigenlijk heb je gewoon al je functies in classes gezet ... Als je echt leuke classes wil schrijven moet je het volgende boek eens bekijken: Essential ActionScript 2.0 van Colin Moock. Het voornaamste: je mist dynamiek. Alles is 100% statisch. Zoals bv je loadPic:

function loadPic ()
{
mc2.loadMovie ("http://www.londonlee.com/Pop%20Heaven/pics/bowie_640.jpg");
mc2._alpha = 0;
checkLoadTimer = setInterval (this, "checkLoad", 5);
}
Zou veel beter zijn:
function loadPic (url_)
{
mc2.loadMovie (url_);
mc2._alpha = 0;
checkLoadTimer = setInterval (this, "checkLoad", 5);
}

//en die kan je dan aanroepen met loadPic(""http://www.londonlee.com/Pop%20Heaven/pics/bowie_640.jpg");

En dit is allemaal niet slecht bedoelt hoor, 'k wil je alleen maar helpen :).

Veel success nog verder! :)

Flashoom
%Europe/Berlin %967 %2005, 00:13
Dauntless, je bent straf! Thanx man. Nu, ik begrijp het niet helemaal. Want volgens de code wordt die resizeBox interval pas aangevangen wanneer bytesloaded == totalloaded dus wanneer de pic is geladen en DUS mc2 dus geen 0 kan zijn. Raar. Maar je extra check doet het dus wel.
Je kritiek op mijn code is helemaal geen probleem. Daarvoor dienen dit soort fora en uitwisselingen toch? Maar ik weet niet of ik je goed snap. Die loadMovie is hier voorlopig statisch omdat ik er straks een xml wil op aansluiten. Ik probeer nu de animatie op zich uit. De voeding van de pics komt daarna.
Ik ben bezig in Moock zijn boek. Die vent is super.

Groetjes, Frank

Dauntless
%Europe/Berlin %973 %2005, 00:22
Dauntless, je bent straf! Thanx man. Nu, ik begrijp het niet helemaal. Want volgens de code wordt die resizeBox interval pas aangevangen wanneer bytesloaded == totalloaded dus wanneer de pic is geladen en DUS mc2 dus geen 0 kan zijn. Raar. Maar je extra check doet het dus wel.
Je kritiek op mijn code is helemaal geen probleem. Daarvoor dienen dit soort fora en uitwisselingen toch? Maar ik weet niet of ik je goed snap. Die loadMovie is hier voorlopig statisch omdat ik er straks een xml wil op aansluiten. Ik probeer nu de animatie op zich uit. De voeding van de pics komt daarna.
Ik ben bezig in Moock zijn boek. Die vent is super.

Groetjes, Frank
Hehe, idd, goed boek! :) Maar bv, je zet geen private/public bij je functies, je geeft ook geen return types op (nu is dat wel :Void, maar swat), en ik denk dat je die xml url dan ook gaat 'hardcoden'. Dat wil dus zeggen dat je hem dus zoals nu rechstreeks invult in de loadMovie() method, ipv hem aan te geven via flash. Het voordeel van dynamisch is dus dat je snel meerdere foto galleries en zo op je stage kunt zetten, dmv dezelfde class.

En dat die mc2 0 is is idd vreemd. Ik snap het zelf ook eigenlijk niet helemaal... Máár, het werkt, dat is wat telt... toch? :D

Flashoom
%Europe/Berlin %976 %2005, 00:25
Ok, je kritiek is duidelijker. Ben zeker akkoord. Ik kan verder met mijn projectje. Nogmaals bedankt en... slaap ze!

Dauntless
%Europe/Berlin %979 %2005, 00:29
Ok, je kritiek is duidelijker. Ben zeker akkoord. Ik kan verder met mijn projectje. Nogmaals bedankt en... slaap ze!
Graag gedaan :).