Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Painovoima

Sivun loppuun

Kipperi [22.06.2006 20:33:01]

#

Rupesin aikani kuluksi tekemään Lieron tyyppistä peliä.
Olisiko vinkkejä millä tavalla pelin painovoima kannattaisi toteuttaa?

Merri [22.06.2006 20:47:50]

#

Tallenna X ja Y -koordinaatit liukuluvuilla (Single tai Double). Tämän lisäksi voit käyttää joka hahmonliikutuksella sellaista muuttujaa, joka liikuttaa pelaajaa, esim. Xspeed ja Yspeed. Painovoima vaikuttaa sitten tähän Yspeediin siten, että mitä painavampi esine/hahmo, sitä isompi vaikutus alaspainoon. Xspeed ja Yspeed puolestaan molemmat hidastuvat hieman ilmanpaineen vaikutuksesta, jos ilmanpaineen peliin sisällytät.


Muoks
Tosin kun en QB:tä omista (kehittyneempi FreeBASIC löytyy), niin en ole varma millä nimellä Single ja Double kulkee.

sooda [23.06.2006 15:35:17]

#

Merri kirjoitti:

Painovoima vaikuttaa sitten tähän Yspeediin siten, että mitä painavampi esine/hahmo, sitä isompi vaikutus alaspainoon.

Eikös se painovoima ole kuitenkin vakio kappaleen massasta huolimatta, eli kaikkien pitäis kiihtyä samalla lailla.

tesmu [23.06.2006 15:37:56]

#

9.81 on avainluku :)

Merri [23.06.2006 15:42:05]

#

Emmä tiiä, mutta kyllä kivi lähtee aika pikaiseen tippumaan nopeammin kuin höyhen. Painovoima/vetovoima saattaa pysyä vakiona, mutta kyllähän painavampi kappale silti jostain syystä nopeammin myös putoaa alas.

Realistista vetovoimaa on aika turha alkaa tämmöiseen peliin edes tekemään, sinnehän pitäisi kait jonnekin äärettömän alas laittaa se planeetan keskipiste ja sitten sen mukaan laskea minne päin kappaleet putoavat. Helpompi pyörittää samoina pysyviä lukuja kuin laskea joka kerta uudelleen, minne kappaleen pitäisi pudota.


Tietty olisihan se jänskä tehdä peli, jossa planeetan keskipiste ja koko vaihtelee. Laittaisi miniplaneetan keskelle kenttää :P

sooda [23.06.2006 15:43:35]

#

Niin lähtee, mutta se johtuu ilmanvastuksesta. Tonnin painoinen rautakuula ja gramman painoinen rautakuula kiihtyvät samaa vauhtia.

tesmu [23.06.2006 15:44:03]

#

Kappaleen painavuudessa ei ole mitään väliä... Ilmanvastus on se joka rajoittaa kiihtyvyyttä.

setä [23.06.2006 15:57:24]

#

Painovoima antaa vakiokiihtyvyyden niin kevyille kuin raskaillekkin kappaleille. ilmanvastus on verrannollinen nopeuden neliöön ja kappaleen poikkipintaan sekä riippuu kappaleen muodosta. Näin kukin kappale saavuttaa lopulta tietyn rajanopeuden vapaassa pudotuksessa. Luonnollisesti kivi saavuttaa suuremman nopeuden kuin höyhen mutta lähtökiihtyvyys on molemmilla sama.

Merri [23.06.2006 16:13:46]

#

Aletaan taas olla "hieman" ohitse aiheen: kysyttiin kannattavaa tapaa toteuttaa painovoima, eikä esimerkiksi sedän äskeinen listaus auta siinä, koska tuollaisten laskelmien suorittaminen jokaista liikkuvaa kappaletta kohden on todellista murhaa prosessorille. Jos ammuksia lentää ilmassa vaikka jotain tuhat (täysin mahdollista jollakin sarjatuliaseella), niin aika pian peli hidastuu todella hitaaksi, paitsi jos laskelmat ovat kyllin kevyitä suorittaa.

Sillä ei ole väliä, että tietää tarkalleen miten painovoima toimii, koska lopputuloksessa joutuu kuitenkin toteuttamaan vain näennäisen painovoiman.

Grey [23.06.2006 19:57:01]

#

>Merri
On niiden tuhannen ammuksenkin ohjaaminen aika "raskasta", jos tuolle kannalle lähdetään. Painovoima? Sehän ei ole yksinkertaisimmillaan peleissä kuin sitä että kohde tippuu tietylle nopeudelle kohti maata siinä vaiheessa kun vauhtia ei ole riittävästi pitämään kappaletta ilmassa.

Monimutkaisimillaan painovoima alkaakin olemaan kappaleiden välinen pitkän matkan vetovoima, mikä sitten aika harvassa pelissä edes lasketaan. Tosin, siihenkin on kaiketi jotkin algometrit, joilla saadaan asia toteutettua nopeasti. Vai miten luulet että 1024x768 resolla voidaan piirtää sekunnissa 47185920 pikseliä, kun fps on luokkaa 60? Ei ainakaan pikseli kerrallaan raylla. Hieman liian hidasta..

-Grey-

Merri [23.06.2006 21:48:14]

#

Ruudut hoidetaan bufferoinnilla järkevästi, että käsiteltävä pikselimäärä on mahdollisimman alhainen. Toisaalta kyllä sitä kokoruudussa joutuu hyvinkin tuon pikselimäärän aina piirtäessä hoitamaan plus päälle piirretyt kappaleet ja mahdollisesti efektejäkin.

Kappaleiden välistä vetovoimaa on aika turhaa laskea, vaikutus on niin pieni ettei sillä ole merkitystä; paitsi jos tahtoo tehdä jonkin jänskän aseen, mutta silloinkin sen voi ja se kannattaa hoitaa laskuilla, jotka ovat kevyitä prosessorille.

Mielenkiintoisempaa ja järkevämpää on painovoiman monipuolisuuden sijaan keskittyä hyvään törmäyksien laskemiseen. Yleensä kahden objektin törmäys on vielä helppo laskea, mutta sitten kun tapahtuukin kolmen tai useamman objektin törmäys lähes yhtä aikaa, niin aika monella menee jo sormi suuhun, että miten sen saa toimimaan järkevästi (on tullut nähtyä hauskoja pelejä ja/tai niiden betaversioita, joissa sumppuun törmänneet pelaajat ovat jääneet jumittelemaan toistensa päälle).

setä [23.06.2006 23:02:24]

#

Saattoi mennä hieman sivuun alkuperäisestä kysymyksestä. Edellisissä viesteissä kuitenkin mainittiin ilmanvastus ja siksi hieman täsmensin asiaa. On sitten tekisjästä kiinni miten luonnonlakeja mallintaa. Lyhyillä matkoilla ilmanvastuksella ei ole merkitystä mutta pitkillä matkoilla se on merkittävä tekijä. Ei sen laskeminen kovin työlästä ole jos pysytään kohtuuden rajoissa. Tuskin missään pelissä tarvitsee tuhansia ammuksia yhtaikaa räknätä. Törmäykset ovat todella aika mutkikas juttu.

Kipperi [25.06.2006 18:13:47]

#

Tein peliin melko törkeän "painovoiman" tyyliin; jos tyyppi hyppää, niin se jatkaa hyppyään kunnes kohtaa tietyn pisteen joka on laskettu ennen kuin hyppy on suoritettu, ja kohdattuaan pisteen se jatkaa matkaansa alaspäin siihen asti, kunnes on tukevalla pohjalla. Melko kömpelöä, mutta helpoin ratkaisu minun mielestäni...

Sami [25.06.2006 19:41:18]

#

Melko tarkan painovoiman saa toteutettua hyvinkin yksinkertaisesti, kunhan vaan tekee muutaman pienen yksinkertaistavan oletuksen, mm. että ilmanvastusta ei ole ja että painovoiman aiheuttama kiihtyvyys on vakio (eli kappale on suunnilleen vakioetäisyydellä sitä vetävän suurimassaisen kappaleen massakeskipisteestä, esim. planeetasta).

Näillä oletuksilla painovoiman pystyy toteuttamaan seuraavasti:

Aluksi käytettävien muuttujien ja vakioiden selitykset:
painovoimakiihtyvyys = ennalta asetettu vakio
kappaleen_Y-koordinaatti = kappaleen sijainti Y-akselilla
kappaleen_putoamisnopeus = kappaleen nopeus pystysuunnassa

Sitten varsinainen painovoiman toteutus:
while(true) {
kappaleen_putoamisnopeus = kappaleen_putoamisnopeus + painovoimakiihtyvyys;
kappaleen_Y-koordinaatti = kappaleen_Y-koordinaatti + kappaleen_putoamisnopeus;
Ja lisäksi tietysti vielä hoidat liikuttamisen X-suunnassa, mutta siihen painovoima ei vaikuta ollenkaan.
}

Kipperi [25.06.2006 20:54:06]

#

Pistin kotisivuille binäärin, ladatkaa jos yhtään kiinnostaa

http://koti.mbnet.fi/petu91/ladattavat.php

Kipperi [25.06.2006 22:36:12]

#

...Ja tässä linkki myöskin koodiin, josta tuskin itsekään otan selvää...

http://koti.mbnet.fi/petu91/ladattavat/MATOTAI4.BAS

Claw [10.07.2006 21:08:10]

#

Eipä tunnu toimivan, koodi siis.

tgunner [12.07.2006 21:07:57]

#

Kun pelasin peliä, niin se vaikutti pyörittävän jotain looppia koko ajan, jolloin peli kulutti kauheasti tehoja.
Voisit tehdä peliin jonkinmoisen hidasteen looppiin (pienen viiveen), tai sitten semmoisen pysäytyksen, jonka yli pääsee vasta kun on painanut jotain nappia tms.

polsystem [14.07.2006 16:43:41]

#

Kiitti, Sami.
Tein pienen(Myös huononkin)painovoimasimulaation.
Saatan tehdä koodivinkin.


Sivun alkuun

Vastaus

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

Tietoa sivustosta