Skolekoding.no > Tekst-koding > p5.js > NOC trinn for trinn
Eksempel fra The Nature of Code av Daniel Shiffman
1.8 Motion 101 (velocity and constant acceleration)
Nytt
- acceleration = createVector(0, 0.01);
- Oppretter en akselerasjonsvektor.
- Gir sirkelen akselerasjon
- Øker hastigheten for hver runde i draw() ved å legge akselerasjonsvektoren til hastigheten i hver runde.
- Lar sirkelen komme fram på oppe når den forsvinner ut av lerretet nede.
- let pos;
- let velocity;
- let acceleration;
- function setup() {
- createCanvas(400, 400);
- pos = createVector(random(width), random(height));
- velocity = createVector(0, 0); // Sirkelen ligger i ro. Ingen hastighet verken i x-retning eller i y-retning.
- acceleration = createVector(0, 0.01);
- }
- function draw() {
- background(220);
- velocity.add(acceleration);
- pos.add(velocity);
- if (pos.y > height) {
- pos.y = 0;
- }
- // Viser sirkel
- stroke(0);
- fill(175);
- ellipse(pos.x, pos.y, 36);
- }
før setup()
- VI lager en variabel for akselerasjonen
setup()
- Vi gir sirkelen akselerasjon i form av en vektor.
draw()
- For å øke hastigheten adderer vi hastighetsvektoren med akselerasjonsvektoren.
- x-verdien til akselerasjonen legges til x-verdien til hastigheten. Det samme for y-verdien.
- Vi sjekker om sirkelen er nedenfor lerretet.
- Sirkelen plasseres i toppen av lerretet.
Oppgaver
- Gi sirkelen en akselerasjon mot høyre
- Få sirkelen til å komme fram på venstre kant når den forsvinner ut til høyre.
- Gi sirkelen en akselerasjon mot venstre.
- Få sirkelen til å komme fram på høyre kant når den forsvinner ut til venstre.
- Gi sirkelen en akselerasjon mot oppover.
- Få sirkelen til å komme fram i nedre kant når den forsvinner ut oppe.
Nytt
- limit
- if else if
- Setter en øvre grense for hastigheten.
- Bruker hvis/ellers for å sjekke kanter
- let pos;
- let velocity;
- let acceleration;
- let topSpeed;
- function setup() {
- createCanvas(400, 400);
- pos = createVector(random(width), random(height));
- velocity = createVector(0, 0);
- acceleration = createVector(-0.001, 0.01);
- topSpeed = 10;
- }
- function draw() {
- background(220);
- velocity.add(acceleration);
- velocity.limit(topSpeed);
- pos.add(velocity);
- if (pos.x > width) {
- pos.x = 0;
- } else if (pos.x < 0) {
- pos.x = width;
- }
- if (pos.y > height) {
- pos.y = 0;
- }
- if (pos.y < 0) {
- pos.y = height;
- }
- stroke(0);
- fill(175);
- ellipse(pos.x, pos.y, 36);
- }
Før setup()
- Lager variabel for topphastighet
setup()
- Vi gir sirkelen akselerasjon i form av en vektor.
- Ny varoabel: «topspeed»
- »topspeed» får verdien 10
draw()
- For å øke hastigheten adderer vi hastighetsvektoren med akselerasjonsvektoren.
- x-verdien til akselerasjonen legges til x-verdien til hastigheten. Det samme for y-verdien.
- Hastigheten øker for hver runde i draw()
- Hastigheten begrenses til topSpeed
- Sjekker loddrette kanter med if og else if
Oppgaver
- Endre topSpeed
- Bruk if og else if for å sjekke nedre og øvre kant
Nytt
- function mousePressed()
- Funksjon som får programmet til å starte på nytt ved muselikk
- let pos;
- let velocity;
- let acceleration;
- let topSpeed;
- function setup() {
- createCanvas(400, 400);
- pos = createVector(random(width), random(height));
- velocity = createVector(0, 0);
- acceleration = createVector(-0.001, 0.01);
- topSpeed = 10;
- }
- function draw() {
- background(220);
- velocity.add(acceleration);
- velocity.limit(topSpeed);
- pos.add(velocity);
-
- if (pos.x > width) {
- pos.x = 0;
- } else if (pos.x < 0) {
- pos.x = width;
- }
- if (pos.y > height) {
- pos.y = 0;
- } else if (pos.y < 0) {
- pos.y = height;
- }
- stroke(0);
- fill(175);
- ellipse(pos.x, pos.y, 36);
- }
- function mousePressed() {
- pos = createVector(random(width), random(height));
- velocity = createVector(0, 0);
- acceleration = createVector(-0.001, 0.01);
- }
draw()
- Vi bruker if og else if for å sjekke venstre kant
mousePressed()
- Vi kopierer de linjene fra setup() som inneholder variabler som skal resettes.
- Disse linjene kjøres når venstre museknapp trykkes.
- createCanvas() og topspeed trenger ikke være med i function mousePressed()
Nytt
- new
- class
- constructor()
- Objektorientert programmering. Plasserer alt som har med sirkelen å gjøre i en egen klasse.
- let mover; // Oppretter en variabel «mover»
- function setup() {
- createCanvas(400, 400);
- // Lager et objekt med klassen «Mover» som mal og gir objektet navnet «mover»
- mover = new Mover();
- }
- function draw() {
- background(220);
- // Kaller på mover sin update-funksjon
- mover.update();
- // Kaller på mover sin checkEdges-funksjon
- mover.checkEdges();
- // Kaller på mover sin display-funksjon
- mover.display();
- }
- // Slutt på draw()
- function mousePressed() ;
- mover = new Mover();
- }
- // Klassen Mover. Malen for objektet «mover»
- class Mover {
- constructor() { // objektets felt (dvs. variabler). Alle begynner med «this.»
- this.pos = createVector(random(width), random(height));
- this.velocity = createVector(random(-2, 2), random(-2, 2));
- this.acceleration = createVector(-0.001, 0.01);
- this.topSpeed = 10;
- }
- // En metode (dvs. funksjon) i klassen Mover. Oppdaterer posisjonen
- update() {
- this.velocity.add(this.acceleration);
- this.velocity.limit(this.topSpeed;
- this.pos.add(this.velocity);
- }
- // En metode (dvs. funksjon) i klassen Mover
- checkEdges() {
- if (this.pos.x > width) {
- this.pos.x = 0;
- } else if (this.pos.x < 0) {
- this.pos.x = width;
- }
- if (this.pos.y > height) {
- this.pos.y = 0;
- } else if (this.pos.y < 0) {
- this.pos.y = height;
- }
- if (this.pos.x > width) {
- }
- // En metode (dvs. funksjon) i klassen Mover. Viser sirkelen
- display() {
- stroke(0);
- fill(175);
- ellipse(this.pos.x, this.pos.y, 36);
- }
- constructor() { // objektets felt (dvs. variabler). Alle begynner med «this.»
- } // Slutt på klassem Mover
før setup()
- Lager en variabel for objektet «mover»
- I variabelen samles alle funksjoner som angår objektet
setup()
- Oppretter objektet «mover» basert på klassen (malen) «Mover»
draw()
- Kaller på objektets metoder (dvs funksjoner).
- Bruker objektets navn + punktum + metodenavn
- Vi kan lese punktumet som «sin»
- mover sin update-metode
- mover sin checkEdges-metode
mousePressed()
- Vi lager et nytt objekt med samme navn som det forrige. Det forrige objektet erstattes.
constructor()
- Her deklareres klassens variabler
- Klassens variabler må navngis med this. foran navnet
- this.velocity får en tilfeldig startverdi mellom -2 og 2
update()
- Her oppdateres hastighet og posisjon
checkEdges()
- Her sjekkes det om objektet kolliderer med kantene
display()
- Her vises objektet
Forklaring
- Se Daniel Shiffmans video om objektorientert programmering med p5.js
- Objektorientert programmering i p5.js grunnkurs
- Hvordan legge klassekode i egne filer for å lette oversikten (14:20 ->)
- Sirkelen har variabler for posisjon, hastighet, akselerasjon og toppfart
- Sirkelen har kodelinjer for å oppdater posisjon, sjekke kanter og vise sirkel.
- Vi plasserer alt dette i en egen bolk.
- Bolken er en mal for hvordan en sirkel skal se ut og oppføre seg.
- Denne malen kalles en klasse. Med utgangspunkt i malen lages sirkler.
- Disse sirklene kalles objekter.
- Det er vanlig å gi klassen samme navn som objektene den er mal for.
- Det er vanlig å ha stor forbokstav i klassens navn for å vise at det er en klasse.
- Klassens globale variabler må ha forstavelsen «this» og et punktum.
- Disse variablene opprettes i konstruktøren og kan brukes av alle metodene.
- Hvis metodene har egne lokale variable opprettes de med «let» som vanlig
- I dette eksempelet lager vi bare en sirkel, altså bare ett objekt.
- Det er når vi skal ha mange objekter at objektorientert programmering virkelig kommer til sin rett.
- Det er mulig å lage objekter som ser ulike ut selv om de er basert på samme klassen.
- Klassen er som en pepperkakeform som gir omrisset av en pepperkake.
- Pepperkaker (objektene) kan dekoreres slik at de fremstår som ulike selv om omrisset (klassen) er det samme.
skolekoding.no
Stein Olav Kivle