Skriptid, protseduurid ja käsud

Skript on Scratchi programmi suhteliselt sõltumatu üksus. Mõnedes programmeerimiskeeltes nimetatakse taolisi üksusi protseduurideks või funktsioonideks.
Skript on alati seotud kindla spraidiga või lavaga ning saab täita tegevusi ainult antud objektiga. Spraidil ja laval võib olla suvaline hulk skripte.  Skript koosneb päiseplokist ja ühest või mitmest pinuplokist.
Antud materjalis käsitletakse skriptide koostamise tehnilisi küsimusi ning toodud on kõikide käsuplokkide lühikirjeldused gruppide kaupa. Kirjeldused on seotud abiinfo materjalidega, kus iga käsu kohta on antud põhjalikumad selgitused ja näited.

Skriptide koostamise põhimõtted

Näide. Auto liikumine

Selle näite peal selgitakse skriptide loomise ja kasutamise iseärasusi. Vaadake, kuidas see töötab ja edasi skriptide ja käskude kasutamist.
Vajutusega tühik klahvile pannakse auto sõitma. Klahvidega ülesnool ja allanool saab muuta auto kiirust. Kui see läheb nulli, jääb arvuti seisma ja rakendus lõpetab töö, Kohe peale käivitamist "lendab" Kraps ülesse ja joonistab sellele ringi. Näite peamine eesmärk on näidata rakenduse jagamist skriptideks ja erinevat liiki käskude kasutamist. Projekti tööd ja skripte saab vaadata ja laadida alla lingilt.

 

Käsuplokkide grupid

Scratch käsud ja plokid on jagatud funktsioonide alusel kümnesse gruppi. Lipikud gruppide nimedega asuvad kasutajaliidese ülemises ääres: lava ja skriptide ala vahel. Kui klõpsata lipikut grupi nimega, kuvatakse allpool olevas alas gruppi kuuluvate käskude plokid. Korraga saab olla aktiivne üks grupp. Pildil on selleks grupp Liikumine, nähtaval on osa selle plokkidest.
Skriptide alas on toodud auto skriptid: neid on kolm. Skriptides on kasutusel käsuplokid üheksat grupist, puuduvad ainult käsud grupist Pliiats. Neid võib näha Krapsu skriptides.
gr
Põhiskripti abil imiteeritakse auto ringliiklust laval. Käsuga [võta kiirus=10] (grupp Andmed] võetakse muutuja kiirus väärtuseks 10. Käsk [teata Uus_kiirus...] (grupp Sündmused) käivitatakse skript Uus_kiirus. Käsk [pane x...] (Andmed) viib auto lava vasakusse serva. Käsk [mängi heli...] (Helind] mägid antud nimega helindi. Käsuga [teata Joonista] (Sündmused) saadetakse teade Krapsule. Liitkäsu [korda kuni...] (Juhtimine) päises kasutatakse võrdlemise plokki grupist Tehted. Käsu [korda kuni...] sees on kasutusel kasutaja plokk Ringi(), mis käivitab vastava alamprotseduuri, vt allpool. Kahes kui-käsus kasutatakse tingimusena plokke [klahv...all] grupist Andurid ja omistamiskäske [muuda...] grupist Andmed. Kordus lõpeb, kui kiirus viiakse nulli, ning auto viikse käsuga [liigu...sek...] (grupp Liikumine) sujuvalt lava keskele. Ning lõpus käsk [teata Alla] saadab teate Krapsule, et see tuleks seina pealt alla. Skriptil on alamskript Uus_kiirus ja alamprotseduur Ringi().
Skript Uus_kiirus võimaldab kasutajal muuta algkiirust, mille väärtuseks peaskript võtab 10. Käsuga [küsi...] (grupp Andurid) pakutakse kasutajal võimalust muuta väärtust või jätta see endiseks. Kui kasutaja ei sisesta mingit väärtust, vaid vajutab kohe klahvile Enter, loetakse, et tegemist oli nn tühja väärtusega ja olemasolevat väärtust ei muudeta: käsk [kui ...] (grupp Juhtimine) ja käsk [võta,,,] (grupp Andmed).
Protseduur Ringi(kiirus) (grupp Lisaplokid] viib auto käsuga [liigu...] (grupp Liikumine] edasi kiirus pikslit, teeb käsuga [oota..] (Juhtimine) väikese pausi. Käsuga [kui x>240 siis] (Juhtimine) kotrollitakse, kas on jõutud parema servani. Käsu sees kasutakse võrdlemise ploki (x>240) grupist Tehted. Kui tingimus on tõene, siis käsuga [peida] (grupp Välimus) auto peidetakse. Käsus [paus...] (grupp Juhtimine) kasutakse juhuarvude funktsiooni grupist Tehted. Edasi viiakse auto vasakusse serva ja tehakse nähtavaks.
Alamprotseduurid ja nendega seotud nn kasutaja käsuplokid, on kasutusel alates versioonist 2.0. Alamprotseduuri eripäraks on võimalus kasutada sisendparameetreid, mis saavad väärtusi argumentidelt. Siin on parameetriks kiirus. Kasutaja plokkide loomist vaadeldakse eraldi.
Krapsul on ka kolm skripti. Siin on peamiselt tegemist just grupi Pliiats käskudega. Põhiskript Joonistamine on seotud ringi joonistamisega. Käsk [mine...] viib Krapsu seinale. Edasi lastakse pliiats alla ja käsuga [korda 30], mille sees on käsud [liigu...] ja [pööra 12], joonistakse ring. Peale seda tõstetakse pliiats ülesse. Rakenduse käivitamisel kustutakse eelmine ring ning valitakse joone värv (0 - punane) ja paksus (3 pikslit). Skript Alla kustutab pildi ja viib Krapsu seinalt alla.

joon

Kuna praegu on põhieesmärgiks näidata skriptide ja protseduuride võimaliku kasutamist, on rakendus jagatud üsna mitmeks väikseks üksuseks. Üldiseks peaks mainima, et ei tasu teha väga suuri skripte. Jagamine võiks toimuda eeskätt funktsionaalsuse alusel: andmete sisestamine, joonistamine, algseaded jmt.

Plokkide ühendamine ja skriptide redigeerimine

Skripti loomiseks peab lohistama vajalikud plokid plokkide alast skriptide piirkonda ehk moodulisse. Siin tekkib ploki koopia, originaal jääb oma kohale.
Klõpsates plokki hiire parempoolse nupuga käsuplokide alas või skriptis ja valides ilmuvast menüüst käsu abi (help), saab abiinfot ploki kohta, mis ilmub skriptide ala paremas servas. Abiinfo on iga ploki kohta ja põhimõte on kõikide jaoks analoogiline. Näiteks on toodud abiinfo ploki [liigu …] ja [korda kuni...]. Praegu on seis selline, et skriptide pildid on inglise keeles, selgitused - eesti keeles. Loomulikult, kui lülituda inglise keelele, on kogu info inglise keeles. Abiinfot v'ib saada kui klõpsata linki.

liigu
kuni

Skripti (protseduuri) loomiseks ühendatakse plokid pinuks (stack). Spetsiaalsed plokkide liidese elemendid võimaldavad ühendada plokke ainult ühel viisil. Plokke saab lisada pinu ette, keskele ja lõppu. Kui lohistada plokki skripti (pinu) olemasoleva osa kohal, näitab valge riba kohta, kuhu saab panna ploki nii, et see ühenduks teiste plokkidega.

lisa1
lisatud
pk

Paremklõps pinul kuvab menüü, kus pakutakse võimalust paljundamiseks, eemaldamiseks, kommentaari lisamiseks või abiinfo saamiseks.
Ploki eemaldamiseks skripti alast ehk moodulist, lohistada see plokkide piirkonna ala suvalisse kohta ja plokk kaob. Pinu (skripti) saab teisaldada skriptide alas, vedades seda ülemisest plokist. Kui lohistada välja plokk pinu keskelt, tulevad sellega kaasa kõik allpool olevad plokid. Klõps skripti (pinu) suvalisel kohal käivitab selle plokkide järjestikuse täitmise ülevalt alla.
Skripte saab kopeerida ühelt spraidilt teisele, lohistades ühe spraid skripti teise spraidi ikooni kohale. Kasutades Seljakotti, saab skripte ja protseduure viia ühest projektist teise. Seljakott asub skriptide ala all ning avaneb ja sulgub noolekese abil. Ülekanda saab ka spraite, kui spraidil on skripte, on need ka kaasas.

seljakott

Võimalus lihtsalt vahetada skripte ja protseduure spraitide ja projektide vahel, on üheks oluliseks motivatsooniks projektide jagamiseks osades. Saab näiteks luua skriptide kogumi, mida võib korduvalt kasutada erinevates rakendustes,

Plokkide tüübid

Eristatakse kolme plokitüüpi: pinuplokid, päiseplokid ja viiteplokid.
Pinuplokid (Stack Blocks). Sellistel plokkidel nagu ytle  ja porka on õõnsus üleval ja muhk all, nende abil saab plokke ühendada pinuks. Mitmetel pinuplokkidel on sees väljad, mis on ette nähtud vajalike väärtuste ehk argumentide esitamiseks. Näiteks plokis liigu on argumendiks pikselite arv, plokis  mineon argumentideks sihtkoha koordinaadid (x ja y). Tavaliselt on nendes väljades mingid väärtused: näiteks 10 plokis [liigu 10 sammu] ja nullid plokis [mine x: 0 y: 0]. Need väärtused võib asendada, tippides väljadesse uued vajalikud väärtused (konstandid), näiteks liigu ja  mjne või paigutades välja muutuja viiteploki või avaldise, näiteks liigu3 ja mine3.
Mõnedel plokkidel on rippmenüüd, kust saab valida vajaliku väärtuse nagu „hiir“ plokis osuta ja „näu“ plokis mängi heli  osuta, mangi. Tegemist on samuti argumentidega.
Pinuplokkidesse, millel on C-kujuline "suu" nagu siin korda, saab paigutada teisi pinuplokke. Sellisel juhul on tegemist nn liitplokkidega. Liitplokk võib sisaldada teisi liht‑ ja liitplokke. Ülaltoodud auto skriptis sisaldab liitplokk [korda kuni tingimus] ühte lihtplokki Ringi(kiirus) ja kahte liitplokki kui.
Pinuplokid moodustavad põhiosa plokkidest. Nende abil saab määrata vajalikke tegevusi spraitidega ja juhtida tegevuste täitmise järjekorda: kirjeldada valikuid, kordusi jms. Teistes programmeerimiskeeltes vastavad taolistele plokkidele laused või pöördumised protseduuride poole.
Päiseplokid (Hats). Sellistel plokkidel nagu see pea , on kumer ülemine serv ja all on ühendamiseks muhk. Päiseplokid paigutatakse pinude peale ja need reageerivad vastavatele sündmustele: vajutus etteantud klahvile (näiteks tühik), spraidi või lava klõpsamisele, teate saabumisele teiselt skriptilt jms. Sündmuse esinemisel käivitatakse päiseploki all olev skript.
Viiteplokid (Reporters). Need plokid, nagu suund ja hiir , on ette nähtud teiste plokkide sisendalade täitmiseks.
Ümardatud otstega viiteplokid, nagu muut, suund ja aval võimaldavad viidata arvudele ja stringidele, kasutades muuhulgas ka muutujaid ja avaldisi. Neid paigutatakse ümardatud otstega ristkülikukujulistesse avadesse, nagu muuda ja yt  .
Teravatipuliste otstega viiteplokid, nagu hiir ja ting viitavad tingimustele ja loogilistele väärtustele (tõene või väär) ning neid saab paigutada teravatipulistesse ja ristkülikukujulistesse avadesse, nagu oota ja  y3.
Mõnede viiteplokkide ees on märkeruut (näiteks muut ), mida klõpsates ilmub (või kaob) laval nn monitor ehk näidik, milles kuvatakse antud viiteploki (muutuja, spraidi omaduse, anduri) väärtus. Viimase muutumisel uuendatakse ka monitoris olev väärtust. Monitor võib kuvada viiteploki väärtust mitmes erinevas vormingus.

Scratchi programmide struktuurist ja töökorraldusest

Üldjuhul koosneb Scratchi programm mitmest skriptist. Programmide struktuur ja töökorraldus programmis võib olla väga erinev. Näiteks võib programm koosneda ühest nn peaskriptist ja mitmest alamskriptist, mis töötavad järjestikku.
Kasutaja käivitab peaskripti, mis käivitab järjest alamskripte vastavalt ettenähtud järjestusele ja tingimustele. Iga alamskript võib pöörduda omakorda alamskriptide poole ning nende töö võib toimuda paralleelselt.
Programmi töö võib olla organiseeritud nii, et kasutaja korralduse alusel hakkavad kohe paralleelselt tööle mitu skripti, millest igaüks võib omakorda käivitada järgmise taseme skripte jne.

sk

Projektis võib olla ka mitu teineteisest sõltumatud programmi, millest igaüks võib koosneda ühest või mitmest skriptist. Kasutaja võib neid käivitada erinevatel ajahetkel kas järjestikku või paralleelselt.

Programmide ja skriptide käivitamine ja peatamine

Programmide ja skriptide käivitamiseks võivad kasutaja jaoks olla ette nähtud järgmised võimalused:

  • klõpsata rohelist lippu,
  • klõpsata ettenähtud spraiti ja/või lava,
  • vajutada etteantud klahvile: tühik, nooleklahv, täheklahv jm

Põhimõtteliselt on tegemist nn sündmuspõhise lähenemisviisiga. Ülalnimetatud variantide jaoks on erinevad päiseplokid. Kui toimub vastav sündmus, käivitub antud päiseploki all olev skript. Kui sama päisega on mitu skripti, hakkavad nad tööle paralleelselt

pai

Kasutaja saab suvalisel hetkel katkesta projekti kõikide skriptide töö, klõpsates punast nuppu.

Koostöö skriptide vahel

Scratchis on koostöö skriptide (spraitide) vahel rajatud teadete saatmisele ja vastuvõtmisele. Käsuplokiga [teata nimi] või [teata nimi ja oota] väljastatakse teade (signaal), mille võib vastu võtta ja käivituda suvaline skript päisega [kui teade nimi], kus nimi on sama nagu käsus teavita. Tegemist võib olla sama spraidi skriptidega või teise spraidi omadega. Vt ka Algoritmimine.
Oluline on arvestada, et käsu [teata nimi] korral jätkub antud skripti täitmine kohe, käsu [teata nimi ja oota] toimel antud skripti töö peatakse ja see jätkub alles siis, kui on lõpetanud oma töö kõik skriptid, mis reageerisid teatele nimi.

Näide. Kolme auto võidusõit

Kolm autot sõidavad laval etteantud arvu „ringe“: liiguvad lava vasakust servast parema servani juhusliku sammuga (10 kuni 20). Servani jõudnud auto peidetakse korraks (1 kuni 3 sek) ja viiakse lava vasakusse serva, kus see ilmub uuesti nähtavale.

 

Projekti põhiskriptid

auto3 hyppa
a3pea
Programm - Krapsu põhiskript - käivitub vajutusega klahvile tühik. Selles pannakse taimer algseisu ja käsuga [teata Start ja oota] käivitatakse kõige kolme auto skriptid. Need erinevad ainult viimase käsu poolest: [võta aegK = timer]. K = 1, 2, 3, sõltuvalt autost.
Kuna autode sõidukiirus määratakse juhuarvude abil, kulub neil sõiduks erinev aeg. Lõpuaeg omistatakse muutujale aegK viimase ringi järel. Kuna järgnevalt kasutatakse Krapsu skriptis (täpsemalt selle alamskriptis) aegu võitja selgitamiseks, ootab antud skript, kuni kõigi kolme auto skriptid on töö lõpetanud. Pöördumisel võitja selgitamise alamskripti poole, arvestatakse, et võitja nime kasutatakse käsus [mine võitja] ning sellepärast on samuti kasutusel teatamise variant [teata Kes ja oota].

Paneme tähele veel ühte skripti: Hyppa, mille toimel teeb Kraps kolm hüpet. Seda skripti kasutatakse kaks korda ja mõlemal juhul ilma lisandita oota. Esimesel korral töötab skript veidi aega paralleelselt autode sõiduga, sest põhiskript annab käsu Start, ootamata Krapsu hüppamise lõppu. Erinevus pole siin oluline, [teata Hüppa ja oota] kasutamisel autode sõidu algus lihtsalt veidi viibiks. Teine kord pannakse skript tööle, kui kõik on lõppenud ja ei ole tähtsust, kas põhiskriptis oodatakse hüppamise lõpuni või mitte.
Tegevuste jaotamine spraitide vahel ning töökorraldus sõltub ülesande iseloomust, spraitide jaoks ettenähtud tegevustest jm. Teatud osas aga võivad valikud olla erinevad ja üsna suvalised ning sõltuvad projekti looja soovidest ja kogemustest. Näiteks toodud autode võidusõidu projektis on kindel, et igal autol peab olema vähemalt üks skript, sest skript saab määrata tegevusi ainult ühe spraidi jaoks, mille moodulis ta asub. On ka selge, et skriptid peaks töötama paralleelselt. Krapsu kasutamine nö „kohtunikuna“ on üsna suvaline lahendus. Tegevuste jagamine skriptideks ei ole siin ka põhimõtteliselt oluline. Võib olla hoopis üks nö „suur“ skript, milleks on määratud kõik tegevused. Muidugi peaks siis kordama kaks korda käske hüppamise kirjeldamiseks.
Võimalus kasutada ühte skripti korduvalt on sageli oluliseks põhjuseks alamskriptide kasutamiseks. Võitja selgitamise käskude eraldamine omaette skriptiks on ka üsna tüüpiline lahendus - siin on tegemist tegevuste jaotamisega funktsiooni järgi. Muide, selle skripti võiks viia ka mõne teise spraidi või lava moodulisse.