Projektini on sokkelopeli, jossa pelaaja on hiiri ja yrittää löytää reitin pois.
Ongelmaksi on tullut sokkelon/hiiren piirtojärjestys.
http://zux.sjr.fi/touho/problem.png
Rakenne koostuu:
-Vihreistä viivoista
-Vihreistä palloista
-Oransseista viivoista
-Oransseista palloista
-Hiirestä
Kaikki talletetaan taulukkoon ArrayList<MazeDrawObject>. Taulukossa ensimmäinen piirretään ensin jne.
Kuva:
1) Tähän pyrin. Viivat ovat manuaalisti järjestetty.
2) Oma algoritmi: Vihreät, oranssit, hiiri. (ei korkeuseroa)
3) Vaihtoehtoinen algoritmi: vihreät pallot, kokonaiset viivat, oranssit pallot, hiiri (hiiri näkyy päällimmäisenä, bugeja risteyksessä.
Minkälaisella algoritmilla saan sokkelon näyttämään aina oikealta, sekä hiiren kulkemaan tarvittaessa teiden ali?
Laita eri taulukoihin sen mukaan, mitkä ovat päällimmäisiä.
Se ei ratkaise hiirtä menemään teiden ali eikä risteyksien grafiikkabugia. Miksi ne laittaisi eri taulukkoon, kun ne voi laittaa myös samaan?
Touho kirjoitti:
Miksi ne laittaisi eri taulukkoon, kun ne voi laittaa myös samaan?
Onnistuisihan tuo myös samalla taulukolla, jos merkitset niille korkeuden ja käyt taulukon läpi useampaan kertaan. Nopeammin kuitenkin selviäisit useammalla taulukolla.
Idea on siis siinä, että laitat hiiren alle ja päälle haluamasi objektit eri taulukoihin ja käyt piirrettäessä taulukot läpi alhaalta ylöspäin. Näin päällimmäiset objektit piirretään edellisten päälle.
ville-v: Tuliko mieleesi ollenkaan, että se hiirikin on ehkä samassa taulukossa eli eri objektien välissä, jolloin ylimääräinen taulu vain mutkistaa systeemiä turhaan?
Jos hiiri voi vaikkapa tuossa esimerkissä kulkea vain risteyksen ali, riittää järjestellä jokaisen tason osaset käsin. Muussa tapauksessa tarvitaan 3D-kikkoja, eli jokaiselle objektille on määritettävä syvyys, ja lisäksi on tunnistettava hiiren liikkuessa, minkä osan päällä se on, ja piirtää se sijainnin mukaan oikealle syvyydelle. Ongelmaksi muodostuu se, että järjestelmässäsi yhdellä objektilla voi olla vain yksi syvyys eli viivan päiden pitää olla samalla syvyydellä. Jos kuitenkin tasot ovat sellaisia, ettei pallon päällä koskaan ole mitään (toista palloa tai viivaa), tämäkin riittää.
Metabolix, tuo ei ratkaise grafiikkabugeja risteyksissä. (kuva 3)
Aivan, pallot täytyisikin ehkä käsitellä erikseen. Jos pallon kanssa samaan aikaan piirrettäisiin myös sen päällä oleva osa viivasta, ongelma kaiketi ratkeaisi.
Yksi keino olisi piirtää ensin koko taso käsin tehdyssä järjestyksessä ja sitten tunnistaa, onko hiiri useamman viivan kohdalla. Jos viivoja on vain yksi, hiiri piirretään niiden päälle, ja jos niitä on monta, tarkistetaan, minkä päällä hiiri on, ja piirretään hiiri ja sen päällä olevat viivat uudestaan. Näitä uudestaan piirrettäviä viivoja täytyisi lyhentää hieman, jotta ympyrät pysyisivät ehjinä. Nopeintahan olisi tietenkin piirtää vain se alue, johon hiiren piirtäminen vaikuttaa.
Jopa olet hankalan tasomallin valinnut. :)
Taidan luovuttaa, ja ratkaista ongelman näin: http://zux.sjr.fi/touho/solution.png
Ja korkeuserot niin, että generoin jokaiselle tielle oman korkeuden, laitan ne järjestykseen taulukkoon. Hiiren korkeudeksi laitan sen alla olevan tien + 1. Sokkelogeneraattorin laitan tekemään tiet niin, ettei tiet mene risteyksien yli.
Tämän pitäisi ratkaista ongelman suhteellisen kattavasti.
Itse käyttäisin ZOrderia objekteilla. eli objektit piirretään korkeuden mukaan. ensin ZOrder=0 Objektit sitten ZOrder=1 Objektit jne.
Ja tuossa periaatteessa voi käyttää suoraan tuota hiiren korkeus on alla olevan order +1 ja vielä sääntö että hiiri ei voi liikkua palikalta a palikalle b jos näiden välinen korkeus ero on enemmän kuin yksi.
Tässä tietysti pitää tehdä myöskin tarkistus että onko kohdassa palikkaa jolle voidaan astua. (ja periaatteessa vielä tarkistaa että sopiiko näiden palikoiden väliin, eli että palikoiden välisessä ZOrderissa on vielä yksi tyhjää)
eli esimerkki sokkelon ZOrderit menisi about näin.
0################0
00##############00
0#00##########00#0
0###00######11###0
0#####00##22#####0
0#######22#######0 (luonnollisesti tässä 22 alla on myös 00)
0#####22##00#####0
0###11######00###0
0#00##########00#0
00##############00
0################0
Tässä muistettava sääntö että alittavan ja ylittävän tien rajalla ei saa olla näin:
00##11
##22##
11##00
koska nyt pystyisi kääntymään tuosta alittavalta tieltä ylittävälle tielle
En tiedä osasinko selittää järkevästi mut toivottavasti on apua :)
Edit: välilyönnit korvattu '#' merkillä.
Edit 2: Tarkennettu selitystä... tai no.. jotain
Edit 3: ja pitäisi vissiin lukea ketju tarkemmin ennen kuin vastaa... mut tosiaan tuo ylittävä tie/viiva kannattais tehdä useampana objektina jolloin sitä pystyy järkevämmin käsittelemään.
Menee hankalaksi, jos rupean noin tekemään. Sokkelotiedostossa on kerrottu vain risteykset, ja mitkä risteykset ovat yhdistetty. Luulen, että pärjään minun uudella systeemillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.