Rupesin aikani kuluksi tekemään Lieron tyyppistä peliä.
Olisiko vinkkejä millä tavalla pelin painovoima kannattaisi toteuttaa?
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.
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.
9.81 on avainluku :)
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
Niin lähtee, mutta se johtuu ilmanvastuksesta. Tonnin painoinen rautakuula ja gramman painoinen rautakuula kiihtyvät samaa vauhtia.
Kappaleen painavuudessa ei ole mitään väliä... Ilmanvastus on se joka rajoittaa kiihtyvyyttä.
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.
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.
>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-
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).
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.
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...
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.
}
Pistin kotisivuille binäärin, ladatkaa jos yhtään kiinnostaa
...Ja tässä linkki myöskin koodiin, josta tuskin itsekään otan selvää...
Eipä tunnu toimivan, koodi siis.
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.
Kiitti, Sami.
Tein pienen(Myös huononkin)painovoimasimulaation.
Saatan tehdä koodivinkin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.