Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Janan, Polun seuranta

Sivun loppuun

mika132 [21.03.2012 15:01:27]

#

Eli miten voitaisiin tehdä ns.Polku karttaan mitä jokin kuva "yrittää" seurata. Tai mennä sen päällä. Olen nimittäin nyt kyllästynyt nykyiseen tekoälyni menetelmään seurata rataa, koska totesin sen hieman raskaaksi ja vaikeaksi.

Jos polku systeemi on vaikea toteuttaa, niin olisiko joku muu mahdollisuus?

jalski [21.03.2012 15:22:02]

#

Et kuitenkaan viitsinyt kertoa nykyistä tapaasi? Potentiaalikartta voisi olla mielenkiintoinen vaihtoehto...

mika132 [21.03.2012 15:26:27]

#

Potentiaalikartta? En ole koskaan kuullutkaan tuollaista sanaa edes. Saisiko ohjastusta?

Nykyinen systeemini on perinteinen. Radalla on näkymättömiä "nelijöitä" joihin auton edessä kulkevan pisteen osuessa tapahtuu sitä, mitä piste käskee. Todella vaikea ja pitkä systeemi, kun joka rataan menee noin 60 näitä neliöitä + niiden tuottama ominaisuus tekee noin 300 riviä ylimääräistä koodia.

Lebe80 [21.03.2012 15:32:20]

#

Älä kovakoodaa pisteitä, vaan tee rata johonkin ulkoiseen tiedostoon ja tee simppeli editori ratojen muokkaamiseen.

Näin tein esim. erääseen omaan "Slick'n'Slide"-kopioon. Jokaisessa ruudussa oli suunta, johon auto käskettiin kääntymään, kun se saapui. Lisäksi autoilla oli "vaikeustaso"-arvo, jonka perusteella luotiin satunnaista hajontaa pisteen tarkistuspaikasta. Eli huonompi tekoälykuski "luuli" ajaneensa välillä hieman eri kohdassa, missä oikeasti olikaan (rupesi kääntymään liian aikaisin/myöhään).

mika132 [21.03.2012 16:05:35]

#

No minullahan on tekeillä rata editori, minkä valmistumisen laskin loppu vuodelle niin, että sitä pystyttäisiin käyttämään uudessa Racerissä.

Nyt kuitenkin ajattelin käyttää sitten nykyistä versiota, jotta saan toteutettua tuon systeemin, mutta minulla on yksi ongelma. Editorissa on nappula. "Avaa kuva" jos siitä painaa niin miten saan järjestelmän kysymään tiedostoa? Eli siis mikä kuva avataan ja kun se valitaan se piirretään. Miten tälläinen toteutetaan?

jalski [21.03.2012 16:40:19]

#

mika132 kirjoitti:

Potentiaalikartta? En ole koskaan kuullutkaan tuollaista sanaa edes. Saisiko ohjastusta?

Meinasin siis systeemiä, jossa mahdollisilla esteillä ja radan reunoilla olisi "potentiaalikenttä". potentiaalikenttä olisi vahvimmillaan esteen kohdalla ja heikkenisi asteittain aina kauemmaksi esteestä poispäin mentäessä. Nyt siis, jos auto vaikka pyrkisi aina seuraamaan pienintä potentiaalia niin se automaattisesti pyrkisi pysymään mahdollisimman kaukana esteistä. Kun vielä lisäät peliobjekteille omat potentiaalikentät niin reitinhaku mukautuu automaattisesti pelialueen tapahtumiin. Lisäksi täytyy tietysti pitää huolta, että peliobjekteihin vaikuttaa potentiaali mikä työntää niitä aina oikeaan suuntaan etteivät ne päätä lähteä ajamaan rataa väärin päin.

mika132 [21.03.2012 23:29:59]

#

On jäänyt yksi asia oppimatta.

Kun tallennetaan while silmukan kautta eri vectorien tietoja eri riveille miten se tapahtuu?

Tämä ei ainakaan tallenna kuin yhden rivin:

std::vector<Game::Ruudut>::iterator ruu= Game::ruudut.begin();
while(ruu != Game::ruudut.end()){
        std::ofstream tiedosto_map("MapData.dat");
        Game::Ruudu aaa = {ruu->id, ruu->x, ruu->y, ruu->toiminto};
        tulostaRadat(tiedosto_map, aaa);
        tiedosto_map.close();
    ruu++;
}

Teuro [22.03.2012 14:02:41]

#

mika132 kirjoitti:

On jäänyt yksi asia oppimatta.

Tämä ei ainakaan tallenna kuin yhden rivin:

std::vector<Game::Ruudut>::iterator ruu= Game::ruudut.begin();
while(ruu != Game::ruudut.end()){
        std::ofstream tiedosto_map("MapData.dat");
        Game::Ruudu aaa = {ruu->id, ruu->x, ruu->y, ruu->toiminto};
        tulostaRadat(tiedosto_map, aaa);
        tiedosto_map.close();
    ruu++;
}

Tallentaa se jokaisen rivin, joskin seuraava korvaa aina edellisen.

mika132 [22.03.2012 15:30:44]

#

Juu. Tarkoitin, että miten saan tallennettua jokariviin oman tiedon ilma, että vanha korvaantuu, mutta hoksasin sen jo itse.

std::vector<Game::Ruudut>::iterator ruu= Game::ruudut.begin();
std::ofstream virta_kuskit("MapData.dat");
while(ruu != Game::ruudut.end()){
        Game::Ruudu aaa = {ruu->id, ruu->x, ruu->y, ruu->toiminto};
        tulostaKuskit(virta_kuskit, aaa);
    ruu++;
}
virta_kuskit.close();

Tähän vielä jos saisin vastausta:
"Editorissa on nappula. "Avaa kuva" jos siitä painaa niin miten saan järjestelmän kysymään tiedostoa? Eli siis mikä kuva avataan ja kun se valitaan se piirretään. Miten tälläinen toteutetaan?"

jalski [22.03.2012 15:53:54]

#

mika132 kirjoitti:

"Editorissa on nappula. "Avaa kuva" jos siitä painaa niin miten saan järjestelmän kysymään tiedostoa? Eli siis mikä kuva avataan ja kun se valitaan se piirretään. Miten tälläinen toteutetaan?"

Et taaskaan anna hirveästi tietoa... Olisi helpompi auttaa, jos kertoisit käytettävän alustan ja käyttämäsi kirjastot.

Yleisesti ottaen, olisikohan yksinkertaista karttaeditoria varten parempi lähetymistapa tuon kuvailemasi tavan sijaan tallentaa kaikki grafiikkaruudut yhteen tiedostoon?

Editorissa piirtäisit karttaruudukon ja kuvapaletin mikä olisi siis tuo yksi peliruutu grafiikat sisältävä kuva. Ideana olisi, että kuva paletista voisi yksinkertaisesti hiirellä vain valita oikean kuvan ja "maalailla" karttaruudukkoon.

punppis [22.03.2012 23:11:08]

#

GDC 2012 -tapahtumassa kuuntelin luentoa, jossa puhttiin Bézier curveista. Todella helppoja koodata (itsellä meni ehkä 30min testauksessa kun wikipediasta saa kaavat suoraan) ja sangen käytännöllisiä. Näitähän voi käyttää myös esim. RPG-pelin statsien skaalautumisessa jne., ei siis pelkästään visuaalisiin kurveihin.

User137 [23.03.2012 22:19:40]

#

Kuten vanha Slicks & Slide aikanaan teki; tekoälyn reitti koostui pisteistä ja nelöistä. Kutakin reittipistettä kohti oli neliö. Kun auto saapuu neliön sisälle, on se merkki siitä että aletaan suuntaamaan seuraavaa pistettä kohti. Seuraavalla pisteellä taas oma neliö-alue jne.


Sivun alkuun

Vastaus

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

Tietoa sivustosta