Husk at du kan finde en gennemgang af de brugte termer og begreber i "Introduktion til Math i Flash".
PreScript
I del 1 af ”Den Trillende Kugle” så vi lidt på hvordan vi kunne bruge acceleration til at gøre længden på en vector kortere eller længere; omformuleret til praktisk tale, gjorde vi velociteten på vores objekts x og y akser større eller mindre.
Introduktion
I denne tutorial skal vi se på hvordan vi kan tilføje endnu en fysisk lov til vores lille miljø, hvor vores kugle befinder sig. Den lov vi skal se på i dag er tyngdeloven. Samtidig skal vi se lidt på hvordan vi definere nogle lidt klarere rammer for det miljø kuglen befinder sig i. I overført betydning er det ment i forhold til hvad der skal ske hvis kuglen rammer eller kommer uden for scenens kanter.
Teori:
Tyngde loven kan opfattes som en konstant acceleration tillagt vores vertikale vector. Det vil med andre og sige at det er en fast værdi der lægges til vores bevægelser på y aksen hvis man kan tale om at vi mennesker har sådan en. I hvert fald er det y aksen det gælder når vi ser på hvordan tyngde bør spille ind i vores lille flash miljø. Her kan vi sige at tyngdeloven er en fast værdi der hele tiden lægges til et objekts bevægelse på y aksen og derfor vil drive det i en nedad gående retning, det det rammer ”jorden”.
Vi må hellere hoppe ned og se på hvordan det rent faktisk kan implementeres.

Figur 1
Eksemplet.
Faktisk er det ikke ret meget vi skal tilføje til vores kode fra sidst for at få vores bold til at agere efter at der er en tyngdelov i vores miljø. Det vigtigste er at vi forholder os til hvilken konsekvens det før for vores bold. F.eks. skal vi overveje ikke at gøre vores tyngdelov for kraftig, da vi da ikke længere vil være i stand til at bevæge bolden fremad hvis vi fortsat har en accelerations factor på 0.5. I vores eksempel sætter jeg tyngden til 0.3 så det stadig er muligt at flytte bolden op ad på y aksen med piletasterne. Hvis vi sætter en tyngde der er højere end vores accelerations mulighed, er vi kun i stand til at nedbremse tyngdekræften, men ikke at modarbejde den. – dette kunne f.eks. være brugbart i et game-play for forskellige typer af spil.
Koden er fortsat fra ”Den Trillende Kugle Part 1”.
Her kan du hente start filen
Vi starter med vores tyngde variabel.
var tyngde:Number = .3;
Det er næste vi skal gøre er at sikre os at denne nye tyngde bliver lagt til vores objekts velocitet på y aksen hver gang vi udregner objektets forhold. Disse forhold udregner vi i vores i ”flytBold” funktion, og vi kan her tilføje denne linie lige inden vores vx og vy bliver tilføjet vores objekt:
vy += tyngde;
I vores virkelige verden giver det ikke helt mening at tale om at tyngden lægges til vores fart, men som du sikkert husker fra "Introduktion til Math i Flash" så er koordinatsystemet omvendt i Flash, hvilket betyder at jo større vores y værdi bliver jo længere nedad bevæger vores objekt sig.
Det er faktisk alt hvad der skal til for at tilføje tyngdelov til vores miljø.
Den samlede kode ser sådan her ud:
1 |
/*********************************************************** * Matematisk Mandag |
Her kan du se et fungerende eksempel. Du skal muligvis klikke på bolden før den reagere på piletasterne.
Her kan du hente den passende fla fil
Pre Script
Som du kan se, så skal man skynde sig at presse pil op i bund for ikke at bolden skal forsvinde ud af billedet. Det skal vi selvfølgelig have gjort noget ved. Så bolden ikke kan falde længere ned end nederst i vores scene.
Introduktion
Derfor skal vi have udarbejdet en beregning for hvornår bolden er uden for vores scenes nederste kant. Som du sikkert allerede ved, så er det registreringspunktet på et objekt der udregnes fra, når man skal bestemme hvor et objekt er. Det vil sige, at vores bold faktisk først, set med Flash’s øjne, er ude for scenen, når den nederste halvdel af bolden er neden for scenes kant. Det er fordi vi har vores registreringspunkt i midten af bolden.

Figur 2
Der hvor den grønne linie skiller, skal altså passeres før vores bold teknisk set er uden for scenen.
Hvis vi blot er beviste om dette er det ikke noget problem, da vi så kan modregne og sige at når bolden er neden for scenens nederste kant minus halvdelen af boldens højde, så skal den stoppe.
Lad os prøve at se hvordan det kommer til at fungere.
Eksemplet:
Det første vi gør, at tilføje endnu en variabel i vores kode. I den gemmer vi vores scenes højde.
var maxFald:Number = Stage.height;
Det næste vi gør er at gemme vores ”bold”’s halve højde i en tilsvarende variabel. På den måde skal vi kun skrive udregningen én gang, og kan herefter bruge værdien en række forskellige steder:
var halvBold:Number = bold._height/2;
Nå vi arbejder med et cirkel formet objekt er vi så heldige at højde og brede er det samme, derfor kan vi i vores tilfælde bruge halvBold alle de steder hvor både den halve højde eller brede skal bruges. I et tilfælde af et irregulært objekt vil du være nød til at gemme den halve højde og den halve brede i hver deres variabel. Men mere om det i næste uge.
Nu kan vi hoppe ned i vores ”flytBold” funktion igen, og lave koden der hindre vores bold i at forsvinde.
Inde i ”flytBold” efter den allerede eksisterende kode, kan vi starte med at skrive en betingelse.
Det vi vil betinge er om boldens y koordinat er større end vores maxFald – boldens halve højde. Det kommer til at se sådan her ud:
1 |
if(bold._y > maxFald – halvBold) { |
Hvis denne betingelse evaluere til sandt, så skal vi have flyttet bolden tilbage til at være inden for scenen. Derfor kan vi skrive følgende inde i betingelsessætningen:
bold._y = maxFald – halvBold;
- vi flytter altså bolden op til at være præcis på den nederste kant i scenen, hvis den bevæger sig uden for.
Den samlede kode ser sådan her du:
1 |
/*********************************************************** * Matematisk Mandag |
Her kan du se et fungerende eksempel. Du skal muligvis klikke på bolden før den reagere på piletasterne
Her kan du hente den passende fla fil
Hvis du tester nu, kan du se at bolden stopper nederst på scenen, og ikke falder uden for. (selvom den i teknisk set et kort øjeblik er uden for kanten, når vi typisk ikke at se det).
Det eneste problem vi har nu, er at vores kode fortsat tillægger tyngde til bolden. Det vil sige at selvom vores bold nu ikke længere rent grafisk flytter sig længere ned, så bliver vi ved med at lægge tyngde til vy som jo bliver højere og højere. Prøv f.eks. at vente et øjeblik, og prøv så at tykke på pil op og se hvor lang tid der gør før bolden begynder at bevæge sig op. Det skyldes at der skal lægges meget acceleration til (eller rettere trækkes fra) før boldens vy igen er mindre end vores scenes nederste kant.
Sådan fungere det jo ikke i vores verden, det bliver jo ikke sværere at hoppe, jo længere tid man venter, siden sidste hop.
Derfor bør det selvfølgelig heller ikke være sådan i vores flash miljø.
Det kan vi komme omkring ved at lave en relativ tyngde til vores bold. Med denne relative tyngde kan vi sørge for kun at lægge tyngde til bolden når den er væk fra ”jorden”. Til det skal vi bruge en ekstra variabel som vi kalder for boldTyngde og den skal til start have samme værdi som den ”normale” tyngde:
var boldTyngde:Number = tyngde;
Så kan vi vende tilbage til vores ”flytBold” funktion. Det første vi gør er at ændre linien:
vy += tyngde;
Til:
vy += boldTyngde;
Det næste vi skal er inde i vores betingelse for om bolden er uden for scenen at have tilføjet en linie. I den linie fortæller vi at, hvis vores bold er uden for scenen, og herefter sat på plads på scenens kant, så skal ”boldsTyngde” være lig med nul. På den måde hindre vi at der lægges yderligere tyngde til bolden, efter den er landet på scenens kant.
boldTyngde = 0;
Det sidste vi skal have gjort er at have sat en forlængelse på vores ”if” betingelse, nemlig en ”else” ”se mere om betingelser i …………….” hvor vi sikre os at hvis bolden IKKE er uden for kanten, så skal ”boldTyngde” igen være lig med den ”normale” tyngde.
1 |
else { |
Nu reagere bolden som den skal når man forsøger at tilføje acceleration til efter den har ramt nederste kant på scenen. Du kan prøve at vente lidt, og så trykke pil op, og du vil se at der nu kun går et kort øjeblik før bolden igen begynder at svæve op.
Leg lidt med tyngdekraften i samspil med accelerationsfaktoren og se hvordan det påvirker miljøet. Overvej følgende, hvis vi skulle simulere en ballon ville vi tale om opdrift, hvordan skulle vi skabe et miljø med både opdrift, og tyndekraft?
Den samlede kode ser sådan her ud:
1 |
/*********************************************************** * Matematisk Mandag |
Her kan du se et fungerende eksempel. Du skal muligvis klikke på bolden før den reagere på piletasterne
Her kan du hente den færdige fla fil
Det var en hel masse om tyngde og en begyndelse på noget omkring boundery detection, altså måling på om et objekt holder sig inden for nogle givne rammer.
Som du sikkert har bemærket er der ikke meget naturligt over bolden når den rammer scenens kant. I næste uge vil vi se på hvordan en hastighed bør reagere på friktion og bounce, og på hvordan vi kan vende en velocitet til den modsatte retning, når vores bold støder ind i noget.