Eg held for tida på å utvide programmeringshorisonten min, gjennom å utvikle enkle spel i C++ med SDL-biblioteket for grafikk, lyd og innputt. Både C++ og SDL er relativt nytt for meg, men problemet eg no skal spørre om er ikkje spesifikt for nokon av dei.
Situasjonen er å simulere meget enkel fysikk: Eit objekt (til dømes ein sprettball) skal starte i lufta (i ro), falle til bakken grunna tyngdekraft, sprette opp att når det treff bakken, og objektet skal kome seg like høgt som der det starta.
Vi antek null luft (og dermed null luftmostand), uniform tyngdekraft (slik at tyngdeakselerasjonen er konstant) og bevaring av mekanisk energi.
Om eg ikkje har gløymt noko så skal desse forenklingane tilseie at ei minimal (enkel) simulering kan sjå slik ut, merk at koda er forkorta og ufullstendig:
Denne koda fungerer greit, men gir unøyaktig rørsle, dvs. objekta sprett ikkje alltid like høgt som der dei starta. Det ser ut til å avhenge av blant anna FPS og GRAVITY_CONSTANT. Men, eg har klart å fikse dette ved å innføre kinetisk energi og potensiell energi, og stadig korrigere farta ved å løyse E = Ek + Ep = 0.5mv^2 + mgh for v (til dømes kvart tiande tick).
Kva er det som gjer at spretthøgda varierer såpass mykje når eg bruker den enklaste tilnærminga? Er det fordi formlane berre er gyldige når dt går mot 0, er det fordi bruken av double gir unøyaktigheit eller er det fordi framgangsmåten er for enkel eller evt. feil?
Merk at dette gjerast for undervisninga sin del, så det er derfor eg ønsker diskusjon om ulike feilkjelder ved slik kode.
Her er ein video av simuleringa med 100fps:
http://videobam.com/CNnsW
Merk at andre verdiar for fps og GRAVITY_CONSTANT kan gi betre resultat, dvs. høgare spretting
Her er fullstendig kjeldekode om nokon vil sjå alt:
http://s000.tinyupload.com/index.php...67376797391158
Merk at den ikkje kan kompilerast utan SDL og ei Windows-maskin (har nytta windows.h til tidsfunksjonalitet).
Situasjonen er å simulere meget enkel fysikk: Eit objekt (til dømes ein sprettball) skal starte i lufta (i ro), falle til bakken grunna tyngdekraft, sprette opp att når det treff bakken, og objektet skal kome seg like høgt som der det starta.
Vi antek null luft (og dermed null luftmostand), uniform tyngdekraft (slik at tyngdeakselerasjonen er konstant) og bevaring av mekanisk energi.
Om eg ikkje har gløymt noko så skal desse forenklingane tilseie at ei minimal (enkel) simulering kan sjå slik ut, merk at koda er forkorta og ufullstendig:
Kode
// Forenkla kode - GetTime gir noverande tid i millisekund const double TIME_STEP = 10; // 10 ms tidsintervall gir 100 fps; const double GRAVITY_CONSTANT = 0.002; double t_last = GetTime() // Game loop bool running = true; while (running) { double dt = GetTime() - t_last; tick(dt); t_last = GetTime(); // + Noko kode for å rendre fysiske objekt til skjerm SDL_Delay(TIME_STEP); } void tick(double dt) { // For alle fysiske objekt for (auto* ent : m_entities) { // Akselerasjon grunna tyngdekraft ent.speedY = ent.speedY + GRAVITY_CONSTANT * dt; // Endring av posisjon ent.y = ent.y + ent.speedY * dt; // Sjekkar om objektet har byrja å gå ut av skjermen if ( collision() ) { // Snur fartsretninga, vi bryr oss ikkje om at objektet er litt under golvet ent.speedY = ent.speedY * (-1); } } }
Kva er det som gjer at spretthøgda varierer såpass mykje når eg bruker den enklaste tilnærminga? Er det fordi formlane berre er gyldige når dt går mot 0, er det fordi bruken av double gir unøyaktigheit eller er det fordi framgangsmåten er for enkel eller evt. feil?
Merk at dette gjerast for undervisninga sin del, så det er derfor eg ønsker diskusjon om ulike feilkjelder ved slik kode.
Her er ein video av simuleringa med 100fps:
http://videobam.com/CNnsW
Merk at andre verdiar for fps og GRAVITY_CONSTANT kan gi betre resultat, dvs. høgare spretting
Her er fullstendig kjeldekode om nokon vil sjå alt:
http://s000.tinyupload.com/index.php...67376797391158
Merk at den ikkje kan kompilerast utan SDL og ei Windows-maskin (har nytta windows.h til tidsfunksjonalitet).