cb-hackers / cbEnchanted

A new runtime for CoolBasic
13 stars 3 forks source link

Kuvien piirtäminen pyöritettyinä/skaalattuna #34

Closed aXu-AP closed 12 years ago

aXu-AP commented 12 years ago

Nyt kun ei ole tarvetta esilaskea käännettyjä ja skaalattuja kuvia, voisi näiden piirtämiseen olla omat funktionsa. Osittain päällekkäinen teksturoitujen kolmioiden kanssa (teksturoiduilla kolmioilla voidaan piirtää kuvia käännettynä ja skaalattuna).

DrawImageTransform(Img, rotation, scale)

kukkamario commented 12 years ago

Yksi tämän tyylinen funktio on lisättynä. cbeDrawTintedScaledRotatedImageBox(img, startX As Float, startY As Float, width As Float, height As Float, toX As Float, toY As Float, scaleX As Float, scaleY As Float, angle As Float) Se on hieman monipuolisempi tosin hieman hankalampi käyttääkin.

aXu-AP commented 12 years ago

Luonnollisestihan se näin on... muuttaako scaleX ja scaleY kuvan kokoa ennen vai jälkeen pyörittämisen? Mitä ovat toX ja toY? Funktion nimessä on Tinted, tarkoittaako se Color-värillä värjäämistä?

valscion commented 12 years ago

En ole ihan varma että mitä toX ja toY ovat. Niiden pitäisi mielestäni olla piirtokohdan keskipiste, mutta koska en ole itse tuota funktiota tehnyt niin en ole varma. Tältä näyttää toteutus sisäisesti:

al_draw_tinted_scaled_rotated_bitmap_region(
            img, sx, sy, sw, sh, tint, sw*0.5, sh*0.5, dx, dy, xscale, yscale, angle / 180.0 * M_PI, 0
);

Muuttujien nimet ovat järjestyksessä seuraavat:

img
sx
sy
sw
sh
dx
dy
scalex
scaley
angle

Kuva tosiaan värjätään nykyisellä piirtovärillä, eli olet siinä oikeassa.

kukkamario commented 12 years ago

Juu. toX ja toY ovat koordinaatit mihin kuvan keskipiste sijoittuu. Kuvan kääntäminen tapahtuu myös keskipisteen ympäri.

aXu-AP commented 12 years ago

Tuli muuten mieleen, että nuo toX ja toY ovat periaattessa turhat, sillä kuvillehan pystyy asettaa keskipisteen HotSpotilla. Vähemmän parametreja => yksinkertaisempi ja helpompi käyttää.

valscion commented 12 years ago

Ei se niin mene. toX ja toY määrittelevät piirtopisteen ja se on hyvinkin tärkeää. Pyöritetyillä kuvilla emme ala laskemaan HotSpotin arvoa vaan käytämme aina piirtopisteenä kuvan keskikohtaa.

aXu-AP commented 12 years ago

Oops luinkin väärin, ajattelin noiden olevan se pyörityspiste... elikkäs sx, sy, sw ja sh määrittelevät siis miten kuva rajataan, vai (olin aikaisemmin ajatellut sx:n ja sy:n olevan piirtopiste)?

valscion commented 12 years ago

Juurikin näin, eli ne ovat rajausparametreja.

aXu-AP commented 12 years ago

Tästähän tietty seuraa kysymys, saako tämän funktion myös ilman rajausparametreja? Useimmiten kuitenkin kuvat ovat valmiiksi rajattuja, ja neljän ylimääräisen parametrin (+kuvan koon selvittäminen joka kerta kun kuva piirretään voi vaikuttaa suorituskykyyn) kirjoittaminen hidastaa tuottavuutta ja hankaloittaa koodin lukua.

valscion commented 12 years ago

Joo kyllä on tulossa erilaisia piirtofunktioita. Tällä hetkellä olemme vain keskittyneet bugien korjailuihin enemmän kuin uusien erikoisfunktioiden tekemiseen.

aXu-AP commented 12 years ago

Se onkin oikea tärkeysjärjestys, ehdottelen näitä funktioita kyllä aika tiuhaan... mutta sitä vartenhan tämä trackeri on, että ideat (ja bugiraportit) säilyy tallessa vaikka niitä ei heti toteutettaisi :)

EDIT: Toteutin ehdottamani funktion tuon nykyisen avulla (eli käytännössä tämä vain automatisoi noiden parametrien laskemisen), sisältää myös oletusparametrit, jolloin tätä voi käyttää DrawImagen tavoin (-framen ja maskin valitsin):

Function cbeDrawTintedScaledRotatedImage(img, toX#, toY#, scaleX# = 1, scaleY# = 0, angle# = 0)
    If scaleY = 0 Then scaleY = scaleX
    cbeDrawTintedScaledRotatedImageBox(img, 0, 0, ImageWidth(img), ImageHeight(img), toX, toY, scaleX, scaleY, angle)
EndFunction
aXu-AP commented 12 years ago

Meinasin ehdottaa vielä läpinäkyvyyttä, mutta mokoma toimiikin jo asettamalla piirtovärin cbeColorilla :D