Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Merkkien tallennus ja lataus

Sivun loppuun

Grey [19.06.2003 12:52:06]

#

Olen tässä väsäämässä pientä @ - merkkiseikkailupeliä. Olen kyllä aikaslailla edistynyt siinä, sillä olen jo saanut aikaan esim. liikkuvan @ - merkin, joka pysähtyy seinään törmätessä. Ja myös kartan joka tulee pikku hiljaa esille. Niin ja kaikki tämä on vielä saatu aliohjelmiinkin. Eli pääohjelman olen saanut säilymään aika selkeänä.

Vaan enpähän saa aikaan systeemiä, joka osaisi napata näytöllä näkyvät merkit ja niiden värit, että tallentaa taulukkoon, mistä sen voi kutsuttaessa laittaa takaisin ruudulle. Nimittäin jos siirrytään esim. katselemaan esinevalikoita, hahmon statuksia ym. on hyvä saada edellinen ruutu talteen.

Jos joku ymmärsi mitä tarkoitin, ja osaa antaa pienen esimerkin hommasta (kyllä, koodia en saanut itse aikaan, eli ymmärrätte varmaan) niin kiitokset jo etukäteen.

-Grey-

Tulilintu [19.06.2003 13:13:07]

#

Pelkässä teksti tilassa se mahtaa olla vähän vaikeampi operaatio, mutta mikset tekisi niin, että kun kenttä luodaan tallennetaan se jo taulukkoon ja näkyvät alueet voisi merkata toiseen taulukkoon niin, että näkyvä olisi vaikka 1 ja näkymätön nolla.

Grey [19.06.2003 14:31:15]

#

lainaus:

Pelkässä teksti tilassa se mahtaa olla vähän vaikeampi operaatio, mutta mikset tekisi niin, että kun kenttä luodaan tallennetaan se jo taulukkoon ja näkyvät alueet voisi merkata toiseen taulukkoon niin, että näkyvä olisi vaikka 1 ja näkymätön nolla.

Kuullostaa paljon.. vaikemmalta kuin nykyinen karttasysteemini, ja ehkä jopa hitaammaltakin. Ainakin kun ajattelee että sen pitäisi sitten kartalla liikuttaessa aina katsoa taulukkoa, ja tarkistuksessa menisi aikaa. Eli kannatan edelleenkin merkkien tallentamista taulukkoon ja myöhemmin sitten PRINTtaamista näytölle.

-Grey-

Sami [19.06.2003 17:03:20]

#

Itseasiassa se on suhteellisen helppoa tehdä tekstitilassa SCREEN-funktion avulla. Seuraavan esimerkin tein pikaisesti, mutta toimiva se kuitenkin on.
Se kirjoittaa ruudulle satunnaisia numeroita satunnaisen värisinä, tallentaa merkit ja niiden värit taulukkoihin, tyhjentää ruudun ja kirjoittaa merkit alkuperäisen värisenä takaisin.

CLS
' Luodaan taulukot ruudun merkeille ja väreille
DIM merkki(1 TO 24 * 80) AS STRING * 1
DIM vari(1 TO 24 * 80) AS INTEGER
RANDOMIZE TIMER

' Laitetaan ruudulle satunnaisia numeroita satunnaisen värisinä
FOR y = 1 TO 23
  FOR x = 1 TO 80
    COLOR INT(RND * 15 + 1)
    LOCATE y, x
    PRINT CHR$(RND * 9 + 48)
  NEXT
NEXT

' Tallennetaan ne alussa luotuihin taulukoihin SCREEN-funktion avulla
FOR y = 1 TO 23
   FOR x = 1 TO 80
    merkki(y * 80 + x) = CHR$(SCREEN(y, x, 0))
    vari(y * 80 + x) = SCREEN(y, x, 1)
  NEXT
NEXT

' Odotetaan ja tyhjennetään ruutu
SLEEP
CLS
SLEEP

' Kirjoitetaan taulukkoon tallennetut tiedot oikean värisinä
FOR y = 1 TO 23
  FOR x = 1 TO 80
    COLOR vari(y * 80 + x)
    LOCATE y, x
    PRINT merkki(y * 80 + x)
  NEXT
NEXT

Antti Laaksonen [19.06.2003 18:17:15]

#

SCREEN-funktion käyttäminen on ihan toimiva ratkaisu, mutta kun tiedetään tekstinäytön sijainti muistissa, BLOAD- ja BSAVE-komentojen käyttäminen on verrattomasti nopeampaa. Tekstinäyttö sijaitsee muistisegmentissä &HB800 ja vie yhteensä 4000 tavua tilaa (25 riviä, 80 saraketta; merkki vie yhden tavun, väri toisen tavun).

'ensimmäinen ruutu
CLS
PRINT "Ruutu 1"
SLEEP

'tekstinäytön muistisegmentti
DEF SEG = &HB800

'kopioidaan ruutu tiedostoon
BSAVE "ruutu.tmp", 0, 4000

'toinen ruutu
CLS
PRINT "Ruutu 2"
SLEEP

'ladataan alkuperäinen ruutu tiedostosta
BLOAD "ruutu.tmp", 0

Grey [19.06.2003 20:05:16]

#

Vaikka alempi olisi nopeampi ja pienempi, niin taivun silti tuon ylemmän suuntaan. Alemmassa kun luodaan väliaikainen tiedosto, ja juuri sellaisen käytön pyrin pitämään mahdollisimman pienenä. Vaikka olenkin jo päätynyt ylempään, se ei tarkoita ettenkö voisi vielä muuttaa päätöstäni, jos jotain parempaa ilmaantuu.

-Grey-

Antti Laaksonen [19.06.2003 21:09:28]

#

Jos et halua käyttää ohjelmassa väliaikaista tiedostoa, mutta haluat käsitellä tekstinäyttöä suoraan muistista, mikä on nopeampaa, miten olisi seuraavanlainen ratkaisu? PEEK lukee tavun muistista ja POKE kirjoittaa tavun muistiin.

'taulukko ja silmukkamuuttuja
DIM ruutu(3999) AS INTEGER, i AS INTEGER

'ensimmäinen ruutu
CLS
PRINT "Ruutu 1"
SLEEP

'tekstinäytön muistisegmentti
DEF SEG = &HB800

'kopioidaan ruutu taulukkoon
FOR i = 0 TO 3999
  ruutu(i) = PEEK(i)
NEXT

'toinen ruutu
CLS
PRINT "Ruutu 2"
SLEEP

'ladataan alkuperäinen ruutu taulukosta
FOR i = 0 TO 3999
  POKE i, ruutu(i)
NEXT

Grey [19.06.2003 21:32:18]

#

Jooh, eiköhän tuo vaikuta riittävän nopealta. Kiitokset vain vastanneille, ja nyt sitten suunnittelemaan esinevalikoita.

-Grey-


Sivun alkuun

Vastaus

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

Tietoa sivustosta