Elikkäs lyhyestä virsi kaunis, meinasin kokeilumielessä tehdä pienen ns. 'demon', joka olisi sivultapäin kuvattu, 'platform' tyylinen, missä olisi liikuteltava hahmo, ja siihen voisi ladata erillisistä tiedostoista kentän. Kenttä muodostuisi 'polygoneista', eli se ei olisi tile-pohjainen. Kysymys siis kuuluu näin:
Mikä olisi tällaisessa paras tapa toteuttaa törmäystarkistus maan kanssa? Pitäisikö lukea kenttä taulukkoon, ja käydä aina taulukko läpi?
Valmista koodia en tietenkään kaipaa. 8)
Niinhän se periaatteessa menee. Tietenkin sitten tähän on tuhat ja sata optimointikeinoa kuten se, että jaetaan maailma sopiviin alueisiin ja käydään läpi vain sen alueen (tai niiden parin alueen) listat, jolla (joiden rajalla) hahmo on.
Eikö olisi myös mahdollista ajatella polygonien reunat analyyttisgeometrisina suorina ja tarkistaa epäyhtälöllä, onko hahmo reunan ala- vai yläpuolella?
Törmäystarkastuksen monikulmion kanssa voi tarkistaa ns. even-odd-säännöllä:
Piste (hahmo, tai sen reunapiste) on suljetun monikulmion (polygon) sisällä, jos ja vain jos sen kautta piirretty mielivaltainen puolisuora (esim. positiivinen x-akseli) leikkaa parittoman määrän monikulmion sivujanoja.
Kokeilet siis jokaisen sivujanan kohdalla (siirry seuraavaan kohtaan vain jos vastaus on ei):
1. Ovatko janan molemmat päätepisteet joko hahmon alapuolella tai sen yläpuolella (ei leikkausta)
2. Ovatko janan molemmat päätepisteet hahmon takapuolella (ei leikkausta)
3. Ovatko janan molemmat päätepisteet hahmon etupuolella (leikkaus)
4. Leikkaako janan päätepisteiden kautta piirretty suora hahmon kautta piirretyn vaakasuoran viivan hahmon etupuolella (leikkaus)
5. Ei leikkausta
Jos janan päätepiste on pystysuunnassa täsmälleen samalla tasalla hahmon kanssa (puolisuora leikkaa monikulmion sen kulmassa) täytyy selvittää onko toinen samasta pisteestä alkava sivujana pystytasossa samalla puolella hahmoa (ei leikkausta / 2 leikkausta) vai ei (leikkaus).
Jos leikkauksia kertyy 1, 3, 5, 7 ..., niin piste on monikulmion sisällä. Säännön toimivuutta voi kokeilla vaikka kynällä ja paperilla: piirrä mielivaltainen suljettu kuvio ja sen sisään tai ulkopuolelle piste ja pisteestä (päättymätön) säde mihin tahansa suuntaan ja laske leikkaukset kuvion reunojen kanssa (yllä mainittu poikkeussääntö huomioiden).
Kiitos vastauksista, osin vaustaus meni jo hiukan yli hilseen, mutta eiköhän tämä tästä. ;]
Lisää ehdotuksia saa toki laittaa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.