Ongelma on siis seuraava. Olen koettanut saada eräässä Qbasic projektissani aikaan koodia, joka ottaisi tietyltä alueelta taustan muistiin, ja myöhemmin piirtäisi sen siihen takaisin. GETia ja PUTia olen kokeillut, seurauksena vain kasa virheilmoituksia. Ja katsoin jo koodivinkeistä esimerkkejä, enkä saanut toimimaan halutunlaisena yhtäkään..
-Grey-
Ensimmäinen askel on sopivan kokoisen taulukon määrittäminen. Jos taulukon tyypiksi määrittää INTEGER, sopiva koko on pyöreästi kuvan leveys * kuvan korkeus.
Tämän jälkeen kuva kopioidaan taulukkoon GET-komennolla.
GET (x1, y1)-(x2, y2), taulukko
Komennossa (x1, y1) on kuvan vasemman yläkulman koordinaatit ja (x2,y2) oikean yläkulman koordinaatit. Vastaavasti kuvan piirtäminen takaisin tapahtuu PUT-komennolla.
PUT (x, y), taulukko
x ja y määrittävät paikan, johon kuva piirretään. Tein vielä esimerkkiohjelman, josta asian pitäisi viimeistään selvitä.
'muuttujatyyppi on oletuksena INTEGER DEFINT A-Z 'määritetään kopioitavan kuvan paikka ja koko x = 100 y = 50 leveys = 50 korkeus = 50 'määritetään taulukko kuvalle DIM kuva(leveys * korkeus) 'asetetaan näyttötila 320x200x256 SCREEN 13 'piirretään 500 satunnaista viivaa FOR i = 0 TO 500 LINE (RND * 320, RND * 200)-(RND * 320, RND * 200), RND * 256 NEXT 'kopioidaan kuva taulukkoon GET (x, y)-(x + leveys, y + korkeus), kuva 'odotetaan näppäimenpainallusta SLEEP 'tyhjennetään näyttö CLS SLEEP 'piirretään kopioitu kuva näytön ylänurkkaan PUT (0, 0), kuva
Itseäni lainatakseni:
lainaus:
Huuhhuh.. katselinkin tuossa juuri QB:n manuaalia.. ja ihme ja kumma! GET-käskyn kohdalla todellakin selitetään, miten tuo taulukon koko tulee laskea :) Kaava on seuraavanlainen:
4 + INT(((x2 - x1 + 1) * (bits-per-pixel-per-plane) + 7)/8) * planes * ((y2 - y1) + 1)
Eli jos SCREEN 13 on kyseessä, on meillä 8 bittiä per pikseli, sekä 1 plane. Kaava on siis
4 + INT(((x2 - x1 + 1) * 8 + 7)/8) * ((y2 - y1) + 1)
Tuokin 1.9 -taktiikka tulee melko lähelle mutta ainahan muutaman tavun säästöstä hyötyä on kun kyse on QB-soodauksesta :)
Tutkin vähän asiaa, ja näyttää siltä, että tuota monimutkaisempaa kaavaa kannattaa tosiaankin suosia. Tapojen välinen kokoero voi nimittäin olla melkein kaksinkertainen. Tässä vähän testituloksia näyttötilassa 13.
Tapa A = (x2 - x1) * (y2 - y1) * 2
Tapa B = 4 + INT(((x2 - x1 + 1) * 8 + 7)/8) * ((y2 - y1) + 1)
10x10-alue: A = 200 tavua, B = 125 tavua (62,5%)
20x20-alue: A = 800 tavua, B = 445 tavua (55,6%)
30x30-alue: A = 1800 tavua, B = 965 tavua (53,6%)
40x40-alue: A = 3200 tavua, B = 1685 tavua (52,7%)
50x50-alue: A = 5000 tavua, B = 2605 tavua (52,1%)
Toivottavasti laskut menivät oikein. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.