2. Interaktiivisia sovelluksia
Jotta voimme tehdä interaktiivisia sovelluksia, joita käyttäjä ohjaa
hiirellä tai näppäimistöllä tai joka reagoi tietokoneen sisäiseen kelloon,
meillä pitää olla käytössä message loop, joka toimii ”liimana” oman
koodimme ja tietokoneen laitteiston välillä. Racket:issä sen nimi on big-
bang.
Interaktiiviset ohjelmat vaativat kirjaston 2htdp/universe
(require 2htdp/universe)
2
4. 2htdp/universe
Kirjasto sisältää big-bang:in lisäksi animate-funktion, jonka avulla
voidaan tehdä yksinkertaisia animaatioita.
Racket perusteet tehtävissä otamme valmiin ohjelmapohjan, jossa big-
bang tai animate on alustettu valmiiksi, joten emme käsittele niitä tässä
yhteydessä kovin tarkasti (lisätietoa käsikirjassa).
Tärkeintä on ymmärtää se, että big-bang kutsuu käyttäjän tekemiä
funktioita tarvittaessa, antaa niille ohjelman tilamuuttujan, ottaa
vastaan päivitetyn tilamuuttujan, pitää sen tallessa ja välittää sen muille
funktioille. Tilamuuttuja on eri ohjelmissa erilainen, riippuen ohjelman
tarpeista.
4
5. animate
(aika muuttujana)
animate – funktio kutsuu siihen ”liimattua” funktiota 28 kertaa
sekunnissa antaen argumenttina kokonaisluvun, joka kasvaa jokaisella
kutsukerralla yhdellä
Esim.
(animate kuva)
Kutsuu kuva-funktiota näin:
(kuva 0)
(kuva 1)
(kuva 2)
(kuva 3)
...
5
(define (kuva t)
(place-image
(circle t ”solid” ”red”)
150 150
(empty-scene 300 300)))
”liima” oma koodi
6. modulo
Animaatioissa on usein jakso, joka toistuu. Aika kulkee kuitenkin aina
eteenpäin, joten jos haluamme palata takaisin lähtöpisteeseen (aika = 0)
tarvitsemme modulo:a. Modulo ottaa osamäärän jakojäännöksen, eli
rajoittaa arvon tietylle välille.
Esim.
Lisätään apufunktio ”rullaava-kuva”:
6
(define (rullaava-kuva t)
(kuva (modulo t 220)))
(animate rullaava-kuva) animate:ssa tilamuuttujana on aika
8. (0, 0)
(150, 50)
x
y
150
250
(0, 0)
(150, 250)
x
y
150
250
(0, 0)
(150, 450)
x
y
150
250
Kun y muuttuu, ufo liikkuu...
y=50 y=250 y=450
9. big-bang
(animaatio)
(require 2htdp/image)
(require 2htdp/universe)
(define UFO (overlay/xy
(ellipse 120 40 "solid" "violet")
30 -25
(circle 30 "outline" "black")))
(define (piirrä-kuva y)
(place-image UFO 150 y (empty-scene 300 500)))
(define (siirrä-ufo y)
(+ y 1))
(big-bang 0
(to-draw piirrä-kuva)
(on-tick siirrä-ufo))
9
Enemmän mahdollisuuksia, kun
tilamuuttujana voi olla muukin kuin aika
lähtötila, y=0
siirrä-ufo-funktiota kutsutaan
28 kertaa sekunnissa
10. ufo rullaa
(muutetaan y:tä)
Lisää ehtolause tai valintalause ufon y-koordinaatin päivittämiselle:
(define (siirrä-ufo y)
(if (< y 500)
(+ y 1)
0))
10
tilamuuttujana y
piirrä-kuva – funktio tuottaa tämän
kuvan
siirrä-ufo – funktio päivittää y:tä
big-bang hoitaa kaiken muun
11. big-bang
(hiiriohjelma)
Saamme ”liimakoodin” kautta x ja y koordinaatit, jossa hiiri on tai jossa sitä
on klikattu. Tämän perusteella voidaan muuttaa ohjelman toimintaa.
Ohjelman logiikka on ”hiiri” – funktiossa:
(define (hiiri k x y tapahtuma)
(if (< x 150)
(place-image (oma-kuva "black") x y k)
(place-image (oma-kuva "red") x y k)))
(big-bang KUVA
(to-draw piirrä)
(on-mouse hiiri))
11
tilamuuttujana on
nyt kuva