Tervehdys! Olen uusi C++:n parissa, mutta kuitenkin innokas oppimaan tämän kielen. Osaan kielen alkeet ja olen tehnyt yksnkertaisia sovelluksia sen kanssa. Tällähetkellä kiinnostaa saada selville kuinka esimerkiksi tämän kaltainen (http://mavdisk.mnsu.edu/kallhw/world/world.html) karttaeditori onnistuu C++:lla?
Ymmärrän kyllä ohjelman ajatuksen:
Ensin luodaan noise-kartta, joka määrittää "korkeudet" ja sitten korkeuksien mukaan väritetään kuva. Jokia lisätessä joet etenevät alas siten, että seuraava ruutu on aina alemmalta "korkeudelta" kuin edellinen kunnes ne tavoittavan meren pinnan korkeuden.
En kuitenkaan osais itse toteuttaa tätä C++:lla ja kaipaisinkin vinkkejä tai linkkejä tutoriaaleihin, jotka käsittelevät 2D-ympäristöjen satunnaisgeneroimista.
Ehkä auttaa, jos jaat projektin pienempiin vaiheisiin?
1. Tee yksinkertainen ohjelma, joka arpoo korkeudet ja tulostaa kartan tekstimuodossa. Jokainen tile tulostetaan yhtenä merkkinä, esimerkiksi vesi voi olla '~
' ja maa-alueet 'A
' .. 'Z
'.
2. Toteuta joet ja muuta ohjelmaa niin, että se lisää muutamaan joen satunnaisiin paikkoihin ennen kartan tulostusta.
3. Korvaa tekstimuotoinen tulostus grafiikalla. Avaa uusi ikkuna ja piirrä kartta siihen, käyttäen erivärisiä neliöitä merkkien sijaa. Tähän tarvitset jonkun grafiikkakirjaston, esimerkiksi SFML.
4. Toteuta jokien lisääminen klikkaamalla.
Hmm... Kiitos! Kummankin vastauksesta oli suuresti hyötyä!
Plasmaefektillä sais jonkinnäköistä karttaa myös.
Sama tekniikka jolla pehmennetään kuva sopii myös karttaeditoriin. Eli siis:
1) Määrittele tilapäismuuttuja johon tallennat koko kartan.
2) for silmukat Y ja X akseleille käy läpi kaikki tilapäismuuttujan ruudut, ja
3) Lukee kaikkien viiden (itse + vierekkäiset) ruudun korkeuksien keskiarvon, ja kirjoittaa sen karttaan.
Tilapäismuuttuja on välttämätön koska muuten lopputulos ei ole oikea. Varsinaista karttaa kun pitäisi pehmentää samalla kun siitä luetaan.
Huomaat varmaan ongelman kartan reunojen kanssa. Esim kulmille lasketaan keskiarvo vain kolmesta ruudusta. Voit käyttää laskurimuuttujaa joka kertoo montako ruutua luettiin ja niiden summa. Summa jaettuna laskurilla antaa tuon pehmennetyn korkeuden.
Lopputuloksesta tulee hienompi jos lasket kaikkien ympärillä olevien 9 ruudun keskiarvon, mutta tietty hitaampi algoritmi.
Yksi mielenkiintoinen lähestymistapa on ajatella maastoa fraktaalina.
Aihe on jo aika vanha, joten et voi enää vastata siihen.