Skolekoding.no > Tekst-koding > p5.js > NOC trinn for trinn
Eksempel fra The Nature of Code av Daniel Shiffman
1.2 Bouncing ball with p5.Vectors
1.2 a ellipse()
1.2 b background()
1.2 c stroke()
1.2 d fill()
1.2 e createVector()
1.2 f add()
1.2 g if() og height
1.2 h width()
1.2 i eller ||
1.2 j eller igjen
1.2 k kantgjenkjenning
Nytt
- // kommentar
- setup()
- createCanvas()
- draw()
- ellipse()
- function setup() {
- createCanvas(400, 400); // Lerret 400×400 punkter
- }
- function draw() {
- ellipse(200, 200, 60, 60); //Ellipse i punktet (200, 200) med bredde 60 og høyde 60 punkter. Altså en sirkel.
- }
Før setup()
- Vi skriver en overskrift (kommentar) til programmet som hoppes over når programmet kjøres
- Kommentarer innledes med dobbel skråstrek (shift + 7)
function setup()
- Setter størrelsen på lerretet med kommandoen createCanvas(). Størrelsen settes til 400 x 400 punkter
function draw()
- Tegner en ellipse med komandoen ellipse(). Sentrum i x = 200, y = 200. bredde 60 punkter og høyde 60 punkter, altså en sirkel.
- NB! x = 0 og y = 0 er oppe i venstre hjørnet. x øker mot høyre, y øker nedover. Les mer om koordinatsystem i Processing, p5.js og de fleste andre språk.
Forklaring
- setup() kjøres én gang. Her settes blant annet størrelsen på lerretet.
- draw() repeteres 60 ganger i sekundet. Sirkelen tegnes på samme plassen 60 ganger i sekundet.
- Funksjonene starter og slutter med krøllparenteser { }
Alt Gr + 7 og Alt Gr + 8. Egne tastekombinasjoner på Mac. - Det er vanlig å skrive første krøllparentes på linja etter funksjonsnavnet og siste krøllparentes på egen linje etter siste kommando i funksjonen.
- Innrykk gjør programmet lettere å forstå. Shift + tab rydder automatisk opp i innrykk.
- Innrykk, linjeskift og mellomrom har ingen betydning for selve programmet.
- Alle kommandoer avsluttes med semikolon (shift + komma).
- Funksjonsnavn og kommandoer som er innebygget i p5.js blir uthevet og får blå farge hvis de er skrevet riktig. F. eks.: funksjonene setup() og draw(), og kommandoene createCanvas og ellipse
- Kommentarer som ikke er en del av programmet innledes med dobbel skråstrek (shift + 7)
- Det kan også være nyttig å dekaktivere en kodelinje ved å omgjøre den til en kommentar.
- Hurtigtast: ctrl + ‘ (samme tast som asteriks *, ved siden av æ)
- Stå på linja, trykk og hold ctrl, trykk ‘ uten å slippe ctrl
- Marker flere linjer, trykk og hold ctrl, trykk ‘ uten å slippe ctrl
- Lerretet er inndelt i punkter vannrett (x-akse) og loddrett (y-akse). Origo (x = 0, y = 0) er i øvre venstre hjørne. Positiv x-akse er vannrett mot høyre. Positiv y-akse er loddrett nedover.
- Les mer om koordinatsystem i Processing, p5.js og de fleste andre språk.
- Her er lerretet 400 x 400 punkter
- Første x-verdi er 0. Siste x-verdi er 399
- Første y-verdi er 0. Siste y verdi er 399
Oppgaver
- Endre størrelsen på lerretet
- Endre plasseringen av sirkelen
- Endre størrelsen på sirkelen
- Skriv noen innledende kommentarer over setup()
- Skriv noen forklarende kommentarer i programmet
Nytt
- background()
setter farge på lerretet (bakgrunnen)
- function setup() {
- createCanvas(400, 400);
- }
-
- function draw() {
- background(220); // Lerretet får grå farge
- elllipse (200, 200, 60, 60);
- }
function draw()
- Vi setter gåfarge på lerretet med background()
Forklaring
- Vi kan bestemme fargen på lerretet med kommandoen background()
- Inne i parentesen kan vi skrive ett, to, tre eller fire tall mellom 0 og 255. Hvorfor 0-255?
- Ett tall gir gråtone: 0=svart, 255=hvit.
- To tall gir gråtone + gjennomskinnelighet: 0=helt gjennomsiktig, 255=helt ugjennomsiktig.
- Tre tall gir farger: RGB: Rød, Grønn, Blå. Fargene blandes som lys ikke som maling. (255, 255, 255) = hvit.
- Fire tall gir farge + gjennomskinnelighet.
- Les mer om farge
Oppgaver
- Gi lerretet en annen gråtone.
- Prøv med andre gråtoner.
- Gi lerretet en farge.
- Prøv med andre farger. Fargevelger.
Nytt
- stroke()
bestemmer strekfarge på sirkelen - strokeWeight()
setter tykkelsen på streken
- function setup() {
- createCanvas(400, 400);
- }
- function draw() {
- background(220);
- strokeWeight(2);
- stroke(255, 0, 0); // Rød strekfarge
- ellipse (200, 200, 60, 60);
- }
function draw()
- Vi kan bestemme strekfarge på omrisset av sirkelen med kommandoen stroke()
- Inne i parentesen kan vi skrive en, to, tre eller fire tall mellom 0 og 255 på samme måte som for background.
- Vi kan bestemmetykkelsen med strokeWeight()
- Les mer om omriss
Oppgaver
- Gi streken en annen gråtone.
- Endre tykkelsen på streken
- Gi omrisset en farge.
- Prøv med andre farger.
- Fargevelger.
Nytt
- fill()
setter fyllfarge på sirkelen
- function setup() {
- createCanvas(400, 400);
- }
- function draw() {
- background(220);
- strokeWeight(2);
- stroke(255, 0, 0);
- fill(0, 255, 0); // Grønn fyllfarge
- ellipse (200, 200, 60, 60);
- }
function draw()
- Vi kan bestemme fyllfargen av sirkelen med kommandoen fill()
- Inne i parentesen kan vi skrive en, to, tre eller fire tall mellom 0 og 255 på samme måte som for stroke : RGB
Oppgaver
- Gi sirkelen en annen farge.
- Gi sirkelen en gråtone.
- Prøv med andre farger.
- Fargevelger.
Nytt
- let
oppretter en variabel - createVector()
lager en vektor
- let position; // Oppretter en variabel med navn «position»
- function setup() {
- createCanvas(400, 400);
- // Lager en vektor med x-verdi lik 200 og y-verdi lik 200
- position = createVector(200, 200);
- }
- function draw() {
- background(220);
- strokeWeight(2);
- stroke(255, 0, 0); fill(0, 255, 0);
- ellipse (position.x, position.y, 60, 60);
- }
Før setup()
- Vi lager en variabel ved å bruke ordet let
- Variabelen hetter «position»
- Variabelen er en beholder som bla kan inneholde et tall, en tekst eller en vektor.
- Vi trenger ikke opprette variabelen før setup(), men ettersom variabelen skal brukes både i setup() og draw() er det ryddig å opprette variabelen her.
function setup()
- Vi oppretter en vektor med x-verdi lik 100 og y-verdi lik 100.
- Vektoren tilordnes variabelen position. Vektorens navn blir altså «position»
function draw()
- Vi bytter ut x- og y-koordinatene i ellipse() med position sin x-verdi og position sin y-verdi. (Vi kan lese punktumet som om det stod sin).
Forklaring
- Vi kan opprette variabler.
- Variabler kan inneholde tall, bokstaver, tabeller, vektorer m.m.
- Vi bruker ordet «let» for å vise at det neste ordet er navnet på en variabel.
- Vi kan kalle variablene hva vi vil bortsett fra ord som er reservert av p5.js.
- Reserverte variabelnavn blir røde. Reserverte funksjonsnavn blir uthevet blå.
- Det er lurt å gi variablene navn som gjør at vi skjønner hva de brukes til.
- Vi kan opprette vektorer.
- En vektor kan oppfattes som forskjellen mellom to punkter.
- Hvordan vi kan komme fra ett punkt (x1, y1) til et annet punkt (x2, y2).
- En vektor har altså både retning og lengde.
- For eksempel: vi har en sirkel med sentrum i punktet (100, 200) der vi legger til en hastighetsvektor (10, 50)
- Hastighetsvektoren forteller at sirkelen skal flyttes 10 punkter langs x-aksen og 50 punkter langs y-aksen.
- Sirkelen ender opp i punktet (110, 250).
- Et punkt kan også oppfattes som en vektor (en stedsvektor) hvis vi tenker oss origo som utgangspunkt.
- Stedsvektoren (100, 200) til en sirkel forteller at en sirkel skal plasseres i punket (100, 200).
- Vi kan tenk oss at sirkelen er flyttet fra (0, 0) til (100, 200).
- Se figur 1.1 – 1.6 i kapittel 1 av The Nature of Code
Oppgaver
- Sett inn andre tall enn (100, 100) i createVector()
Nytt
vektor1.add(vektor2)
legger sammen to vektorer
- let position;
- let velocity; // Vi oppretter en variabel med navn «velocity»
- function setup() {
- createCanvas(400, 400);
- position = createVector(100, 100);
- velocity = createVector(1, 2); // Ny vektor
- }
- function draw() {
- background(220);
- position.add(velocity); //Vi legger sammen to vektorer
- stroke(0);
- fill(175);
- ellipse(position.x, position.y, 16, 16);
- }
før setup()
- Vi legger til en ny variabel «velocity»
function setup()
- Variabelen får tildeles en vektor med x-verdi 1 og y-verdi 2
function draw()
- Vi legger sammen x-verdien til stedsvektoren med x-verdien til hastighetsvektoren.
- Det samme for y-verdiene. Stedsvektoren får en ny verdi og sirkelen flytter seg.
Forklaring
- Vi kan legge sammen to vektorer for å få en figur til å flytte seg.
- Når vi legger sammen to vektorer adderer vi x-verdiene og y-verdiene hver for seg.
- Vi legger sammen x-verdien til stedsvektoren med x-verdien til hastighetsvektoren.
- Det samme for y-verdiene.
- Stedsvektoren får en ny verdi, og sirkelen flytter seg.
- Se figur 1.6 i kapittel 1 av The Nature of Code
- Fordi background står inne i draw() vil forrige sirkel fjernes av den nye bakgrunnen.
- Vi ser bare den siste sirkelen.
Oppgaver
- Sett inn andre tall enn (2.5, 5) i createVector().
- Få sirkelen til å bevege seg brattere oppover mot høyre.
- Få sirkelen til å bevege seg på skrå ned mot venstre.
- Få sirkelen til å bevege seg rett oppover eller rett til venstre
- Flytt background(220) fra draw() til setup()
Nytt
- if ( )
sjekker om sirkelen treffer nedre kant. - height
En innebygget variabel som inneholder høyden på lerrete som vi bestemte i setup(). Kan ikke brukes før setup() - variabel = variabel * -1
hvis den gjør det endrer y-komponenten av hastighetsvektoren retning.
- let position;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- position = createVector(100, 100);
- velocity = createVector(1, 2);
- }
- function draw() {
- background(220);
- position.add(velocity);
- if (position.y > height) {
- velocity.y = velocity.y * -1;
- }
- stroke(0);
- fill(175);
- ellispe(position.x, position.y, 16, 16);
- }
function draw()
- VI sjekker om sirkelens y-koordinat er mer enn høyden av lerretet (height). Høyden måles nedover fra øvre kant.
- Hvis sirkelens y-verdi er større enn lerretets største y-verdi multipliseres verdien med -1.
- Bevegelsen går motsatt vei.
Forklaring
- Vi kan sjekke om sirkelen kolliderer med nedre kant av lerretet
- Vi bruker kommandoen «if ()»
- I parentesen skriver vi hva som skal sjekkes
- Deretter skriver vi hva som skal skje hvis svaret på testen er sann.
- Husk krøllparenteser.
- Vi kan endre retningen ved å endre fortegnet på hastigheten.
- Vi endrer fortegn ved å multiplisere med -1.
- hastighet i y-retning = hastighet i y-retning gange -1.
- I programmering har et likhetstegn en litt annen betydning enn i matematikk.
- Her betyr et likhetstegn at vi tilordner en verdi til en variabel.
- Vi leser baklengs: vi multipliserer hastigheten i y-retning med -1, og legger verdien tilbake i hastighetsvariabelen.
- Hastigheten i y-retning har blitt endret. Den har fått motsatt fortegn av hva den hadde.
Oppgaver
- Sjekk om sirkelen kolliderer med høyre kant og endre fortegn på velocity.x
Nytt
variabel *= -1;
Komprimert form av: variabel = variabel * -1;
- let position;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- position = createVector(100, 100);
- velocity = createVector(1, 2);
- }
- function draw() {
- background(220);
- position.add(velocity);
- if (position.x > width) { // Sjekker om sirkelen kolliderer med høyre kant
- velocity.x *= -1; // Endrer retning på velocity.x
- }
- if (position.y > height) {
- velocity.y *= -1; // Endrer retning på velocity.y
- }
- stroke(0);
- fill(175);
- ellipse(position.x, position.y, 16, 16);
- }
function draw()
- Vi sjekker kollisjon med venstre kant
- Vi multipliserer x-veriden med -1
- Vi bruker en komprimert skrivemåte
Forklaring
- variabel = variabel * -1;
- variabel *= -1;
- Skrivemåten i punkt 1 og 2 betyr det samme.
- Når vi skal endre verdien til en variabel kan vi bruke den komprimert skrivemåten i punkt 2.
Nytt
|| c
To loddrette streker betyr «eller» (På PC: tasten under Esc-tasten oppe til venstre)
- let position;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- position = createVector(100, 100);
- velocity = createVector(1, 2);
- }
- function draw() {
- background(220);
- position.add(velocity);
- if (position.x > width) {
- velocity.x *= -1;
- }
- if (position.y > height || position.y < 0) {
- velocity.y *= -1;
- }
- stroke(0);
- fill(175);
- ellipse(position.x, position.y, 16, 16);
- }
function draw()
- Vi sjekker kollisjon med nedre kant eller øvre kant
Forklaring
- Vi kan gjennomføre to tester i samme if-setning
- hvis kollisjon med nedre kant eller kollisjon med øvre kant
- Vi bruker dobbel loddrett strek » || «når vi mener eller
- Loddrett strek er ofte tasten lengst oppe til venstre på tastaturet til venstre for 1-tasten.
Oppgaver
- Sjekk om sirkelen enten kolliderer med høyre kant eller venstre kant
- let position;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- position = createVector(100, 100);
- velocity = createVector(1, 2);
- }
- function draw() {
- background(220);
- position.add(velocity);
- if (position.x > width || position.x < 0) {
- velocity.x *= -1;
- }
- if (position.y > height|| position.y < 0) {
- velocity.y *= -1;
- }
- stroke(0);
- fill(175);
- ellipse(position.x, position.y, 16, 16);
- }
function draw()
- Vi sjekker kollisjon med venstre kant eller høyre kant
Oppgave
- Nå returnerer sirkelen når sentrum av sirkelen treffer kanten. Gjør om if-setningene slik at sirkelen spretter tilbake straks kanten av sirkelen treffer kanten av lerretet.
Nytt
- Vi justerer kantsjekken med radius av sirkelen
- random(1, 10)
Gir tIlfeldige verdier mellom fra og med 1 opp til 10, men ikke inkusive 10.
- let pos;
- let radius;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- // Gir pos-variabelen en tilfeldig startverdi innenfor lerretet.
- pos = createVector(random(0, width), random(0, height));
- // Gir radius verdien 16
- radius = 8;
- // Gir velocity en tilfeldig x- og y-verdi mellom -4 og 4.
- velocity = createVector(random(-4, 4), random(-4, 4));
- }
- function draw() {
- background(220);
- // Oppdaterer posisjon
- pos.add(velocity);
- // Sjekker kanter
- if (pos.x < 0 + radius || pos.x > width – radius) {
- velocity.x *= -1;
- }
- if (pos.y < 0 + radius || pos.y > height – radius) {
- velocity.y *= -1;
- }
- // Viser sirkel
- stroke(0);
- fill(175);
- ellipse(pos.x, pos.y, radius*2, radius*2);
- }
- let pos;
- let radius;
- let velocity;
- function setup() {
- createCanvas(400, 400);
- // Gir pos-variabelen en tilfeldig startverdi innenfor lerretet.
- pos = createVector(random(0, width), random(0, height));
- // Gir radius verdien 16
- radius = 8;
- // Gir velocity en tilfeldig x- og y-verdi mellom -4 og 4.
- velocity = createVector(random(-4, 4), random(-4, 4));
- }
- function draw() {
- background(220);
- // Oppdaterer posisjon
- pos.add(velocity);
- // Sjekker kanter
- if (pos.x < 0 + radius || pos.x > width – radius) {
- velocity.x *= -1;
- }
- if (pos.y < 0 + radius || pos.y > height – radius) {
- velocity.y *= -1;
- }
- // Viser sirkel
- stroke(0);
- fill(175);
- ellipse(pos.x, pos.y, radius*2, radius*2);
- }
setup()
- Vi bruker tilfeldige verdier for posisjonsvektoren
- x-verdien blr valgt tilfeldig mellom 0 og bredden på lerretet
- y-verdien blir valgt tilfeldig mellom 0 og høyden på lerretet
- Hastighetsvektoren får tilfeldige verdierfor x og y mellom -4 og 4.
Forklaring
- Vi trekker fra radiusen av sirkelen når vi sjekker høyre kant og nedre kant.
- Vi legger til radiusen av sirkelen når vi sjekker venstre kant og øvre kant.
- Vi kan bruke random() for å lage tilfeldige verdier.
- Inne i parentesen skriver vi ett eller to tall.
- To tall definerer øvre og nedre grense for det tilfeldige tallet.
- For eksempel: random(5, 10) gir et desimaltall større enn fem og mindre enn ti.
- Skriver vi ett tall i parentesen er null nedre grense og tallet i parentesen øvre grense.
- For eksempel: random(10) gir et desimaltall større enn null og mindre enn 10.
skolekoding.no
Stein Olav Kivle