Iltaa.
Elikkä nyt olis painovoima-ongelma, oon kyllä hakenu tältä sivulta ja vielä googlella, mutta ei vain oikeen avaudu tää homma. :/
Tuossa koodini (BlitzMaxia, mutta logiikkahan on sama kuin muissakin kielissä):
Const PAINOVOIMA = -1 Type TPelihahmo Field X#,Y# Field pisteet Field koko Method PiirraMut() DrawRect X,Y,koko,koko 'hahmo DrawLine 0,491,680,491 'maa End Method Method Hallinta() Global nopeusY# = 0 Local ilmassa = False If KeyDown(KEY_RIGHT) X = X + 5 If KeyDown(KEY_LEFT) X = X - 5 Y = Y + nopeusY If Y < 200 Then nopeusY = 0 If Y < 441 Y = Y - PAINOVOIMA If KeyHit(KEY_SPACE) nopeusY = -3 EndIf End Method End Type pelihahmo:TPelihahmo = New TPelihahmo pelihahmo.X = 250 pelihahmo.Y = 441 pelihahmo.koko = 50 Graphics 680,550 Repeat pelihahmo.PiirraMut() pelihahmo.Hallinta() Flip ; Cls Until KeyHit(KEY_ESCAPE)
Eli pelaaja pitäisi saada hyppäämään sulavasti (tehtynä) ja vielä hidastumaan sulavasti, jonka jälkeen sen pitäisi myös tulla alas suht. nopeaan.
Nyt kaipaisin siis vain teoriaa, miten painovoima kannattaisi ohjelmoida. Oon kyllä kattonut kaikki tämän sivuston painovoimaan liittyvät aiheet ja esimerkit, mutta ne eivät anna täydellistä vastausta (tai sitten olen vaan liian tyhmä).
No painovoimahan ihan yleisesti ottaen aiheuttaa kappaleille vakiokiihytyvyyden alaspäin. Eli maapallolla esimerkiksi 9,81m/s2. Eli toisin sanoen jos ilmanvastusta ei huomioida niin pudotessa kappaleen nopeus kasvaa 9,81 m/s:lla joka sekunti. Eli jos päästän irti kappaleesta nyt, niin sekunnin päästä se menee alas nopeudella 9,81m/s, kahden sekunnin päästä nopeudella 19,62m/s jne.
Pelissä on yksinkertaisinta jakaa objektien nopeus koordinaatiston suuntaisiin komponentteihin. Eli 2D-pelissä X-suuntaiseen ja Y-suuntaiseen ja 3D pelissä tulee vielä lisäksi Z. Jos objekti on sitten pudotuksessa, niin lisää (tai vähentää, riippuen koordinaatiston suunnasta) vaan sen haluamansa painovoiman verran. Jos hahmoa päivitetään esim. 50 kertaa sekunnissa ja painovoima olisi pelissä 10 yksikköä / s, niin silloin jokaisella päivityskerralla kasvatettaisiin Y-suuntaista vauhtia 0,2 yksiköllä.
Ja nopeuden perusteella sitten lasketaan objektin paikka. Eli jos X-suuntainen vauhti jollakin päivityskerralla on vaikka 15 yks / s, niin silloin x-sijaintia kasvatettaisiin 0,33 yksiköllä (jos päivitys on 50 kertaa sekunnissa)
Jos päivitysnopeus ei ole vakio, niin pidät vaan kirjaa milloin viimeksi päivitettiin ja katsot paljonko siitä on kulunut ja kerrot kiihtyvyyden ja nopeuden kuluneella ajalla.
Kiitoksia, Grez!
Tuossapa vielä koodini, jos jollakin toisella on sama ongelma ja näin:
Const PAINOVOIMA# = -0.5 Const KULUNUT_AIKA = 19 Type TPelihahmo Field X#,Y# Field pisteet Field koko Method PiirraMut() DrawRect X,Y,koko,koko 'hahmo DrawLine 0,491,680,491 'maa End Method Method Hallinta() Global nopeusY# = 0 Global ilmassa = False Local lahtovoima = 2 If KeyDown(KEY_RIGHT) X = X + 5 If KeyDown(KEY_LEFT) X = X - 5 Y = Y + nopeusY If ilmassa = True Then nopeusY = nopeusY - PAINOVOIMA If Y >= 441 Then Y = 441 ilmassa = False EndIf If KeyHit(KEY_SPACE) ilmassa = True nopeusY = nopeysY + PAINOVOIMA * KULUNUT_AIKA EndIf End Method End Type *Tässä sama loppuosa ku aloitusviesissä*
Ja illanjatkot. :)
Oho, oho. Tuonne oli eksynyt kirjotusvirhe ja jäänyt eräs turha muuttuja, ihme ku ei antanu erroria. No, tuossa koko korjattu höskä:
Const PAINOVOIMA# = -0.5 Const KULUNUT_AIKA = 19 Type TPelihahmo Field X#,Y# Field pisteet Field koko Method PiirraMut() DrawRect X,Y,koko,koko 'hahmo DrawLine 0,491,680,491 'maa End Method Method Hallinta() Global nopeusY# = 0 Global ilmassa = False If KeyDown(KEY_RIGHT) X = X + 5 If KeyDown(KEY_LEFT) X = X - 5 Y = Y + nopeusY If ilmassa = True Then nopeusY = nopeusY - PAINOVOIMA If Y >= 441 Then Y = 441 ilmassa = False EndIf If KeyHit(KEY_SPACE) ilmassa = True nopeusY = nopeusY + PAINOVOIMA * KULUNUT_AIKA EndIf End Method End Type pelihahmo:TPelihahmo = New TPelihahmo pelihahmo.X = 250 pelihahmo.Y = 441 pelihahmo.koko = 50 Graphics 680,550 Repeat pelihahmo.PiirraMut() pelihahmo.Hallinta() Flip ; Cls Until KeyHit(KEY_ESCAPE)
Olen tekemässä tuosta C++ -versiota (tosin sellainen on jo koodivinkeissä, mutta se ei käänny ainakaan minulla), GFX-kirjastona allegro. Se valmistunee tänään tai joskus, kun jaksan tehä sen loppuun. :P
No mutta, koodaamaan vaan (ja paskat, UnReal World oottaa). ->
Aihe on jo aika vanha, joten et voi enää vastata siihen.