Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: BlitzMax: Painovoiman ohjelmointi

Pampi [19.10.2008 22:49:07]

#

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ä).

Grez [19.10.2008 23:10:06]

#

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.

Pampi [19.10.2008 23:30:58]

#

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. :)

Pampi [22.10.2008 02:07:59]

#

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). ->

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta