Kirjoittaja: Antti Laaksonen (2003).
Opassarjan ensimmäinen osa käsitteli TI-89 Basicin perusteita - muuttujia, ehto- ja silmukkarakenteita, aliohjelmia jne. Nyt on kuitenkin aika oppia lukemaan laskimen näppäimistöä ja piirtämään grafiikkaa, sillä muuten kunnollisen pelin tekeminen ei ole oikein mahdollista.
Input
- ja InputStr
-komentojen avulla voi ohjelmanäytössä pyytää käyttäjältä tietoja, jotka tallentuvat muuttujiin. Input
on tarkoitettu numeerisen tiedon ja InputStr
merkkijonojen lukemiseen. Tietojen luku päättyy ENTER-näppäimen painallukseen.
Seuraava ohjelma kysyy pelaajan nimen ja pelin vaikeustason, sekä tallentaa nämä tiedot muuttujiin nimi ja vtaso myöhempää käyttöä varten.
InputStr "Nimi:",nimi Input "Vaikeustaso:",vtaso
Request
-komento tuo näyttöön ikkunan, jossa on tekstikenttä. Tekstikenttään kirjoitettu teksti tallentuu muuttujaan, ja muuttujan arvo ennen ikkunan näyttämistä on tekstikentän oletusarvo.
"Nimetön"→nimi Request "Kirjoita nimesi:",nimi
PopUp
-komento tuo esiin irrallisen valintalistan, josta käyttäjän täytyy valita yksi annetuista vaihtoehdoista. Vaihtoehdot määritetään merkkijonomuotoisen listan avulla, ja ne numeroidaan yhdestä alkaen. Parametrina olevaan muuttujaan tulee tieto, monennenko vaihtoehdon käyttäjä valitsi. Muuttujan arvo ennen listan näyttämistä on myös oletusvaihtoehdon numero.
2→vtaso PopUp {"1", "2", "3"}, vtaso
Monimutkaisempien valintaikkunoiden tekoon on olemassa Dialog
-rakenne, joka voi sisältää Title
-, Text
-, Request
- ja DropDown
-elementtejä. Valintaikkunan elementit määritetään Dialog
- ja EndDlg
-sanojen välissä.
Title
on valintaikkunan yläpalkissa näkyvä otsikko.Text
näyttää tavallista tekstiä ikkunassa, kuten ohjeita muiden kenttien täyttämiseen.Request
luo tekstikentän, joka käyttäytyy samoin kuin tässä kappaleessa aiemmin esitelty Request
-ikkuna.DropDown
luo alasvetovalikon, jonka avulla käyttäjä voi valita haluamansa vaihtoehdon listasta.Seuraava ohjelma luo valintaikkunan, joka sopisi pelin alkuun. Pelaajaa pyydetään kirjoittamaan nimi ja valitsemaan vaikeustaso, jonka jälkeen peli voi alkaa. Toinen Text
-komento aiheuttaa tyhjän rivin ja on mukana, jotta ikkunasta ei tulisi liian ahdas.
Dialog Title "Tervetuloa peliin!" Text "Kirjoita tiedot alle ja paina ENTER." Text "" Request "Nimi", nimi DropDown "Vaikeustaso", {"1", "2", "3"}, vtaso EndDlog
Tähän mennessä esitetyt tavat lukea näppäimistöä sopivat lähinnä tietojen keräämiseen pelin alussa ja muihin tämäntapaisiin kiireettömiin valintoihin. Reaaliaikaiset pelit vaativat toisenlaisen menetelmän näppäimistön lukemiseen, ja tämä menetelmä on funktio getKey
, joka palauttaa painettuna olevan näppäimen näppäinkoodin. Funktio pystyy lukemaan lähes kaikkia laskimen näppäimiä.
Seuraava ohjelma lukee käyttäjän painamia näppäimiä, ja näyttää niiden näppäinkoodit ohjelmaikkunassa, kunnes käyttäjä painaa ESCiä (näppäinkoodi 264). Jos näppäinkoodi (k-muuttuja) on eri kuin edellinen näppäinkoodi (v-muuttuja), se tulostetaan ohjelmanäytölle. 0 tarkoittaa, että mitään näppäintä ei ole painettu - silloin ei näppäinkoodia myöskään tulosteta.
0→k 0→v Disp "ESC sulkee ohjelman." Loop getKey()→k If k=264 Exit If k≠v and k≠0 Then Disp k k→v EndIf EndLoop
Ohjelman avulla voi tutkia eri näppäinten palauttamia koodeja, ja laskimen ohjekirja sisältää myös täydellisen luettelon niistä. Huomaa, että näppäintä ennen mahdollisesti painettu muunnosnäppäin (2nd, nuoli ylöspäin, vihreä vinoneliö, alpha) muuttaa näppäinkoodin toiseksi.
Peliohjelmoijan kannalta tärkeitä näyttöjä ovat perusnäyttö, ohjelmanäyttö ja grafiikkanäyttö. Perusnäyttö on laskimen käyttöjärjestelmän alin taso, jonne pääsee aina HOME-näppäimellä. Ohjelmanäytössä näkyy ohjelman tulostama teksti ja käyttäjä voi myös välittää tietoa ohjelmalle sen kautta. Grafiikkanäyttö taas on grafiikan esittämiseen tarkoitettu paikka, jossa näkyvät mm. funktioiden kuvaajat.
Siirtyminen kunkin näytön välillä tapahtuu kolmella komennolla: DispHome
siirtyy perusnäyttöön, Disp
siirtyy ohjelmanäyttöön (sama komento tulostaa tekstiä, jos sille annetaan parametri) ja DispG
siirtyy grafiikkanäyttöön.
Perusnäytön tyhjentämiseen on komento ClrHome
, ClrIO
tekee saman ohjelmanäytössä ja ClrDraw
tyhjentää grafiikkanäytön.
Koska ohjelmanäyttöön voi tulostaa ainoastaan tekstiä, pelin grafiikka on piirrettävä grafiikkanäyttöön. Grafiikkanäyttöön piirretään myös funktioiden kuvaajat, minkä vuoksi kuvaajan akselit tai ruudukko saattavat sotkea pelin grafiikkaa. Ne kannattaakin kytkeä väliaikaisesti pois setGraph
-funktiolla. Kohteliasta laskimen käyttäjälle on palauttaa pelin lopuksi asetukset takaisin. Seuraavassa ohjelmassa pisteet kuvaavat itse peliä.
setGraph("Axes","Off")→axes setGraph("Grid","Off")→grid . . . setGraph ("Axes",axes) setGraph ("Grid",grid)
Grafiikan paikan määrittämiseen käytetään kahdenlaista asteikkoa: pikselikoordinaatit ja pistekoordinaatit. Pikselikoordinaateilla on kiinteä asteikko (leveyssuunnassa 0 - 158 ja korkeussuunnassa 0 - 76), kun taas pistekoordinaattien asteikko riippuu kuvaajan asetuksista. Pikselikoordinaattien käyttö peleissä on järkevintä, sillä muuten peli toimisi oikein vain niillä kuvaaja-asetuksilla, mitkä laskimessa sattuu pelin ohjelmointihetkellä olemaan.
Kaikkien grafiikkakomentojen koordinaatit ilmoitetaan järjestyksessä y, x, eli ensin paikka pystyakselilla ja sitten vaaka-akselilla.
Yksittäisten pikseleiden käsittelemiseen on funktiot PxlOn
, PxlOff
ja PxlChg
. PxlOn
sytyttää pikselin, PxlOff
sammuttaa pikselin ja PxlChg
vaihtaa pikselin tilan päinvastaiseksi. Lisäksi PxlTest
-funktio palauttaa pikselin tilan.
Seuraava esimerkkiohjelma on monivaiheinen. Ohjelma sytyttää ensin kolme samalla suoralla olevaa pikseliä. Sen jälkeen ohjelma sammuttaa ensimmäisen, vaihtaa toisen tilaa kaksi kertaa ja lopuksi tulostaa kolmannen pikselin tilan ohjelmanäyttöön. Jokaisen vaiheen välillä odotetaan Pause
-komennolla, että käyttäjä painaa ENTER-näppäintä.
PxlOn 10,10 PxlOn 10,20 PxlOn 10,30 Pause PxlOff 10,10 Pause PxlChg 10,20 Pause PxlChg 10,20 Pause Disp PxlTest(10,30)
Viivojen piirtämiseen tarkoitettu komento on PxlLine
. Parametrit ovat alkukoordinaatit, loppukoordinaatit ja piirtotapa. Piirtotavasta riippuen viiva piirretään (1), pyyhitään pois (0), tai sitten käännetään kaikki viivan kohdalle sattuvat pikselit (-1).
Seuraava ohjelma piirtää kolme viivaa, ensin vaakasuoran, sitten pystysuoran ja lopuksi vinon.
PxlLine 10,10,10,80,1 PxlLine 20,60,40,60,1 PxlLine 30,20,70,80,1
PxlCrcl
piirtää ympyrän. Komennon parametrit ovat ympyrän koordinaatit, säde ja piirtotapa. Mahdolliset piirtotavat ovat samat kuin PxlLine
-funktiossa.
Seuraava ohjelma piirtää kolme sisäkkäistä ympyrää, joiden säteiden pituus on 30, 20 ja 10 pikseliä.
PxlCrcl 40,40,30,1 PxlCrcl 40,40,20,1 PxlCrcl 40,40,10,1
Tekstin tulostaminen grafiikkanäyttöön onnistuu PxlText
-komennolla, jonka parametreja ovat tulostettava teksti ja sen koordinaatit.
Seuraava ohjelma tulostaa vinosuuntaisesti viisi kirjainta, joista muodostuu sana "testi".
PxlText "t",10,10 PxlText "e",15,20 PxlText "s",20,30 PxlText "t",25,40 PxlText "i",30,50
Kuvien tallennusmuoto on Picture-tyyppinen muuttuja, ja niiden luomiseen on kolme tapaa: piirto-ohjelman käyttäminen, näytöltä kopioiminen ja matriisin pohjalta muodostaminen.
Piirto-ohjelma toimii grafiikkanäytössä, jonne pääsee esim. GRAPH-näppäintä painamalla (vihreä vinoneliö + F3). Mahdolliset funktioiden kuvaajat kannattaa ensin kytkeä pois, jonka jälkeen grafiikkanäytön voi tyhjentää F4-näppäimellä.
Piirtäminen tapahtuu Pen-valikon (F7) kautta, joka sisältää yleisimmät piirtotyökalut, kuten piste, viiva, ympyrä ja teksti.
Kun kuva on valmis, sen voi tallentaa samaisen valikon Save Picture -komennolla. Kuvan rajat valitaan nuolinäppäimillä, minkä jälkeen sen tallennusnimi kirjoitetaan näytölle avautuvaan ikkunaan.
Kuvan voi myös kopioida grafiikkanäytöltä. Tämä tapahtuu StoPic
-komennolla, jonka parametrit ovat kuvan nimi, kopioitavan alueen koordinaatit ja kopioitavan alueen leveys ja korkeus. Jos viimeisiä parametreja ei anneta, kuvaan kopioidaan koko grafiikkanäytön sisältö.
Seuraava ohjelma tyhjentää grafiikkanäytön, piirtää ympyrän ja kopioi sen kuva1-muuttujaan.
ClrDraw PxlCrcl 55,55,4,1 StoPic kuva1,50,50,10,10
Kolmas tapa on luoda kuva matriisin pohjalta NewPic
-komennolla. Matriisi sisältää kuvan kaikkien sytytettyjen pikselien koordinaatit. Tällä tavalla kuvan voi luoda ilman grafiikkanäytön näkymistä. Komennon parametrit ovat matriisi, kuvan nimi sekä kuvan korkeus ja leveys. Kaksi viimeistä parametria eivät ole pakollisia; jos niitä ei ole, kuvan koko on pienin alue, jolle annetut pikselit mahtuvat.
Seuraava ohjelma luo vinoneliön näköisen kuvan, joka tallennetaan muuttujaan kuva2.
NewPic [1,3;2,2;2,4;3,1;3,5;4,2;4,4;5,3],kuva2
Laskimen muistiin tallennettuja kuvia voi katsoa grafiikkanäytössä Tools-valikon Open-komennon avulla. Kuitenkaan peleihin tällainen tapa näyttää kuvia ei sovellu.
Kuvien piirtämiseen grafiikkanäyttöön onkin olemassa komennot AndPic
, RclPic
ja XorPic
. Komentojen parametrit ovat kuvan nimi ja kuvan koordinaatit.
AndPic
piirtää kuvan and-logiikalla: jos pikseli on sytytetty sekä grafiikkanäytöllä että kuvassa, se näkyy.RclPic
piirtää kuvan or-logiikalla: jos pikseli on sytytetty grafiikkanäytöllä tai kuvassa, se näkyy.XorPic
piirtää kuvan xor-logiikalla: jos pikseli on sytytetty grafiikkanäytöllä tai kuvassa, mutta ei molemmissa, se näkyy.Seuraava ohjelma piirtää edellisessä kappaleessa StoPic
-komennolla kopioidun ympyrän kolmeen paikkaan näytöllä käyttäen RclPic
-komentoa.
RclPic kuva1,20,20 RclPic kuva1,40,80 RclPic kuva1,60,60
Animaation toteutustapa on seuraava: piirretään kuva, lasketaan uudet koordinaatit, poistetaan kuva, piirretään uusi kuva.
Seuraava ohjelma luo animaation, jossa ympyrä liikkuu mutkitellen näytön läpi. Ympyrän liikeradan x-koordinaatti tulee suoraan For
-silmukasta, ja y-koordinaatti lasketaan sinifunktiolla (ohjelma olettaa, että kulmat ilmoitetaan radiaaneissa) sopivin kertoimin. Muuttuja a sisältää vaakasuuntaisen liikkeen nopeuden. Ympyrä sekä piirretään että poistetaan XorPic
-komennolla.
1→a For x,0,145,a int(40+sin(x/5)*10)→y If x-a≥0 XorPic kuva1,vy,x-a XorPic kuva1,y,x y→vy EndFor
Seuraava ohjelma taas yhdistää animaation ja näppäimistön lukemisen saaden aikaan nuolinäppäimillä ohjattavan ympyrän. Nuolinäppäinten näppäinkoodit ovat 337 vasemmalle, 338 ylös, 340 oikealle ja 344 alas. Ympyrän nykyinen paikka on x- ja y-muuttujissa, ja vanha paikka vx- ja vy-muuttujissa. Jos nykyinen ja vanha paikka eroavat toisistaan, ympyrä piirretään uudestaan. Ohjelma päättyy ESCiä painamalla.
75→x 35→y 0→vx 0→vy Loop getKey()→n If n=264 Then Exit ElseIf n=337 Then x-1→x ElseIf n=338 Then y-1→y ElseIf n=340 Then x+1→x ElseIf n=344 Then y+1→y EndIf If x≠vx or y≠vy Then XorPic kuva1,vy,vx XorPic kuva1,y,x x→vx y→vy EndIf EndLoop
Pelin tekoon tarvittavat taidot rupeavat pikku hiljaa olemaan koossa. Opassarjan kolmannesta ja viimeisestä osasta löytyy kaksi valmista peliä ja niiden toiminnan esittely alusta loppuun.
Antti Laaksonen, 29.7.2003
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.