Joskus pelissä tarvitsee viivoista koosutvaa objektia, jota voi pyöritellä vapaasti, venytellä, zoomailla.. jne. Tälläinen on vain työlästä tehdä. Tässä on helppokäyttöinen SUBbi, jota voi käyttää vektorien muodostamiseen. Ja anteeksi kaikille, en ole kerennyt kommentoimaan koodia, mutta koko homma näyttäisi olevan pelkkää laskutoimitusta, niin ei huolta.
Ensiksi tee subbi, jonka näet listauksessa 1. Huh! Sen tekeminen oli hikistä puuhaa. Itse vektorin tiedot on DATA komennossa. Esimerkissä muoto on star, listaus 2 kannattaa laittaa ohjelman loppuun. Siinä määritellään polygonin muoto. Eli tässä tapauksessa se on tähti. Ensimmäinen DATA rivi sisältää muodon tiedot, elikkä se on muotoa:
DATA VÄRI,LEVEYS,KORKEUS,KULMIA
Sitten itse kuva muodostetaan sillä tavalla, että ensimmäinen kulma on 1, ja toinen 2, ja jne.. Katso esimerkkiä.
Sitten kun halutaan piirtää polygoni, niin ensin pitää kutsua muoto RESTORE komennolla, ja sen jälkeen kutsutaan tekemämme subbi paint.polygon ja sehän on muotoa:
paint.polygon X,Y,ZOOM,ROTATE,CLOSEPATH as STRING
Elikkä x ja y asettaa polygonin kohdan. HUOM! Ne määrää sen keskikohdan, ei vasenta yläkulmaa, niinkuin tavallisesti put komennossa. zoom määrää miten isona polygoni näyttää, se ei siis pikselöidy, koska koostuu viivoista. Rotate on luonnollisesti missä kulmassa polygoni piirretään. Huom yksikkö ei ole kulma, vaan radiaani, elikkä 6.28 (pii2) on täysikulma. Toivottavasti ymmärsit. Tätä koodia voi sitten muokata loputtomiin. Nuo laskutoimituksethan ne hikistä puuhaa olivatkin...
SUB paint.polygon (ex, yp, l, r, closepath AS STRING) DIM pointx(200) DIM pointy(200) DIM poiny(200) DIM poinx(200) exx = ex ypp = yp READ v READ x READ y READ o FOR q = 1 TO x FOR w = 1 TO y READ z IF z = -1 THEN prpx = x: prpy = y IF z > 0 THEN pointx(z) = w: pointy(z) = q NEXT NEXT exx = exx - (x / 2) ypp = ypp - (y / 2) SN = SIN(r) Cs = COS(r) FOR w = 1 TO o poinx(w) = ((pointx(w) - x + x / 2) * Cs - (pointy(w) - y + y / 2) * SN) poiny(w) = ((pointx(w) - x + x / 2) * SN + (pointy(w) - y + y / 2) * Cs) NEXT w FOR i = 1 TO o - 1 ux = exx - (x * z) / 2 yu = ypp - (y * z) / 2 LINE (poinx(i) * l + ux, poiny(i) * l + yu)-(poinx(i + 1) * l + ux, poiny(i + 1) * l + yu), v NEXT IF closepath = "true" THEN LINE (poinx(i) * l + ux, poiny(i) * l + yu)-(poinx(1) * l + ux, poiny(1) * l + yu), v END IF END SUB
star: DATA 14,5,5,8 DATA 0,0,1,0,0 DATA 8,0,0,0,2 DATA 0,7,5,3,0 DATA 6,0,0,0,4 DATA 0,0,0,0,0
RESTORE star paint.polygon 20,20,1,0, "true"
Lähettäkää mulle sähköpostia, jos on ongelmia, niin selvitän teille sen.
Mihkäs ohjelmointi kieleen toi on?
QBasiciin. Hyödyllinen aliohjelma, muuten.
Hups!!! Unohtu tuo Closepath as Stringin selittäminen. Jos se on true, niin ensimmäinen, ja viimeinen kulma yhdistyy toisiinsa, jos jokin muu, niin ei.
Voi tosta hyötyä ollakkin =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.