Tuesday, February 27, 2007

[TUT] Tile Based Games, Maps bouwen

Tile Based Games, wat zijn dat? De meest bekende games, zoals Super Mario zijn Tile Based(TB) games. Wat houd het nou precies in? Het idee erachter is om met name de map op te delen in vierkantjes (de tiles). Want zonder dat je het echt door hebt, bestaan de meeste mappen uit herhalende patronen. Waarom zou je de hele map tekenen, terwijl je hetzelfde krijgt door het op te delen in aan elkaar passende delen? Misschien klinkt dit een beetje vaag, daarom een afbeelding om het misschien wat duidelijker te maken:

Zoals je ziet loopt alles naadloos over. Omdat Flash Object Georiënteerd Programmeren, in engels ook wel OOP, is dit ideaal. In dit artikel leer je met Flash ActionScript hoe je simpel mappen kan laten opbouwen, die makkelijk te veranderen zijn, en tips en tricks over de eigenschappen van een tile(bijvoorbeeld of je er op kan lopen of niet). Ik ga er al wel van uit dat je al een redelijke basis kennis hebt met ActionScript, want ik leg alleen de principes uit, en ga niet stap voor stap naar een resultaat toe werken.

De map

Eerst voor de gene die er nog nooit mee hebben gewerkt een korte uitleg over het opbouwen van een map uit een array. Deze vullen we met cijfers, elk cijfers staat voor een andere tile. De array is multidimensionaal, want het bevat rijen en kolommen. Een lege map met een muurtje aan de rand kan er bijvoorbeeld zo uit zien:

var map1:Array =
[["1", "1", "1", "1", "1"],
["1", "0", "0", "0", "1"],
["1", "0", "0", "0", "1"],
["1", "0", "0", "0", "1"],
["1", "1", "1", "1", "1"]];

Deze array willen we omzetten in een map op de stage. Hiervoor moet je eerst de movieclips van je tile's in de library zetten. Ikzelf gebruik altijd een linkage van 'tile0' voor de tile die bij het cijfer 0 hoort en 'tile1' voor degene die bij nummer 1 hoort. Dit maakt het zo makkelijk om het heel dynamisch te maken.


Waneer je dit hebt moet je de array doorspitten en voor elk nummer de juiste tile plaatsen. Dit doorspitten doe je met behulp van 2 for-loops. Een voor de rij, en daar binnen een voor de kolom.

for(var row:Number = 0; row < mapArray.length;row++){
for(var column:Number = 0; column < mapArray[0].length;column++){

}
}

Hij zal dus eerst de eerste rij afgaan, en daarbinnen alle kollommen, daarna gaat hij naar de 2e rij en zoekt daar weer door alle kollomen.
Binnen deze for-loop zorg je dan dat aan de hand van de waarde in de array de juiste tile op de juiste plaats word gezet. Het attachen gaat dan zo:

for(var row:Number = 0; row < mapArray.length;row++){
for(var column:Number = 0; column < mapArray[0].length;column++){

this.attachMovie("tile"+mapArray[row][column],"tile_"+row+"_"+column,this.getNextHighestDepth());

}
}

Voor de positie is het anders als je zou denken, dit komt namelijk doordat for-loops erg snel gaan. In eerste instantie zou je denken om gewoon de huidige rij te vermenigvuldigen met de hoogte van een tile. Dit is ook wel zo, het probleem is alleen dat je eerst de rij op moet slaan in de movieclip zelf, en dan via this.variabele hem op moet vragen. Doe je dit niet, worden de waarden pas toegekend wanneer de for-loop is afgelopen, en krijgen ze allemaal de positie van de laatste tile. Het idee van hoe het wel moet zie je hieronder:

this.attachMovie("tile"+arr[row][column], "tile_"+row+"_"+column, this.getNextHighestDepth());
this["tile_"+row+"_"+column].row = row;
this["tile_"+row+"_"+column].column = column;
this["tile_"+row+"_"+column]._x = this["tile_"+row+"_"+column].column*tileSize;
this["tile_"+row+"_"+column]._y = this["tile_"+row+"_"+column].row*tileSize;

Hoe dit stap voor stap gebeurt zie je hier:

Zoals je al ziet bij het attachen is het belangrijk dat je een bepaalde structuur hebt in de naamgeving van de MC's in de library en de geattachte MC's. Hieronder zal ik nog een simpel trucje bespreken om later, wanneer je bijvoorbeeld een poppetje toe gaat voegen, op de vragen welke tile er op een bepaalde positie is, en of hij een muur, of grond is.

Tile detectie

Hoe kan je makkelijk nagaan op welke positie welke tile zich bevind? Als je het goed hebt gedaan zal dit niet zo moeilijk zijn. wanneer je de naamgeving hebt gebruikt die ik hierboven heb aangeraden, is het zelfs simpel. De eerste tijd dat ik met TB games bezig was pushte ik alle coördinaten van de tile's in een array, en liet deze elke keer weer door spitten om te kijken binnen welke waarden de te checken waarde zat. Dit is natuurlijk vrij onhandig, en CPU vretend. Hier is een trucje voor:
Je deelt de x positie van het punt door de breedte van de tile's, en rond dit af naar beneden. Je weet dat de zoveelste tile in de rij is. Om na te gaan in welke rij hij zich bevind doe je natuurlijk hetzelfde alleen dan met de y waarde. Klink logisch toch? Mocht dat het niet zijn nog een voorbeeldje:

Je hebt tiles van 50 px breed. Welke tile bevind zich op positie (220,65)?
Kolom = Int(220/50);
Rij = Int(65/50);
Wanneer je dit weet, en je systematisch met je naamgeving om bent gegaan, kan je zo een simpele functie maken om de instancename van een tile op een bepaalde positie terug te geven:

function giveTile(x, y):MovieClip {
return this["tile_"+(Math.floor(x/tileSize))+"_"+(Math.floor(y/tileSize))];
}

Met deze wetenschap kan je tiles een bepaalde variabele meegeven, waaraan je af kunt lezen of deze tile een muur of grond is. Je zou dit bijvoorbeeld zo kunnen doen, bij het attachen:

this.attachMovie("tile"+arr[row][column], "tile_"+row+"_"+column, this.getNextHighestDepth());
this["tile_"+row+"_"+column].walkable = true;

Een nieuwe functie om te checken of een bepaalde positie loopbaar is is dan ook niet moeilijk meer:

function isWalkable(x, y):Boolean {
return this["tile_"+(Math.floor(x/tileSize))+"_"+(Math.floor(y/tileSize))].walkable;
}


Dit was het wat betreft het bouwen van maps. Zoals je waarschijnlijk al wel door hebt zijn TB games ideaal, aangezien je geen CPU vretende berekeningen nodig hebt om dingen te checken, en maps eenvoudig te veranderen zijn. Binnenkort zal ik in een nieuw artikel doorgaan op tilebased games, ik hoop je tot nu toe al een behoorlijke basis te hebben gegeven over de wereld van de TB games, waar je met minder meer kan krijgen!

Monday, February 26, 2007

[TUT] Besturing met Toetsenbord

Besturing via Toetsenbord


In deze tutorial zal ik een aantal dingen uitleggen over besturing via het toetsenbord in games. Een groot deel van de flashers(zeker van de beginnende) willen graag spelletjes maken. Ik zal de basis uitleggen van games met het toetsenbord.


Wat gaan we behandelen?

  • (Natuurlijk)Hoe je opvraagt welke Key ingedrukt is
  • _x en _y posities van een object
  • Welken met variabelen, die veranderen door de key's en de omgeving
  • Depths
  • movieclips verwijderen van je stage



Wat gaan we maken?

Een simpele movie warin je een object kan bewegen, en objecten 'oppakken' die invloed hebben op variabelen of variabele eigenschappen van een object


Laten we beginnen met een aantal zaken die te maken hebben met besturing via toetsenbord. Het is belangrijk te bedenken dat er gecontroleerd word of een key is ingedrukt om een korte tijd. Als je het om de seconde checkt, heb je kans dat de key al weer is losgelaten. waneer je het in een onEnterFrame zet, word er(uitgaande van een framerate van 12 fps) 12 keer per seconde uitgevoerd.

Hoe vraag je dan op welke key er in gedrukt is? Dit kan je opvragen in een 'if statement'. Een wat er binnen deze 'if statement' staat, word aleen uitgevoerd als het aan de eisen van dit statement voldoet. In het geval van de key is het dus zo:

this.onEnterFrame = function(){

if(Key.isDown(Key.SPACE)){

trace("je hebt zojuist de spatiebalk ingedrukt");

}

}


Wat wij willen bereiken is dat er bij het indrukken van een key, de x of y positie van een MC(=MovieClip) willen beinvloeden, zodat deze naar rechts/link of onder/boven beweegt. De x en y positie vraag je op en defineer je op de volgende manier:

mc1._x = 100

mc1._y = 100;

mc1.onEnterFrame = function(){

mc1._x+=4;

}


Wat gebeurd er hier als je dit script zal gebruiken? Bij het laden van je movie zal de MC met instancename "mc1" beginnen op een positie van (100,100). Bij een framerate van 12 frames per seconde zal deze dus door de onEnterFrame 12 keer per seconde 4 pixels naar rechts verschuiven. Voor de duidelijkheid zal ik in de volgende afbeelding laten zien hoe het 'assenstelsel' van flash er uit ziet.



Iets wat ook een veel voorkomt element in spelletjes is hitTest. Dit test of de 2 opgegeven objecten elkaar raken. Dit word ook weer vaak gebruikt in combinatie met een if statement. Een voorbeeld: je wilt een actie ondernemen waneer mc1 mc2 raakt:

this.onEnterFrame = function(){

if(mc1.hitTest(mc2)){

trace("u heeft zojuist mc2 geraakt");

}

}


Deze Onderdelen gaan we gebruiken om een klein, simpel spelletje in elkaar te zetten. Ik heb deze onderdelen apart uit proberen te leggen omdat waneer je zelf een spelletje wilt maken, dit bijna altijd wel voorkomt.



Om te beginnen gaan we dit maken:


Zoals je ziet kan je bewegen, objecten 'oppakken'die invloed hebben op variabelen of eigenschappen.



Om te beginnen gaan we eerst de objecten maken, daarna gaan we over op het script. De volgende objecten kan je naar eigen keus maken:

  • Het poppetje wat bestuurd kan worden(instancename='mc1')
  • Een object die je op kan pakken die je snelheid verhoogd(instancename='mc2')
  • Een object die je op kan pakken die je figuurtje kleiner maakt.(instancename='mc3')

That's All. Nou komt het belangrijkste pas: het script. Als je de stukken over de onderdelen van AS die ik ga gebruiken die hier boven staan hebt doorgelezen. Zal het misschien al duidelijk zijn, maar ik ga er toch even stap voor stap door heen.



Ten eerste zullen we eerst er voor zorgen de de mc die je kan besturen, ook echt bestuurbaar is. Dit doen we door middel van het aanpassen van de x en y positie door de keys. Vergeet niet dat deze code op je frame komt, en niet op je mc's timeline.

moveSpeed = 5;

mc1.onEnterFrame = function() {

if (Key.isDown(Key.LEFT)) {

this._x -= moveSpeed;

}

if (Key.isDown(Key.RIGHT)) {

this._x += moveSpeed;

}

if (Key.isDown(Key.UP)) {

this._y -= moveSpeed;

}

if (Key.isDown(Key.DOWN)) {

this._y += moveSpeed;

}


Misschien vraag je jezelf af warom ik de variable 'moveSpeed' gebruik, terwijl hij overal 5 is. Dit doe ik omdat je zo makkelijker de snelheid kan beinvloeden. Wil ik hem sneller laten bewegen, hoef ik alleen maar die variabele aan te passen.

Als het goed is kan als je je movie nu test je mc laten bewegen met je pijltjestoetsen. Het enige wat er nu nog moet gebeuren is het 'oppak' gedeelte.

Hiervoor heb ik de hitTest uitgelegd. Eerst moet flash controleren of de mc's elkaar raken. Waneer dit zo is, moet de variabele aangepast worden, en de MC verwijderd. Dat kan je doen door deze code op je frame te zetten.

moveSpeed = 5;

mc1.onEnterFrame = function() {

if (Key.isDown(Key.LEFT)) {

this._x -= moveSpeed;

}

if (Key.isDown(Key.RIGHT)) {

this._x += moveSpeed;

}

if (Key.isDown(Key.UP)) {

this._y -= moveSpeed;

}

if (Key.isDown(Key.DOWN)) {

this._y += moveSpeed;

}

if (this.hitTest(mc2)) {

moveSpeed = 10;

mc2.swapDepths(getNextHighestDepth());

mc2.removeMovieClip();

}

if (this.hitTest(mc3)) {

mc1._width *= .5;

mc1._height *= .5;

mc3.swapDepths(getNextHighestDepth());

mc3.removeMovieClip();

}

};


Als je de stukken aan het begin van deze tutorial hebt gelezen zal je de hittest wel begrijpen. Ik zal alleen het stuk uitleggen warin de mc word verwijderd:

mc2.swapDepths(getNextHighestDepth());

mc2.removeMovieClip();


Met swapDepths kan je een mc een andere depth geven. De depth is de volgorde van welke op de voorgrond, en welke verder naar achter ligt. Bijvoorbeeld: mc1 heeft depth 1 en mc2 heeft depth 2. Ze overlappen elkaar, welke zie je totaal, en overlapt dus de ander? mc2 heeft een hogere depth, en zal dus volledig te zien zijn. MC's die je op je stage hebt gemaakt, en dus niet via AS, staan op een depth die niet verwijderd kan worden. Vandaar de swapdepths. getNextHighestDepth() geeft het getal van de eerstvolgende hoogste depth. Daar gaan we heb dus heen verplaatsen en direct daarna verwijderen.

[TUT] Sneeuw met AS

Sneeuw in Flash ActionScript


In deze tuturial ga ik je leren hoe je een effect kan bereiken van vallende sneeuw. Je zou dit natuurlijk met allemaal tweens een voorgedefineerde movieclips kunnen doen, maar buiten dat dit veel meer tijd kost geeft het niet zo'n goed effect.



Een voorbeeldje van wat je kan maken aan de hand van deze tutorial:





Welke onderdelen van ActionScript zullen aan bod komen.

  • Natuurlijk Math.random() om random waardes te kiezen

  • De _width en _height properties van MovieClips

  • Variabelen gebruiken om beweging te creeren.

  • Attachmovie

  • Stage.width en Stage.height


Wat heb je nodig op je stage? Nou, eigenlijk, helemaal niets..... Het eninge waaruit dit effect gaat bestaan is een movieclip in je library, en voor de rest zal je script het werk doen!



Dus, laten we er eerst voor zorgen dat deze movieclip in de library komt. Om in je Library te komen kies je in je menubalk voor Window --> Library (of met de sneltoetsen ctrl+l).
Voeg hier een nieuwe movieclip toe met de 'Add Symbol' Knop. Hierna komt een scherm omhoog, je kies bij type voor 'MovieClip'.

Wanneer je voor 'OK' hebt gekozen kom je meteen in de timeline van dit object terecht. Hier teken je een rondje, of hoe je het uiterlijk van een sneeuwvlokje ook maar wilt hebben. Zorg ervoor dat je registration point linksboven blijft.

Waneer je dit gedaan hebt moet je er voor zorgen dat AS kan herkennen wat je object is. Hiervoor geef je hem een linkage. Dit doe je door in je Library met je rechtermuisknop te klikken op linkage. Hier vink je de optie 'Export voor ActionScript' aan en vult bij 'Identefier' in: rondje (zie bijgevoegde afbeelding)



Nou gaan we verder met het script. Om te beginnen moet je altijd goed nadenken wat je nou eigenlijk precies wilt. Dit is in dit geval niet "Ik wil sneeuw maken". Je moet jezelf afvragen HOE je het gaat doen. Een beter idee is dus bijvoorbeeld: "Ik wil sneeuwvlakjes random op het scherm laten verschijnen met een random grootte, snelheid, positie en richting". Hierbij heb je al een antal elementen genoemd die je wil gebruiken om je effect te bereiken.



Hoe gaan we dit script opbouwen?

We willen elk frame een sneeuwvlokje toevoegen, en deze random waardes meegeven. We gebruiken dus een onEnterFrame. In deze onEnterFrame laten we eerst de MovieClip uit de Library halen en op de stage zetten:

var i:Number = 0;

var nieuweSneeuw:MovieClip

this.onEnterFrame = function() {

i++;

nieuweSneeuw = this.attachMovie("rondje", "rondje"+i, i);

};


De variabele 'i' word elke keer met 1 opgehoogd. Deze houd dus bij hoeveel sneeuwvlokjes er zijn, maar bepaald hierbij ook de depth en de instancename van het nieuwe sneeuwvlokje.



Als het goed is zie je nu in je linkerbovenhoek een sneeuwvlokje verschijnen. Ze krijgen allemaal de positie (0,0) mee, en er staan er dus wel meer, je ziet er alleen maar 1. Bij het aanmaken wil je ze dus een random _x waarde meegeven. Even een korte uitleg over het gebruik van Math.random() in Flash:

Math.random() geeft een random waarde tussen 0 en 1. Aan een getal tussen 0 en 1 hebben wij vrij weinig, onze stage is immers wel grooter dan 1 pixel. Hiervoor kan je deze waarde keer de maximum waarde doen. B.v.: Een random waarde tussen 0 en 5:

trace(Math.random()*5);

Om dit verhaal toe te passen: wij willen een random waarde van 0 tot de breedte van de Stage. De breedte van de Stage kan je opvragen met:

Stage.width

Na het attachen van het nieuwe vlokje geven wij hem dus een random _x waarde:

var i:Number = 0;

var nieuweSneeuw:MovieClip

this.onEnterFrame = function() {

i++;

nieuweSneeuw = this.attachMovie("rondje", "rondje"+i, i);

nieuweSneeuw._x = Math.random()*Stage.width-12;

};


Wanneer je dit test zul je zien dat er bovenaan allemaal Sneeuwvlokjes worden neergezet, maar: er zit nog geen beweging in!
We laten dus ook een random snelheid, en een random breedte meegeven, en maken zijn eigen onEnterFrame voor de beweging:

var i:Number = 0;

var nieuweSneeuw:MovieClip

this.onEnterFrame = function() {

i++;

nieuweSneeuw = this.attachMovie("rondje", "rondje"+i, i);

nieuweSneeuw._x = Math.random()*Stage.width-12;

nieuweSneeuw.xSpeed = (Math.random()*12)-6;

nieuweSneeuw.ySpeed = (Math.random()*4)+3;

nieuweSneeuw._width = nieuweSneeuw._height=(Math.random()*5)+5;

nieuweSneeuw.onEnterFrame = function() {

this._x += this.xSpeed;

this._y += this.ySpeed;

};

};


En zoals je ziet: "It's Alive!". Dan om de puntjes nog op de i te zetten: het leuke van sneeuw is dat het op de grond blijft liggen... Maar dat doet het nog niet! Met een simpel if-statementje zorgen we ervoor dat de onEnterFrame van het sneeuwvlokje ophoud zodra hij beneden is:

var i:Number = 0;

var nieuweSneeuw:MovieClip

this.onEnterFrame = function() {

i++;

nieuweSneeuw = this.attachMovie("rondje", "rondje"+i, i);

nieuweSneeuw._x = Math.random()*Stage.width-12;

nieuweSneeuw.xSpeed = (Math.random()*12)-6;

nieuweSneeuw.ySpeed = (Math.random()*4)+3;

nieuweSneeuw._width = nieuweSneeuw._height = (Math.random()*5)+5;

nieuweSneeuw.onEnterFrame = function() {

this._x += this.xSpeed;

this._y += this.ySpeed;

if (this._y>=400-this._height) {

this._y = 400-this._height;

delete this.onEnterFrame;

}

};

};

[TUT] Analoge Klok

De Analoge Klok in AS


In deze tutorial ga ik je leren om een Analoge Klok te maken met behulp van actionscript. Welke onderdelen zal je hierdoor leren:

  • Het opvragen van de datum in AS
  • Uren, seconden en minuten opvragen uit de datum
  • Het gebruik van _rotation
  • Het defineren van de x en y positie van je MovieClip's
  • Scripten op je frame, in plaats van op je MovieClip's

Een voorbeeldje van wat je kan maken:



Om te beginnen met het maken van een script raad ik je aan eerst goed na te denken wat je precies wilt. In dit geval is dat dus niet:"Ik wil een klok maken", maar meer 'technisch' denken. Bijvoorbeeld: "Ik wil de rotatie van de wijzers laten afhangen van de tijd". Nu je dit in je hoofd hebt heb je een beter beeld van wat je precies wilt gaan doen.

Eerst maken we de onderdelen van de klok:

  • Secondenwijzer
  • Minutenwijzer
  • Urenwijzer


Dit is (grafisch) het enige wat we nodig hebben. De rest gaat allemaal gebeuren door het script wat we nu gaan maken. Dit gaan we wijzer voor wijzer maken. Laten we beginnen met de secondenwijzer:

Maak een nieuwe Symbol door Ctrl+f8 te drukken. Je kiest dan voor 'MovieClip'. De naam maakt in principe niet uit, maar geef hem voor de goede orde de naam 'secondenwijzer'.
Nadat je dit gedaan hebt zit op de stage van deze MC(=MovieClip). Hier kan je je wijzer gaan tekenen. In het midden van je Stage zie je een kruisje, dit heet je registration point, oftewel: dit is het 'midden' van je MC. Dit punt gebruikt ActionScript ook als middelpunt voor de rotatie, dus is het belangrijk dat je met dit punt werkt.
Trek een lijn van 1 pixel dikte vanuit het registration point loodrecht naar boven. Om loodrecht te tekenen kan je de shift toets ingedrukt houden. Als het goed is is dit ongeveer het resultaat:



Klik nu boven op 'Scene 1'om terug te gaan naar je main timeline. Je hebt nu de seconden wijzer gemaakt! Maar waar staat hij nu? Hij staat nu in je Library(ctrl+l). Zet hem nu in je stage door het uit je library te slepen naar je stage. Nu staat hij in je stage maar je moet er wel voor zorgen de Actionscript hem kan beinvloeden, en dus moet weten hoe de wijzer 'heet'. De naam die actionscript gebruikt heet de 'instance name', en die kan je definieren door hem in te vullen bij properties-->instance name (let op: je moet je MC wel eerst aanklikken, want onthoud altijd: computers kunnen zelf niet denken).Geef je secondenwijzer de instancename 'secWijzer'.



Herhaal deze stappen voor je urenwijzer en je minutenwijzer en vergeet niet:

  • Je urenwijzer is korter dan je minutenwijzer, en je secondenwijzer is dunner dan beiden
  • Houd rekening met het registration point
  • Vergeet de instance name niet

    • Secondenwijzer: 'secWijzer'
    • Urenwijzer: 'uurWijzer'
    • Minutenwijzer: 'minWijzer'


Waneer je alle wijzers hebt gemaakt, en instancename hebt gegeven, zorg er dan voor dat ze allemaal op je stage staan(door ze te slepen uit je Library). Je mag ze netjes met registration point bij elkaar zetten, maar dit is nauwkeuriger te doen met ActionScript, dit zullen we dus ook maar doen. Hiermee is het grafische deel over, en kunnen we aan het script beginnen.

Zoals ik al zei is het eerste wat we doen het ordenen van de wijzers. De x positie van een movieclip bepaal je op de volgende manier:



secWijzer._x = Stage.width/2;

secWijzer._y = Stage.height/2;

uurWijzer._x = Stage.width/2;

uurWijzer._y = Stage.height/2;

minWijzer._x = Stage.width/2;

minWijzer._y = Stage.height/2;




Dit script komt op het frame(Klik op je frame in de timeline en schuif onderaan het 'actions' menu open. Hier komt het totale script te staan.

Als je nu je movie test(ctrl+enter), zul je zien dat ze allemaal netjes bij elkaar staan, en dat de middelpunten ook het middelpunt van je movie is. Dit komt door de Stage.height/2 en Stage.width/2.

Nu we dit hebben kunnen we de datum op gaan vragen. Deze datum moeten we 'onleden' in de uren, minuten en seconden. Dit moet niet een keer gechecked worden, maar de hele tijd door omdat de tijd veranderd. We zitten deze code dan in een onEnterFrame. Dat wil zeggen dat hij die code die daar binnen valt, elke keer uitvoerd(bij een framerate van 12 fps dus 12 keer per seconde)



this.onEnterFrame = function(){

var datum:Date = new Date();

var uren:Number = datum.getHours();

var minuten:Number = datum.getMinutes();

var seconden:Number = datum.getSeconds();

}



Als laatste moeten we dan de wijzers laten reageren op de tijd. Door middel van _rotation kan je de rotatie van een object bepalen. Dit gaat in graden. Hoe rekenenen we dan bijvoorbeeld de rotatie uit van de secondenwijzer? Eerst ga je na op een hoeveelste deel het zit ten opzichte van de minuut. Door het aantal seconden te delen door 60, en dat keer 360 te doen weet je hoeveel hij moet draaien. Bijvoorbeeld het aantal seconden zijn 30, je zit dus op een halve minuut, en de wijzer zou dus 180 graden moeten draaien. 30/60 = 0,5. 0,5 * 360 = 180. Dat klopt dus. Je script komt er dan als volgend uit te zien:



secWijzer._x = Stage.width/2;

secWijzer._y = Stage.height/2;

uurWijzer._x = Stage.width/2;

uurWijzer._y = Stage.height/2;

minWijzer._x = Stage.width/2;

minWijzer._y = Stage.height/2;

this.onEnterFrame = function() {

var datum:Date = new Date();

var uren:Number = datum.getHours();

var minuten:Number = datum.getMinutes();

var seconden:Number = datum.getSeconds();

secWijzer._rotation = (seconden/60)*360;

minWijzer._rotation = (minuten/60)*360;

uurWijzer._rotation = (uren/12)*360;

};




Als je je movie nu test zal hij het doen. Waneer hij het niet doet, of om het nog een keer door te kijken heb ik het .fla en .swf bestandje bijgevoegd. Ik hoop dat je alles begrijpt.