Hendelser
Skrevet av: Geir Arne Hjelle
Introduksjon
I denne leksjonen skal vi se nærmere på hvordan datamaskinene bruker såkalte hendelser for å reagere på ting som tastetrykk, museklikk og så videre. Etterhvert vil vi bli enda bedre kjent med datamaskinene, og lære hvordan vi flytter filer og programmer rundt omkring på en datamaskin eller mellom forskjellige datamaskiner.
Steg 1: Skattejakt
Datamaskiner bruker noe som kalles hendelser for å registrere tastetrykk, museklikk og så videre. Vi vil først se på hvordan vi kan lage et enkelt spill hvor vi styrer en figur med piltastene.
Sjekkliste
-
local x = 20 local y = 10 term.clear() term.setCursorPos(x, y) print('O')
Lagre og kjør programmet. Skjønner du hva det gjør? Prøv å forandre verdiene av
x
ogy
og kjør igjen. -
For å vente på hendelser bruker vi
os.pullEvent()
. Vi vil spesielt vente på taste-hendelser. Disse hendelsene kalleskey
i ComputerCraft. Forandre programmet ditt som under:local x = 20 local y = 10 term.clear() term.setCursorPos(x, y) print('O') local hendelse, tast = os.pullEvent('key') -- ny linje print(hendelse) -- ny linje print(tast) -- ny linje
Når du kjører programmet ditt nå blir programmet stående og vente til du trykker en tast. Deretter skrives teksten key samt et tall til skjermen. Teksten key betyr bare at det var en taste-hendelse som skjedde. Dette er ikke så veldig interessant for oss nå, men kan være nyttig i andre programmet om man lytter på flere forskjellige hendelser.
Tallet vi fikk er derimot veldig viktig. Hver tast på tastaturet har sin egen tastekode. Prøv å kjøre programmet flere ganger, ser du at om du trykker samme tast får du samme tall tilbake. For eksempel er
A
alltid 30, menspil opp
alltid er 200. -
local x = 20 local y = 10 term.clear() term.setCursorPos(x, y) print('O') local hendelse, tast = os.pullEvent('key') if tast == keys.q then -- ny linje print('Du trykket Q') -- ny linje else -- ny linje print('Du trykket ikke Q') -- ny linje end -- ny linje
-
local x = 20 local y = 10 while true do -- ny linje term.clear() term.setCursorPos(x, y) print('O') local hendelse, tast = os.pullEvent('key') if tast == keys.q then break -- endret linje end end -- ny linje
Når du kjører dette programmet vil det tilsynelatende ikke skje noe før du trykker
Q
, siden det er den eneste hendelsen vi har kode som reagerer på. -
local x = 20 local y = 10 while true do term.clear() term.setCursorPos(x, y) print('O') local hendelse, tast = os.pullEvent('key') if tast == keys.q then break end if tast == keys.right then -- ny linje x = x + 1 -- ny linje end -- ny linje end
Når du kjører dette programmet vil du se at du kan bruke
pil høyre
til å bevege figuren mot høyre.
Prøv selv
De andre piltastene kan du programmere selv på samme måte. Du trenger da å sammenligne med kodene keys.left
, keys.down
og keys.up
. Hvordan må du endre verdiene av x
og y
? Prøv deg frem!
Sjekkliste
-
local x = 20 local y = 10 local skattX = math.random(1, 50) -- ny linje local skattY = math.random(1, 18) -- ny linje while true do term.clear() term.setCursorPos(skattX, skattY) -- ny linje print('X') -- ny linje term.setCursorPos(x, y) print('O') if x == skattX and y == skattY then -- ny linje term.setCursorPos(1, 1) -- ny linje print('Du fant skatten!') -- ny linje break -- ny linje end -- ny linje local hendelse, tast = os.pullEvent('key') -- resten av programmet er som tidligere
Prøv spillet! Fungerer det som du hadde trodd? Klarer du å kanskje legge til flere skatter?
Prøv selv
Ved hjelp av local maxX, maxY = term.getSize()
kan du finne størrelsen på skjermen. Kan du bruke dette til å begrense figuren din slik at den ikke kan gå av skjermen?
En litt utfordrende oppgave: Prøv å skriv et tilsvarende program til en robot, men i stedet for at piltastene bare flytter en figur på skjermen skal piltastene flytte roboten!
Steg 2: Hvordan bevege seg rundt i filsystemet
Datamaskiner organiserer informasjon i filer, og disse filene legges i et filsystem. Dette filsystemet har du kanskje sett på en vanlig datamaskin i programmene Windows Utforsker eller Finder på Mac. I ComputerCraft bruker vi kommandolinjen for å se på filene. Vi skal her se på noen enkle kommandoer for å kopiere og flytte filer.
Sjekkliste
-
Datamaskinen svarer rom og skattejakt. Den første er en katalog som inneholder alle de innebygde programmene på datamaskinen (rom er en forkortelse for Read Only Memory som betyr kun-lese-minne eller skrivebeskyttet minne). Vi skal se mer på denne katalogen senere.
-
For å gå tilbake en katalog bruker du det spesielle navnet ... Skriv
cd ..
. Du vil nå komme tilbake til utgangspunktet.
Prøv selv
Du har nå sett ganske mange kommandoer: dir
, edit
, type
, mkdir
, move
og cd
. I tillegg finnes også delete
som kan brukes til å slette filer og kataloger, og copy
som brukes på samme måte som move
, men som kopierer filer i stedet for å flytte dem.
Prøv å bruke disse kommandoene til å flytte deg litt rundt i filsystemet, lag nye filer og kataloger, flytt dem rundt og så videre inntil du er ganske komfortabel med hvordan filsystemet fungerer.
Steg 3: Et bedre passord-program
Vi har tidligere laget et passord-program (Se oppgaven Bli kjent med Datamaskinen). Dette passord-programmet har et par svakheter.
-
Programmet må startes manuelt ved å skrive
passord
etter at datamaskinen er skrudd på. -
I stedet for å skrive passordet kan man bare trykke
Ctrl-T
for å stoppe programmet, og se inni programmet for å finne det hemmelige passordet.
Vi skal her se på et par triks for å gjøre passord-programmet litt tryggere.
Sjekkliste
-
local passord = 'kodeklubben' while true do term.clear() term.setCursorPos(1, 1) print('Hva er passordet?') svar = read('*') if svar == passord then redstone.setOutput('left', true) sleep(5) redstone.setOutput('left', false) end end
Kjør programmet, og sjekk at det virker som det skal.
-
Skriv
move passord startup
. Dette endre navnet på passord-programmet vårt. Vi kan nå starte datamaskinen på nytt ved å skrivereboot
. Datamaskinen vil nå direkte spørre deg om passordet. -
Skriv
edit startup
og legg til en linje øverst i koden din:os.pullEvent = os.pullEventRaw -- ny linje local passord = 'kodeklubben' while true do term.clear() term.setCursorPos(1, 1) print('Hva er passordet?') svar = read('*') if svar == passord then redstone.setOutput('left', true) sleep(5) redstone.setOutput('left', false) end end
-
Vær litt forsiktig med dette siden det ikke er noen enkel måte å få datamaskinen til å gjøre noe annet enn å spørre om passord! Men det du lærer i de to neste stegene kan være nyttig.
Steg 4: Bruk av diskettstasjoner
Vi skal nå se hvordan vi kan bruke disketter og diskettstasjoner til å flytte filer mellom forskjellige datamaskiner.
Sjekkliste
-
print('Hva heter du?') navn = read() print('Hei, ' .. navn)
Test at programmet virker ved å skrive
navn
. -
1: Steng datamaskinen.
2: Åpne diskettstasjonen, og flytt disketten til inventory'et ditt.
3: Lag en ny datamaskin, også denne med en diskettstasjon inntil seg.
4: Sett disketten inn i den nye diskettstasjonen.
5: Åpne den nye datamaskinen. Skriv
dir
ogdir disk
slik at du ser at programmet ditt er flyttet til den nye datamaskinen ved hjelp av disketten.
Hva er en diskett?
Disketter var en vanlig måte å lagre programmer og filer på fra de ble introdusert på 1970-tallet og fram til tidlig 2000-tall. Disketter var også den vanligste måten å overføre filer mellom forskjellige datamaskiner på. I nyere tid har internett, samt USB minnepenner og eksterne harddisker overtatt for diskettenes bruksområder.
Morsomt nok, lever likevel diskettene videre som det mest vanlige symbolet for å lagre filer i forskjellige programmer.
Steg 5: Skrive kode utenfor ComputerCraft
Vi kan også se på og endre programmene våre utenfor Minecraft og ComputerCraft. Dette kan være nyttig på flere måter.
1: Om vi ved et uhell ødelegger en datamaskin kan vi hente tilbake programmene på den datamaskinen, og kopiere de til en annen datamaskin.
2: Vi kan raskere kopiere filer mellom datamaskiner enn om vi bruker disketter som vi lærte i forrige steg.
3: Programmet edit
som vi bruker til å skrive programmer er ikke så lett å skrive i. Det er enklere å bruke for eksempel Notepad eller andre tekstprogrammer vi har installert.
Som du kanskje vet blir omtrent alle data i Minecraft lagret i en Minecraft-katalog på datamaskinen din. For å finne denne kan du gjøre følgende (utenfor Minecraft):
Windows: Under Windows finner du Minecraft-katalogen under %appdata%\.minecraft
. Søk etter %appdata%
i en utforsker eller i kjør-feltet etter å ha klikket start-knappen.
Mac OS X: Under Mac ligger Minecraft-katalogen i Library/Application Support/minecraft/
under hjemmekatalogen din. På norsk heter Library
Bibliotek
.
Linux: På Linux finner du Minecraft-katalogen som en skjult katalog .minecraft
rett under hjemmekatalogen din.
Finn Minecraft-katalogen din i en filutforsker. Gå videre til katalogen saves
, deretter velger du navnet på den verden du spiller nå, og til slutt katalogen computer
. Denne katalogen inneholder flere kataloger som bare har et tall som navn. Disse katalogene representerer de forskjellige datamaskinene i spillet ditt. Du vil også se en katalog som heter disk, som også har nummererte kataloger inne i seg. Disse representerer diskettene i spillet ditt.
Sjekkliste
Flytt en datamaskin
Om du oppdager at du må flytte en datamaskin må du være litt forsiktig, siden om du bare ødelegger en datamaskin og setter ut en ny er alle programmene borte. Du kan da bruke metoden i denne seksjonen for å kopiere programmene tilbake, men det finnes en bedre måte.
Med kommandoen label
kan vi gi en datamaskin navn. Prøv for eksempel å skriv label set snakker
. Dette gir denne datamaskinen navnet snakker, du kan gi maskinen akkurat det navnet du vil. Om du nå ødelegger maskinen vil du se at du kan plukke den opp igjen, og at den da legger seg i inventory'et ditt med navnet snakker. Om du nå setter ut maskinen igjen vil du se at alle programmene du har skrevet fortsatt finnes på maskinen.
Steg 6: De innebygde programmene
Vi skal nå kikke raskt på katalogen rom. Dette er som nevnt katalogen som inneholder de innebygde programmene på datamaskinen. Ved hjelp av kommandoene vi har lært kan vi nå se hvordan disse programmene er programmert, og til og med lage våre egne versjoner av dem.
Sjekkliste
-
Prøv først å kjøre programmet ved å skrive
hello
. Teksten Hello World! skrives til skjermen, ett tegn om gangen. -
if term.isColour() then term.setTextColour( 2^math.random(0,15) ) end textutils.slowPrint( "Hello World!" ) term.setTextColour( colours.white )
Ser du hvilken kodelinje det er som har ansvaret for å skrive teksten til skjermen?
Resten av programmet
Vi har så langt bare brydd oss om linje 4 i hello-programmet. Skjønner du hva de andre linjene gjør?
Ut fra kommandoene term.isColour()
og term.setTextColour()
kan vi kanskje gjette på at de har noe med tekstfargen å gjøre? Faktisk sier de første tre linjene at dersom programmet kjøres på datamaskin som har farger så skal tekstfargen settes til en tilfeldig farge. Den siste linjen setter tekstfargen tilbake til hvit.
Om du vil se hvordan dette virker kan du prøve å lage en Advanced Computer, og kjøre programmet hello
på den.
Prøv selv
Prøv å se på noen av de andre programmene du kjenner til, som for eksempel cd
, go
eller refuel
. Du må kanskje lete litt i katalogstrukturen for å finne dem. Disse programmene er litt mer kompliserte enn de vi har laget så langt. Prøv likevel å se om du skjønner hva deler av koden gjør. Finner du for eksempel kodelinjen som bytter katalog i cd
eller linjen som rapporterer fuelnivået i refuel
?
Steg 7: Andre typer datamaskiner
Vi har så langt stort sett bare brukt vanlige datamaskiner, Computer. Men om du ser i inventory'et ditt ser du at det finnes flere andre typer datamaskiner, inkludert Advanced Computer og Pocket Computer. Disse virker typisk ganske likt en vanlig datamaskin, men har noen ekstra muligheter.
Sjekkliste
-
term.clear() while true do local hendelse, knapp, x, y = os.pullEvent('mouse_click') print('Du klikket ' .. knapp) print('Posisjon: x = ' .. x .. ', y = ' .. y) end
Kjør programmet og prøv å klikk litt rundt omkring på skjermen. Bruk både venstre og høyre museknapp. Skjønner du hvordan museklikk-hendelser fungerer? Bruk
Ctrl-T
for å avslutte programmet. -
term.clear() while true do local hendelse, knapp, x, y = os.pullEvent('mouse_click') term.setCursorPos(x, y) -- ny linje if knapp == 1 then -- ny linje print('#') -- ny linje end -- ny linje if knapp == 2 then -- ny linje print(' ') -- ny linje end -- ny linje end
Prøv selv
Kan du legge til farger i tegneprogrammet? Se tilbake på hello
-programmet hvordan du kan bruke term.setTextColour()
til å endre farge. Kanskje du kan bruke talltastene til å endre farge?
Når du vil sjekke forskjellige typer hendelser, for eksempel både museklikk og tastetrykk, er det best å bruke os.pullEvent()
uten navnet på en hendelse i parantes. Deretter kan du sjekke variabelen hendelse
for hvilken hendelse som faktisk skjedde.
Etterhvert som du tegner merker du at du må klikke hver gang du vil tegne et punkt. Det ville vært bedre om man kunne bare klikket en gang, og deretter dra musen rundt. Se på hendelsen mouse_drag
og prøv å forbedre programmet ditt.
Forbedre denne siden
Funnet en feil? Kunne noe vært bedre?
Hvis ja, vennligst gi oss tilbakemelding ved å lage en sak på Github eller fiks feilen selv om du kan. Vi er takknemlige for enhver tilbakemelding!