18. juni 2001 - 14:07Der er
28 kommentarer og 1 løsning
Matematik og Lingo....
Vi er i øjeblikket i gang med et projekt, hvor vi skal lave et spil. I vores spil har vi en vej, der kører skråt nedad mod højre over skærmen. Vha. cosinus, sinus, tangens og to punkter på en parallelt liggende linie skal vi kunne beregne vejens vinkel og dermed få den til at flytte sig. Men vi rammer ikke plet. Vi er rimelig sikre på at det er fordi at på enhedscirklen regnes graden som fra x-aksen og mod uret, mens i Director regnes graden som fra x-aksen og med uret, da +y er nedad... og dermed skal udregningen af vejens hældning (ca. 26 grader) nok gøres lidt anderledes. Vi har haft en lærer til at kigge på det, men han måtte give op. hent det nødvendige her: http://www.mediestud.dk/ADMIN/rune/projekt2/movescript.zip På forhånd 10000000000000 tak for hjælpen!!! PS. Vi har travlt da vi skal aflevere på torsdag...(o; MVH Rune
Er det Jeres hensigt at sprites for cyklisten, vejen, huset alle skal kunne bevæge sig samtidigt med at fks cyklisten kan have en sidelængs hastighed uafhængig af vejens mens han bliver på vejen?
Det er vores hensigt at vej, hus, div. forhindringer med mere skal bruge funktionen med samme hastighed og retning og dermed køre ned ad skærmen. Cyklisten skal følge en lille prik som styres af piltasterne. Denne prik sættes til kun at virke så længe den intersecter med vejen (dette er ikke lavet endnu, men bliver jo ikke noget problem). Så når spillet kører ser det ud som om at cyklisten kører ad vejen. Ved venstrepil bevæger den sig fremad og dermed simulerer at farten sættes op og ved højre pil simulerer at farten sættes ned. Men dette kan du vist se i .dir-filen. Det egentlige spørgsmål er jo formlen for udregning af graden...
Afvigelsen skyldes noget jeg kender som \"iteration error\" eller \"truncation error\"
Lad mig forklare....
Jeres Behavior script virken er baseret på mange små ryk af Sprite.Loc
Når udregningerne fks . giver nyXplacering = 4.3 og man sætter LocH = nyXPlacering vil den faktisk flytte sig til LocH = 4. Næste ryk bliver LocH = 8, 12, 16 osv. ikke 8.6, 12.9, 17.2
Det virker måske for småt til at have nogen inflydelse men ryk nummer 100 afviger med 100 x 0.3 = 30 pixels!
Det samme gælder LocV
Løsningen er heldigvis simpel!
Tilføj blot en ekstra property i Jeres behaviorScripts som holder styr på den samlede \"fart\":
on beginsprite me set startloch to 100 set startlocv to 350 set mig to the spritenum of me set the loch of sprite mig to startloch set the locv of sprite mig to startlocv set fart to 10 --init set afstand = 0 set retning to \"tilbage\" end
on exitframe me --hold styr på samlet fart = afstand set afstand = afstand + fart set posv to the locv of sprite mig set posh to the loch of sprite mig if the loch of sprite mig > 800 then set the loch of sprite mig to startloch set the locv of sprite mig to startlocv else --bemærk fart erstattes med afstand her set the loch of sprite mig to nyxplacering(posh,afstand,retning)
set the locv of sprite mig to nyyplacering(posv,afstand,retning)
end if end
--------------end vejscript
Den samme script ændring bruges til husene, forhindringer etc. Jeg har testet og verificeret at scriptet virker fint med denne modifikation, og vejen \"hopper\" heller ikke længere når den looper.
øh... når jeg foretager ændringerne og den kalkulerer med afstand øges hastigheden med 10 pr. frame, hvilket jo skyldes at afstand tillægges farten hver frame. Altså: vejen kører hurtigere og hurtigere... Kan ikke helt forstå du kan få det til at virke!?!? (o;
Jeg kunne ikke undgå at bemærke at du i dine udregninger konverterer fra radians til degrees. Dette er ikke nødvendigt og komplicerer blot formlerne og hugger processortid.
Det ville også hjælpe hvis I opdelte vej-bitmappen i nogle mindre stykker som så skulle sammensættes via Lingo sådan at de sprites som flyttes rundt aldrig bliver større end hvad der er synligt på stage. Men jeg forstår at I er under tidspress og dette hører jo til finesser.
Ja, jeg havde vist også korrigeret koordinaterne, samt brugt radians i dine nyxPlacering(), nyyPlacering.
Her er de så...
----------------------------------- on preparemovie -- koordinatsættene (xa,ya) og (xb,yb) er to punkter liggende på en linie -- parallel med vejenon preparemovie set xa to 426.0 --disse to punkter ligger på en linie parallel med vejen set ya to 2.0 set xb to 1690.0 set yb to 614.0 --set xa to 122.0 --disse to punkter er noget vi har sjusset os frem til for at få --set ya to 68.0 -- vejen til at køre nogenlunde rigtigt... --set xb to 740.0 --men det ville være rart at få funktionen til at virke korrekt --set yb to 377.0 global vinkel set vinkel to atan(1.000*(yb-ya)/(xb-xa)) put \"vinkel:\"vinkel end
on NyXPlacering(glx,hast,retning) global vinkel if retning = \"tilbage\" then set grad to vinkel else if retning = \"ned\" then set grad to (vinkel+ pi/2) else if retning = \"frem\" then set grad to (vinkel+ pi) else if retning = \"op\" then set grad to (vinkel+pi*3/2) end if end if end if end if set nyx to ( glx + hast*cos(grad)) return nyx end
on NyYplacering(gly,hast,retning) global vinkel if retning = \"tilbage\" then set grad to vinkel else if retning = \"ned\" then set grad to (vinkel+ pi/2) else if retning = \"frem\" then set grad to (vinkel+ pi) else if retning = \"op\" then set grad to (vinkel+pi*3/2) end if end if end if end if set nyy to ( gly + hast * sin(grad)) return nyy end
---------------end movieScript-------------
vej behavioren som jeg gav dig var en forkert udgave..
on beginsprite me set startloch to 100 set startlocv to 350 set mig to the spritenum of me set the loch of sprite mig to startloch set the locv of sprite mig to startlocv set fart to 10 --init set afstand = 0 set retning to \"tilbage\" end
on exitframe me --hold styr på samlet fart = afstand set afstand = afstand + fart set posv to startlocv set posh to startloch if the loch of sprite mig > 800 then set afstand = 0 set the loc of sprite mig to point(startloch,startlocv) else --bemærk fart erstattes med afstand her set the loch of sprite mig to nyxplacering(posh,afstand,retning)
set the locv of sprite mig to nyyplacering(posv,afstand,retning)
end if end
-------------end vejBehavior---------------
som du ser har den altid det samme udgangspunkt point(startLocH,(startLocV) til udregningerne. Derfor bliver den ikke hurtigere og hurtigere når vi sætter
afstand = afstand + fart
Tænk på formlen som
afstand = aftand + fart * tid
hvor tid = 1,2,3,4,... for hver gang den kommer ind i exitFrame handleren
Hvis du stadig har dine tvivl om rigtigheden i dette, sender jeg gerne .dir filen til dig.
Send en email til geo@lingoman.dk så vedhæfter jeg filen.
mmm.. fedt nok. Jeg tror bare lige jeg skal have kigget på udregningen af grad alt efter retningen, da min vej ved \"tilbage\" i stedet kører \"ned\".... Men nu har jeg siddet og tænkt lingo i 10 timer og vil nu smutte hjem, slappe af og møde frisk op i morgen til endnu en Lingo-dag. (o;
\"frem\", \"tilbage\", \"op\" og \"ned\" er relative begreb. Det er kun et spørgsmål om at vælge hvad der skal være referance systemet: Cyklisten, Stage, vejen ? etc.
Hvis vi vælger at bruge Stage som vores reference og tildeler en fart = cyklistFart > 0 til cyklisten, følger kameraet (stage) cyklisten med fart = fart. Derfor skal vejen altså bevæge sig med relative fart = vejFart = -cyklistFart. Altså SKAL vejen altså gå \"Tilbage\" hvis vi vil opretholde illusionen at cyklisten bevæger sig \"Frem\".
Godmorgen!!! Vi er ikke helt med på hvad der sker. Hvorfor er \"tilbage\" lige pludselig ikke \"tilbage\" længere? (Ja, vi burde jo nok have fulgt bedre med i matematikundervisningen...) (o;
Jeg har checked jeres fil og fundet forskellende så I kan arbejde videre på jeres egen version. Men sig mig nu for engangs skyld, virker den sendte fil så?
Grunden til at jeres version opfører sig som den gør er fordi:
punkt 1). on preparemovie er kopieret lidt forkert!
der skal stå
set vinkel to atan(1.000*(yb-ya)/(xb-xa))
og ikke
set vinkel to atan(1000*(yb-ya)/(xb-xa))
punkt2.) I har brugt vej-behavioren fra ( Svar fra lingoman 18/06 2001 17:36:07 ) i stedet for ( Kommentar fra lingoman 18/06 2001 18:52:12 )
øh???!? Der plejer da at være en mulighed for at acceptere svaret nederst i dokumentet!?! Det er der ikke. Ja, jeg er logget ind... - - - Prøv lige at oprette et nyt svar! (o;
tjaaa.. de sidste to fra dig er kommentarer, ikke svar... jeg kig ind forbi ind i mellem... --- du kan evt. kigge forbi http://www.eksperten.dk/spm/82861
mmm. stadig intet... Derudover: Vi sidder her og kæmper med et projekt, der skal afleveres torsdag. -og hvor er vores lærere? De holder fri. (o; Så Geo: Du er gud! Jeg skulle for øvrigt sende knus og kys fra de tre piger i vores gruppe. Fra mig må du nøjes med taknemlighed og point! (o;
Colaen flyder.... Jeg købte 12x1,5 L ca. da vi startede på projektet. Fortryder jeg ikke købte lidt flere.. (o; Har du egentlig en hjemmeside? Det kunne da være sjovt at se hvem man har fået hjælp af... www.lingoman.dk viser jo intet...
det hjalp.. endnu engang: TAK FOR HJÆLPEN... slåsser desværre stadig med det andet spørgsmål.. husene bevægede sig på et tidspunkt, men pludselig gider de ikke længere.. har jeg ikke fundet ud af noget inden kl. 17 oploader jeg min opdaterede fil og giver besked om det på spørgsmålet...
Du kan også skive direkte til mig hvis der er mere jeg kan hjælpe med.
mvh Geo
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.