Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Polygonimoottori

HtH [18.02.2002 18:24:46]

#

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"

HaRa [19.02.2002 21:13:35]

#

Lähettäkää mulle sähköpostia, jos on ongelmia, niin selvitän teille sen.

PeeCee [19.02.2002 21:25:23]

#

Mihkäs ohjelmointi kieleen toi on?

Antti Laaksonen [19.02.2002 21:29:30]

#

QBasiciin. Hyödyllinen aliohjelma, muuten.

HaRa [19.02.2002 21:55:20]

#

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.

jpweb [19.02.2002 22:13:15]

#

Voi tosta hyötyä ollakkin =)

Vastaus

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

Tietoa sivustosta