Husk at du kan finde en gennemgang af de brugte termer og begreber i "Introduktion til Math. i Flash"
Pre Script.
I sidste del af ”Den Trillende Kugle” så vi på hvordan vi fik sat vores miljø op, så kuglen blev påvirket af tyngdekraft og hvordan vi definerede hvor langt kuglen kunne falde, før den skulle stoppe. Netop dette ”stop” af kuglen virker fortsat meget hårdt og unaturligt.
Introduktion:
I denne part af ”Den Trillende Kugle” skal vi se på hvordan vi kan tilføre endnu nogle fysiske omstændigheder for vores miljø, der kan få kuglen til at arte sig mere naturligt, når den f.eks. rammer ”jorden” eller et andet område vi definere. Vi skal se lidt på hvordan vi kan vende en velocitet, fra at gå én retning, til pludseligt at skulle gå en anden. Samt videre skal vi se på, hvilke effekter det bør have for en retningsbestemmelse, når den pludseligt skifter retning.
Teorien:
Vi har i vores to dimensionelle miljø brug for at kunne vende en vektor på enten x eller y aksen, til at være en vektor i modsat retning. Samtidig ønsker vi at den givne vektor i modsatte retning skal kunne påvirkes til f.eks. at være længere eller kortere i forhold til de regler vi sætter op. Overført til vores miljø ønsker vi at kunne ændre boldes retningsbestemte hastighed i én retning, til en anden. Samtidig ønsker vi at kunne ændre i den nye hastighed ud fra nogle opsatte regler. Det kunne være et energitab som en hoppebold rammer jorden og mister noget velocitet, eller det kunne være en energiforøgelse, som når en tennisbold rammes af en tennisketsjer og ændre sin fart og retning.
Men lad os hellere se på hvordan vi får det udført i praksis.
Eksemplet:
Vi arbejder videre på koden fra ”Den Trillende Kugle Part 2”..
Du kan hente start fla filen her
Får lige at komme helt ned på jorden efter den teoretiske snak, så kan vi sige at vi konkret gerne vil kunne ændre f.eks. boldens hastighed på 3 PPF på y aksen til modsat – 3 PPF på y aksen. Når vi skal vende et tal, som vi har brug for det i vores eksempel, så er vi så heldige at vi kan benytte os at den matematiske faktor at et hvilket som helst tal, ganget med – 1 altid giver det samme tal, blot med modsat fortegn. Ahha, det vil sige at vi kan bede flash om at gange vores velocitet for bolden på y aksen med -1 når den rammer vores opsatte ramme for hvor bolden må falde, og så skulle bolden begynde at gå den anden vej på y aksen??

- lad os lige prøve det af med det samme og se om det virker.
Inde i vores ”flytBold” funktion, og videre inde i den betingelse hvor vi tester for om bolden ”rammer” scenens nederste kant, tilføjer vi en linie mere:
1 |
vy *= -1; |
Når vi bruger *= operatoren er det, det samme som at sige ”værdien til venstre er lig med sig selv ganget med værdien til højre.” Det vil sige vi kunne også have skrevet det sådan her:
vy = vy * -1;
- Det havde været præcist det samme.
Lad os lige holde her og se på hvad det rent faktisk har gjort ved vores bold eksempel.
Her er den samlede ”flytBold” funktions kode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
function flytBold() { if(Key.isDown(Key.RIGHT)) { vx += ax; } else if(Key.isDown(Key.LEFT)) { vx -= ax; } if(Key.isDown(Key.UP)) { vy -= ay; } else if(Key.isDown(Key.DOWN)) { vy += ay; } //vi lægger vores tyngde til velociteten på på y aksen: vy += boldsTyngde; bold._x += vx; bold._y += vy; if(bold._y > maxFald - halvBold) { bold._y = maxFald - halvBold; boldsTyngde = 0; //vi har tilføjet en linie hvor vi ganger med -1 vy *=-1; } else { boldsTyngde = tyngde; } } |
Link til et fungerende eksempel
Link til den forløbige fla fil
Pre Script:
Som du kan se når du tester, er det nu en mere naturlig måde at bolden arter sig på når den rammer ”jorden”. Men tingene er stadig ikke helt rigtige. Hvis du lægger mærke til det, så fortsætter bolden med at hoppe, og faktisk bliver dens bane længere og længere. Det er jo fordi, som du sikkert husker fra ”Den Trillende Kugle Part 2”, vi lægger tyngde til boldens velocitet når den IKKE rammer jorden, og modsat ”slukker” for tyngdekræften når den rammer jorden. Derfor stiger vores bolds bane lidt hver gang fordi vi et øje blik ikke har tyngde på bolden, og derfor øges dens velocitet. Hvis det lyder teknisk og svært at forstå, så tænkt ikke mere over det, men prøv i stedet et udkommentere den linie hvor der står:
1 |
boldsTyngde = 0; |
til:
//boldsTyngde = 0;
Og test så din film igen. Nu kan du se at boldens bane er konstant, og den hopper ikke længere end den falder fra. – da vores fysiske miljø bliver mere stabilt nu, kan du lade linien stå udkommenteret eller slette den helt. Vi kommer ikke til at bruge den længere.
Teori:
Så langt så godt. Nu har vi en bold der falder, møder en flade, og reagere ved at bounce væk fra den flade igen. Det næste vi skal have tilført vores miljø er et energitab for når bolden rammer denne flade. Her kan vi tale om en form for friction eller bounce faktor. Når en bold rammer noget i vores verden overføres der en mængde energi fra bolden, til det den rammer. Det kan vi simulere ved at oprette en variabel der indeholder vores faktor for denne fysiske omstændighed.
Eksempel:
Øverst i vores kode, hvor vi har placeret de andre variabler vi bruger i vores lille model, kan vi starte med at tilføje en bounce variable.
var bounce:Number = .7;
Jeg bruger 0,7 som min bounce faktor i dette eksempel, men prøv dig frem. En typisk faktor vil ligge mellem 0,5 og 0,9 afhængigt af hvilken type miljø du vil gengive, og hvilken type materiale du vil lade bolden være lavet af… jo højere faktor, jo mindre modstand og/eller jo mere elastisk materiale ser bolden ud til at være lavet af.
Med vores bounce faktor kan vi bevæge os ned i ”flytBold” funktionen igen, og ældre linien:
vy *= - 1;
Til linien:
vy *= - bounce;
På den måde bruger vi altså vores bounce faktor til at vende velociteten, og det vores bounce faktor er mindre end 1, er det energitab vores volocitet vil være udsat for.
Prøv at teste med forskellige bounce værdier, og prøv samtidig at lege med at øge eller mindste tyngdekræften.
Her er den samlede kode:
1 |
/*********************************************************** * Matematisk Mandag |
Link til et fungerende eksempel
Link til den forløbige fla fil
Pre Script:
Nu ligner det da efter hånden noget: Vi kan flytte vores kugle med pilene, og når vi slippe på pil-op, falder vores kugle ned og bouncer naturligt op igen, ud fra den bounce faktor vi har sat. Men vi kan stadig flytte kuglen ud til siderne og op, så den forsvinder væk. – og det kunne da være lidt sejt at lukke kuglen helt inde og tilføre lignende omstændigheder for sider og loft som vi har sat for bunden af scenen.
Teori:
Vi har allerede gjort det for én af kanterne i vores scene, og derfor må vi kunne gøre det samme på de resterende tre, med den eneste ændring at det er på x aksen for to af sidernes vedkommende.
Eksemplet:
Vi opretter først tre nye variabler til at holde de rammer bolden skal holde sig inden for på de givne akser.
1 2 3 |
var minSide:Number = 0; var maxSide:Number = Stage.width; var minFald:Number = 0; |
Variablerne indeholder altså den mindste og den maksimale værdi bolden må bevæge sig ud på i siderne (x aksen), samt værdien bolden ikke må komme ”under”( rent grafisk over, da koordinatsystemet er omvendt i flash se "Introduktion til Math. i Flash") på faldsiden altså y aksen.
Det var alt hvad vi skulle bruge af variabler, og vi har allerede én gang udregnet vores bolds størrelse.
se mere omkring udregning af om et objekt er inden for en given ramme, med sit registreringspunkt og videre hvordan en beregning kan rinde sted i De trillende kugle part 2
Vi kan med det samme gå ned i vorse ”flytBold” funktion til det sted hvor vi tester for om vores bold rammer nederste kant.
Her kan vi ændre den allerede eksisterende ”else” sætning til ”else if”. Som tidligere nævnt behøver vi ikke længere arbejde med en relativ tyngde, så vi kan slette den linie kode der var i den gamle ”else” sætning, så den nye samlede betingelse ser sådan her ud:
1 2 3 4 5 6 7 8 9 10 11 |
if(bold._y > maxFald - halvBold) { bold._y = maxFald - halvBold; //vi har tilføjet en linie hvor vi ganger med bounce faktoren vy *=-bounce; } else if(bold._y < minFald + halvBold) { bold._y = minFald + halvBold; vy *= - bounce; } |
Som du kan se, tester vi altså nu først for om bolden overskrider vores maxFald, og ellers tester vi videre for om bolden skulle være ved at overskride vores minFald værdi.
Læg mærke til at vi bruger ”halvBold” værdien til henholdsvis at trække fra eller lægge til de to afgrænsende værdier.
se en forkalring på dette i ”Den trillende Kugle part 2”
Det sidste vi mangler at gøre nu er at sætte lignende betingelse op for vores sider.
Da koden er efter helt samme princip som ovenstående vil jeg ikke gennemgå den igen her, men blot vise den samlede betingelse for siderne:
1 2 3 4 5 6 7 8 9 10 |
if(bold._x > maxSide - halvBold) { bold._x = maxSide - halvBold; vx *= - bounce; } else if(bold._x < minSide + halvBold) { bold._x = minSide + halvBold; vx *= - bounce; }; |
Nu er vores lille verden så god som perfekt. Vores bold er ”fanget” i et fysisk miljø, og vi kan ikke flytte bolden uden vor vores scene. Når bolden rammer en given kant reagerer den ved at tage den nuværende fart, tilføje et energitab, og derefter vende retning.
Det eneste der lige bør tilføjes er en lille smule friktion på x aksen. Som det er nu, kan bolde fortsætte med at trille fra kant til kant, længere end naturligt er.
Man kan tale om at friktion altid tilføjes en given bevægelse hvad enten det er på x eller y aksen. I vores tilfælde har vi bog allerede tyngde der sørger for at vores bold taber velocitet i opadgående retning på y aksen, så vi kan nøjes med at tilføje friktion på velociteten på x aksen.
Jeg har oprettet en variabel kaldet friktion, og sat værdien til 0,99. Men som med de andre tal er dette igen noget du bør lege lidt rundt med, og se på hvordan bedst udtrykker det miljø du vil skabe.
1 |
var friktion:Number = .99; |
Det sidste jeg har gjort er at føje friktion til min vx variablen lige som jeg allerede gør med tyngde på vy inden vy lægges til boldens y egenskab. – den eneste forskel er at jeg gange friktionen end på vx hvor jeg lagde tyngden til vy. Det er fordi friktion ikke er bestemt til én retning, lige som tyngde er.
1 |
vx *= friktion; |
Den samlede kode kommer til at se sådan her ud:
1 |
/*********************************************************** * Matematisk Mandag |
Link til et fungerende eksempel
Den var en lang omgang, håber stadig du er med.
Nu har du lært en masse om at tilføre fysiske love og strukturer til dine flash-miljøer. – og jeg kan kun opfordre dig til at lege rundt med værdierne, og se hvordan de påvirker hinanden.
I næste uge skal vi se på hvordan vi kan arbejde med dynamisk velocitet i forhold til at kunne påvirke boldens hastighed med musen. Det bliver også sidste part af serien om ”Den Trillende Kugle” og samtidig også 2. sidste i Basic delen af Matematisk Mandag.
Du er også meget velkommen til at poste dine egen forsøg, du har lavet på basis af denne tutorial i samme tråd.
1 kommentar
vi bog allerede tyngde der sørger for at vores bold taber velocitet
der er en fejl lige før vi har andgivet
var friktion:Number = .99;
ellers god tut
sidder og lærer en hel masse her ^^