cb-hackers / cbEnchanted

A new runtime for CoolBasic
13 stars 3 forks source link

Kuvien/objektien piirto bugaa puolikkailla koordinateilla #76

Closed aXu-AP closed 12 years ago

aXu-AP commented 12 years ago

Anteeksi hieman pitkä otsikko, en keksinyt kuvaavampaa. Eli objekteilla ja kuvilla piirto bugaa jännästi, kun y-koordinaatti on kahden pikselin välissä (eli x.5 liukuluvun tarkkuuden rajoissa). Ylin pikselirivi näkyy kahteen kertaan ja alin puuttuu kokonaan. Tässä näkyy bugi toiminnassa (liiku nuolilla):

ukko = LoadObject("media/tatti.bmp")
ClsColor 255, 255, 255
Repeat
    Color 0, 0, 0
    Text 0, 0, "ObjectX: " + ObjectX(ukko)
    Text 0, 12, "ObjectY: " + ObjectY(ukko)
    TranslateObject ukko, 0.5 * (KeyHit(cbKeyRight) - KeyHit(cbKeyLeft)), 0.5 * (KeyHit(cbKeyUp) - KeyHit(cbKeyDown))
    DrawScreen
Forever

Tämä bugi on ollut oikeastaan jo ihan ensimmäisestä versiosta lähtien, mutta vasta nyt löysin tavan tuottaa bugi 100% varmuudella.

valscion commented 12 years ago

Otsikkosi on vallan loistava, siitä tulee heti ilmi tämän bugin ydin. On täällä pidempiäkin ollut.

Tuo bugi johtunee siitä että näytönohjain käyttää liukulukuja piirrettäessä. Allegron manuaalissa on aiheesta mainittu. Pitää vielä katsoa myöhemmin että bugaako cbE itsessään jotenkin jännästi.

valscion commented 12 years ago

Eikun kas tuohan on ihan eri asia. Pitää tarkistaa miksi tuo bugaa.

aXu-AP commented 12 years ago

Nyt taas kysymys, tarviiko liukulukuja käyttää missään piirtämiseen liittyvässä niin kauan kun se Smooth2D on pois päältä?

kukkamario commented 12 years ago

Kaikki laskenta ja piirtäminen tapahtuu cbE:n puolella liukuluvuill,a mutta ei sinun ole pakko käyttää niitä koodissasi.

aXu-AP commented 12 years ago

Niin no se oli lähinnä retorinen kysymys, mitäänhän ei sinne pikseleiden välille voi piirtää (liukulukukoordinaatteja on vain hieman hankala välttää objekteilla)

valscion commented 12 years ago

Tämä ongelma johtuu jotenkin joko Allegrosta tai sitten siitä että näytönohjaimesi ei toimi kunnolla kun piirtokoordinaatti on kahden pikselin välissä. Itselläni esimerkkisi toimii ihan nätisti, mutta tatti.bmp piirtäminen kyllä jotenkin jännästi bugailee: http://vesq.viuhka.fi/cbe/scrshots/tattibmp_bug.png

Suljen tämän bugiraportin koska tämä ei luultavasti johdu cbE:stä.

aXu-AP commented 12 years ago

Katsos, sinullahan on sama ongelma, mutta vaakasuunnassa :D Onhan tämä suht. helppo välttää (mutta toisten tekemissä peleissä tämä tulee minua kyllä häiritsemään).

valscion commented 12 years ago

Hmh, voisi koittaa laittaa jotain liukulukukorjauksia piirtelyihin, jos saisi tuon korjattua. Saattaa kyllä olla ettei voi tehdä asialle mitään, jos Allegro kusaisee kuvan jo lataamisen yhteydessä.

aXu-AP commented 12 years ago

Ei se sitä kaiketi kuvan lataamisen yhteydessä tuollaiseksi tee, veikkaan että siirtämällä 0.5 pikseliä sivusuunnassa sinulla näkyy normaalisti. Mietityttää vain, miten korjata ongelma joka ilmenee erilailla eri koneilla. Pitäisi varmaan vähän kartoittaa, kuinka yleinen tämä on. Muokkaanpa tuota aloitusviestin koodia lisäämällä sivuttaissuunnassa liikkumisen, niin on helpompi testailla muidenkin.

EDIT: Yksinkertaisin tapahan päästä tästä eroon on jättää kuvaan tyhjä pikselirivi joka laidalle (tämän takia esimerkkikuvaksi otin tatti.bmp:n, koska melkein kaikissa muissa cb-mediassa on tyhjää reunoilla). Pystyisikö sen tyhjän rivin lisäämään vielä cbe:n sisäisesti? Olisi kyllä aika tylsä tapa kiertää ongelma, ja vaatisi tod. näk. ainakin kuvan koon kertovien funktioiden muokkaamista.

valscion commented 12 years ago

Tämä näyttäisi olevan bugi allegrossa, luultavasti jonkinlainen pyöristysvirhe kuvan piirron yhteydessä. Pitää koittaa väsätä allegrolle jonkinlainen bugiraportti.

Täytyy kyllä muutella aikas montaa funktiota kun tämän korjaa :/ vähän harmi. Mutta kyllä se varmaan cbE:hen sisäisesti toteutetaan.

valscion commented 12 years ago

Testasin vielä ja huomasin, että sama ongelma tulee kuvillakin.

ukko = LoadImage("media/tatti.bmp")
ClsColor 255, 255, 255

x# = 200
y# = 150
Repeat
    Color 0, 0, 0
    Text 0, 0, "x: " + x
    Text 0, 12, "y: " + y
    Text 20, 24, "The mushroom above is buggy, the one below"
    Text 20, 36,"is set to always draw at integer coordinates."
    x# = x + 0.5 * (KeyHit(cbKeyRight) - KeyHit(cbKeyLeft))
    y# = y + 0.5 * (KeyHit(cbKeyDown) - KeyHit(cbKeyUp))

    DrawImage ukko, x, y

    DrawImage ukko, Int(x + 0.5), y + 20
    DrawScreen
Forever

kuvabugi

valscion commented 12 years ago

Niin ja ettet ihan nyt taas ala ehdottelemaan että korjattais, kun ei oo Smooth2D päällä, niin tässä esimerkkiä mitä tapahtuu Smooth2D:n ollessa päällä.

Smooth2D ON
ukko = LoadImage("media/tatti.bmp")
ClsColor 255, 255, 255

x# = 200
y# = 150
Repeat
    Color 0, 0, 0
    Text 0, 0, "x: " + x
    Text 0, 12, "y: " + y
    Text 20, 24, "The mushroom above is buggy, the one below"
    Text 20, 36,"is set to always draw at integer coordinates."
    x# = x + 0.5 * (KeyHit(cbKeyRight) - KeyHit(cbKeyLeft))
    y# = y + 0.5 * (KeyHit(cbKeyDown) - KeyHit(cbKeyUp))

    DrawImage ukko, x, y

    DrawImage ukko, Int(x + 0.5), Int(y + 20.5)
    DrawScreen
Forever

smooth2d

valscion commented 12 years ago

Korjasin tämän nyt niin, että se toimii vain Smooth2D:n ollessa päällä. Jos ohjelmoija kenties haluaa käyttää Smooth2D:tä, niin kannattaa käyttää kuvia joissa laidoilla on tilaa pehmennykselle.

valscion commented 12 years ago

Meh. Ei edelleenkään toimi tämä korjaus objekteilla :/ kuvilla jotka piirrettiin näyttökoordinaatteihin niin toimi. Pitänee tehdä objekteille uusi issue kun tämä on jo korjattu kuville.