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-
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.
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-
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
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
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-
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
Jooh, eiköhän tuo vaikuta riittävän nopealta. Kiitokset vain vastanneille, ja nyt sitten suunnittelemaan esinevalikoita.
-Grey-
Aihe on jo aika vanha, joten et voi enää vastata siihen.