Olen tuollaisen terrainin kanssa tässä nyt vähän aikaa taistellut. Terrainin piirtäminenhän ei sinänsä ole mitenkään monimutkaista, mutta näihin tarvitaan aina jokin ns. heightmap, josta korkeuserot sitten poimitaan. Tällä kertaa erillinen kuvatiedosto tms. ei tule kysymykseenkään, eikä tosin arpominenkaan.
Mitä tekniikkaa tai algoritmia pitäisi käyttää terrainin luomiseen, joka on jokaisella ajokerralla samanlainen, mutta jossa ei tarvitsi käyttää erillisiä tiedostoja? Ja miten sellaista sitten käytännössä käytettäisiin?
Yksinkertaisesti liittämällä tarvitsemasi lähdetiedosto itse exeen sisään kääntämisen yhteydessä, jolloin sille ei tarvita luoda erillistä tiedostoa.
Tämä ominaisuus on yleensä liitetty kääntäjään, joten se tarkempi käyttäminen riippuu täysin kääntäjästä.
Jotta kartasta tulisi aina samanlainen, täytyy koko ajan muistaa, että luomisfunktio ei saa käyttää mitään sellaista, joka voisikin joskus toimia eri tavalla, kuten kellonaikaa tai muuta vastaavaa. Pseudosatunnaislukuja on kuitenkin mahdollista käyttää, kunhan satunnaislukugeneraattorille annetaan aina sama siemenluku.
Helpoiten nämä ehdot täyttyvät siis niin, että kokoat koko kartanluontijärjestelmän samaan tiedostoon, josta käsin ei kutsuta mitään ulkopuolisia funktioita, ellei ole aivan varmaa, että ne toimivat joka kerta samalla tavalla.
Oliko jokin erityinen syy olla käyttämättä arvontaa? Pseudosatunnaisluvut ovat oikeastaan vain keino tallentaa lukujono näppärässä muodossa (siemenluku ja muunnosfunktio).
int random_seed; int random(void) { // Keksitään edellisen pohjalta riittävän satunnainen seuraava luku random_seed = (random_seed * 2089L) + 536870911L; return random_seed; } map *gen_map(int seed) { random_seed = seed; // Aina samat luvut randomilta. }
Metabolix kirjoitti:
Oliko jokin erityinen syy olla käyttämättä arvontaa?
Se, että voi ite piirrellä kartoista just sellasia kuin haluaa?
Toisinsanoen karttasi pitää tallentaa johonkin tiedostoon (editorillasi?) ja jälkikäteen upottaa se exeen mukaan, liekkö joku resurssitiedosto tai muu systeemi. C++? Veikkaisin että tuo on kääntäjällekin helpompaa kuin määritellä 2 ulotteinen valtava taulukko lähdekoodiin.
Blaze kirjoitti:
Se, että voi ite piirrellä kartoista just sellasia kuin haluaa?
Silloin tässä tuskin kyseltäisiin algoritmia kartan luomiseen, vai kuinka?
Jos aivan yksinkertaista funktiota kaivataan, niin jostain tällaisesta voisi lähteä liikkeelle: cos(x*y/sqrt(3)) * cos(x*(y+3)/sqrt(3))
Ohjelman sisään upottamista resurssitiedostoilla en suosittele, jos ohjelmasta on tarkoitus tulla monella alustalla toimiva, koska se on taas asia, joka toimii joka käyttöjärjestelmässä omalla tavallaan. Lähdekoodiin upotettava taulukko on toki aina toimiva mahdollisuus. Kääntäjäystävällisimmin pääsee luultavasti käyttämällä Base64-enkoodausta, mutta tämä tietenkin vaatii hieman ylimääräistä työtä datan koodaamisen ja purkamisen takia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.