cb-hackers / cbEnchanted

A new runtime for CoolBasic
13 stars 3 forks source link

Objektien piirtosijainti heittelee #62

Closed aXu-AP closed 12 years ago

aXu-AP commented 12 years ago

Tästä oli muistaakseni maininta jossain julkaisuviestissä, mutta lisätään nyt tämäkin ärsytys tänne. Eli objektit, joiden koordinaatit ovat hyvin lähellä kokonaislukua, voivat heittää pikselin verran riippuen kameran sijainnista. Alla oleva koodi demonstroi tätä (liikuta kameraa nuolinäppäimillä):

FrameLimit 60
ukko = LoadObject("media/guy.bmp")
ukko2 = LoadObject("media/guy.bmp")
PositionObject ukko2, 0.5, 0.5
Repeat
    TranslateCamera (RightKey() - LeftKey()) * 0.1, (UpKey() - DownKey()) * 0.1
    DrawScreen
Forever

Luulen, että ongelma korjaantuisi, jos kameran sijainti käsiteltäisiin aina kokonaislukuna renderöitäessä (mutta sen kontrollointi tietty liukuluvuilla).

kukkamario commented 12 years ago

Mutta onko tuo nyt sitten vika? Minä pitäisin sitä pikemminkin ominaisuutena.

aXu-AP commented 12 years ago

Minä kyllä pitäisin sitä vikana, en keksi mitään positiivista objektien värähtelyssä kameran liikkuessa. Tietty on eri asia, jos käskee Smooth2D ON, jolloin objekti liikkuu sulavasti pikselistä toiseen.

kukkamario commented 12 years ago

Eihän tuo nyt varsinaisesti mitään värähtelyä ole. Toinen vain siirtyy sen pikselin verran 0,5 pikseliä aiemmin kuin toinen, koska niiden etäisyys on 0,5 pikseliä. Tuota ei edes huomaa ellei objektit liiku samaan tahtiin. Yleisimmin tälläinen tilanne varmaankin olisi kun toinen objekti toimisi toisen objektin aseena tai jonain muuna osana. Silloin tuosta "värähtelystä" pääsee eroon yksinkertaisesti käyttämällä niiden objektien etäisyytenä kokonaisia pikseleitä.

aXu-AP commented 12 years ago

Yleisemmin tilanne taitaa tulla paikoillaan pysyvillä objekteilla taustaa vasten. Josta puheenollen, miksi seuraava koodi aiheuttaa myös saman ilmiön vaikka kartta ja ukko ovat samassa sijainnissa?

FrameLimit 120
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
ukko = LoadObject ("Media\guy.bmp",72)
Repeat
    TranslateCamera (RightKey() - LeftKey()) * 0.1, (UpKey() - DownKey()) * 0.1
    DrawScreen
Forever
kukkamario commented 12 years ago

Totta. Tuo on hieman ärsyttävää. Floatin tarkkuus ei taida riittää. Tuon korjaamiseksi pitäisi todennäköisesti muuttaa objektien sijaintien tallennus ja kaikki piirtäminen kokonaisluvuille liukulukujen sijaan.

valscion commented 12 years ago

Hmmh, korkeintaan pitäisi tehdä niin että Smooth2D:n ollessa pois päältä objektien piirtokoordinaatit muutettaisiin floateista kokonaisluvuiksi. Missään nimessä ei aleta objektien koordinaattien tallennustapaa muuttamaan.

valscion commented 12 years ago

Noniin, kyllähän se niin oli että liukuluvut kameran sijainnissa aiheuttivat tuskaa piirtelyissä. Korjasin ongelman muuttamalla tosiaan ne kameran koordinaatit piirtovaiheessa kokonaisluvuiksi, sopivilla liukulukuvirhekorjauksilla varustettuna ja tämä häiritsevä tökkiminen on poissa. Smooth2D:n ollessa päällä ei koordinaatteihin kosketa tietenkään.

Tämä fiksasi samalla maailmankoordinaatteihin piirrettävät kuvat, grafiikat ja tekstit. Nekään eivät enää pompi, kun kameran sijainti on määritetty liukuluvuin.