Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Taustan laitto muistiin...

Grey [21.02.2003 16:43:35]

#

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-

Antti Laaksonen [21.02.2003 21:43:53]

#

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

thefox [22.02.2003 18:35:46]

#

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 :)

Antti Laaksonen [22.02.2003 20:28:12]

#

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. :)

Vastaus

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

Tietoa sivustosta