Level 2JS: Trykkomania

Skrevet av: Arve Seljebu

Oversatt av: Stein Olav Romslo

Kurs: Web
Tema: Tekstbasert, Nettside, Spill
Fag: Matematikk, Programmering, Kunst og håndverk
Klassetrinn: 1.-4. klasse, 5.-7. klasse, 8.-10. klasse, Videregående skole
Bilde av BokmålPå Bokmål

Introduksjon

Denne oppgåva viser deg korleis du kan lage eit spel med JavaScript og dele det med venene dine. Spelet heiter Trykkomania fordi det handlar om å trykke på ein ball flest mogleg gonger før tida renn ut.

Før du startar med denne oppgåva bør du ha ein del erfaring med variablar, funksjonar og eventListeners i JavaScript. Viss du ikkje har det anbefalar me at du gjer nokre av dei enklare oppgåvene fyrst.

Animasjon av spelet Trykkomania

Steg 1: Åpne JS Bin

Me skal bruke JS Bin (http://jsbin.com) for å lage spelet. Viss du ikkje har brukt JS Bin før bør du ta ein kikk på oppgåva Hei, JavaScript. Viss du heller vil lage spelet i ei eiga fil på PC-en din, så kan du åpne favoritt-teksteditoren din og hoppe til steg 2.

checkSjekkliste

  • Bilete av JS Bin med fanene Javascript og Output

Steg 2: Lage ein ball

Me skal bruke JavaScript til å lage innhaldet på nettsida. Dette tyder at me skal bruke JavaScript til å lage HTML. Du treng ikkje kunne noko spesielt om HTML, men viss du vil lære meir om det fyrst kan du sjå på oppgåva Introduksjon til web.

checkSjekkliste

  • function Ball() {
    
    }
    
  • function Ball() {
      var el = document.createElement('div');
    }
    
  • function Ball() {
      var el = document.createElement('div');
      el.style.backgroundColor = 'black';
      el.style.width = '60px';
      el.style.height = '60px';
    }
    
  • function Ball() {
      var el = document.createElement('div');
      el.style.backgroundColor = 'black';
      el.style.width = '60px';
      el.style.height = '60px';
      document.body.appendChild(el);
    }
    
  • Ball();
    
  • Bilete av ein firkanta ball i Output

Så ballen vår er ikkje akkurat rund. Me kan bruke el.style.borderRadius for å runde av hjørnene. Sidan ballen er 60px brei og høg, så avrundar me kantane med 30px, altså halvparten av sidekanten.

  • el.style.borderRadius = '30px';
    

Utforsk

Viss du ynskjer ei anna form, prøv andre verdiar enn 30px for avrundinga. Korleis ser det ut med 5px?

Tips

Viss du sit fast kan du sjå på koden så langt.

Steg 3: Flytte ballen

Akkurat no visast ballen heilt øvst til venstre i Output. La oss flytte den rundt omkring.

Me brukar el.style.position = 'fixed' for å fortelje at me ynskjer å plassere ballen i forhold til kantane i vindauget. Halvparten (50 %) frå toppen blir då el.style.top = '50%'.

checkSjekkliste

  • el.style.position = 'fixed';
    el.style.top = '80%';
    
  • el.style.left = '30%';
    

Tips

Viss du står fast kan du sjå på koden så langt.

Steg 4: Flytte ballen med ein funksjon

Sidan me ynskjer at ballen skal flytte seg undervegs i spelet, så skal me lage ein funksjon som flyttar ballen.

checkSjekkliste

  • function Ball() {
      ...
      el.posisjon = function (x, y) {
    
      };
    }
    
  •  el.posisjon = function (x, y) {
       el.style.left = x;
       el.style.top = y;
     };
    
  • function Ball() {
      ...
      el.posisjon = function (x, y) {
        el.style.left = x;
        el.style.top = y;
      };
    
      return el;
    }
    
  • var ball = Ball();  // lagar ballen
    ball.posisjon('10%', '20%');  // flyttar til x = 10% og y = 20%
    

Tips

Viss du står fast kan du sjå på koden så langt.

Steg 5: Vel ei tilfeldig plassering

I JavaScript kan me bruke Math.random() for å få ein tilfeldig verdi mellom 0 og 1. La oss bruke denne slik at ballen blir plassert på ein tilfeldig stad.

checkSjekkliste

  • Bilete av output frå "Math.random()"
  • Bilete av output multiplisert med 100
  • Bilete av output i prosent
  • var x = Math.random() * 100 + '%';
    var y = Math.random() * 100 + '%';
    ball.posisjon(x, y);
    

Her har me laga to variablar, x og y. Begge heldt på kvart sitt tilfeldige tal. Dette talet blir sendt inn i funksjonen posisjon(x,y) me laga i stad.

  • Bilete av ballen som får ei ny tilfeldigplassering
  • var x = Math.random() * 80 + '%';
    var y = Math.random() * 80 + '%';
    

Tips

Viss du står fast kan du sjå på koden så langt.

Steg 6: Flytte ballen kvart andre sekund

Me vil at ballen skal flytte seg heile tida. No skal me bruke setInterval for å flytte ballen kvart andre sekund.

setInterval(function(){
    //koden som skal køyrast i intervall
}, antall_millisekunder); // Kor ofte den skal køyre

checkSjekkliste

  • setInterval(function () {
      var x = Math.random() * 80 + '%';
      var y = Math.random() * 80 + '%';
      ball.posisjon(x, y);
    }, 2000);
    

Tips

Viss du står fast kan du sjå på koden så langt.

Steg 7: Poeng

No har du ein ball som sprett rundt. La oss leggje til poeng. Me har laga ein poeng-komponent som du kan bruke, så kjem du raskare i gang. Poeng er bygd opp på same måte som Ball, så du må gjerne lese gjennom og sjå om du forstår den.

checkSjekkliste

  • /**
     * Poeng - viser poengsum nede i venstre hjørne.
     *
     * Bruk:
     *   var poeng = Poeng();  // viser poengsummen
     *   poeng.auk();  // aukar poengsummen med 100
     *   poeng.nullstill();  // set poengsummen til 0
     *
     */
    function Poeng() {
      var el = document.createElement('div');
    
      // CSS til "el"
      el.style.position = 'fixed';
      el.style.bottom = '50px';
      el.style.left = '8px';
      el.style.padding = '5px';
      el.style.backgroundColor = 'black';
      el.style.color = 'white';
    
      // Viser poengsum på skjermen, og lagar variabelen "_poeng"
      var _poeng = 0;
      el.innerHTML = _poeng + ' poeng';
      document.body.appendChild(el);
    
      // To funksjonar som aukar eller nullstiller poenga
      el.auk = function () {
        _poeng += 100;
        el.innerHTML = _poeng + ' poeng';
      };
      el.nullstill = function () {
        _poeng = 0;
        el.innerHTML = _poeng + ' poeng';
      };
    
      return el;
    }
    
  • var poeng = Poeng();
    var ball = Ball();
    
  • var poeng = Poeng();
    var ball = Ball();
    setInterval(function () {
      ...
    }, 2000);
    
    
    function Ball() {
      ...
    }
    
    function Poeng() {
      ...
    }
    
    • Vis poenga: var poeng = Poeng().

    • Vis ballen: var ball = Ball().

    • Flytt ballen kvart andre sekund: setInterval(..., 2000).`

  • ball.onclick = poeng.auk;
    

    OBS! Det skal ikkje vere () på slutten av poeng.auk. Det er fordi funksjonen ikkje blir køyrt her, men kvar gong nokon klikkar på ballen.

  • Animasjon av at du får poeng når du treff ballen med eit klikk

Tips

Viss du står fast kan du sjå på koden så langt.

flagTeste spelet

No har du kome så langt at det kan vere kult å teste spelet. Sidan spelet handlar om å trykkje flest mogleg gonger på ballen, så kan du godt prøve det på mobiltelefonen din.

checkSjekkliste

  • <meta name="viewport" content="width=device-width, user-scalable=no">
    
  • Bilete av adressa til sida øvst i nettlesaren

Steg 8: Avgrense tida

Akkurat no har du ikkje noko tidsavgrensing i spelet. La oss leggje til ei nedteljing av tid, slik at det går an å konkurrere om kven som klarar flest klikk på 10 sekund.

checkSjekkliste

  • /**
     * Nedteljing - Ei linje som viser at tida renn ut.
     *
     * Bruk:
     *   var nedteljing = Nedteljing(slutt);  // funksjonen `slutt` blir køyrt når tida er ute
     *   nedteljing.telNed(10);  // tel ned 10 sekund
     *
     */
    function Nedteljing (ferdig) {
      var el = document.createElement('div');
    
      // CSSen til elementet "el"
      el.style.position = 'fixed';
      el.style.left = '0';
      el.style.bottom = '0';
      el.style.height = '100%';
      el.style.width = '3px';
      el.style.backgroundColor = 'red';
      document.body.appendChild(el);
    
      // Reknar ut prosenten av kor lang tid det er att
      function prosent (slutt, tid) {
        return (slutt - Date.now()) / tid / 10;
      }
    
      // Funksjon som tel ned og stoppar når den har kome til null
      el.telNed = function (tid) {
        var slutt = Date.now() + tid * 1000;
        var intervall = setInterval(teikn, 20);
    
        // Teiknar streken på venstre side til tida er ute
        function teikn () {
          var p = prosent(slutt, tid);
          if (p < 0) {
            el.style.height = '0%';
            clearInterval(intervall);
            ferdig();
          }
          el.style.height = p + '%';
        }
      }
    
      return el;
    }
    
  • var nedteljing = Nedteljing();
    nedteljing.telNed(10);
    
  • function stopp() {
      ball.skjul();
    }
    
  • function Ball() {
      ...
      el.skjul = function () {
        el.style.display = 'none';
      };
      el.vis = function () {
        el.style.display = '';
      };
    
      return el;
    }
    
  • var nedteljing = Nedteljing(stopp);
    

Tips

Viss du står fast kan du sjå på koden så langt.

Steg 9: Starte spelet på nytt

No kan me starte spelet om att ved å oppdatere nettlesaren. Er det ikkje stiligare med ein knapp som startar spelet?

checkSjekkliste

  • function start() {
    
    }
    
  • function start() {
      poeng.nullstill();
      nedteljing.telNed(10);
      ball.vis();
    }
    
  • /**
     * Ein knapp som ligg midt på sida.
     *
     * Bruk:
     *   var knapp = Knapp('trykk på meg');  // lagar ein knapp som ligg midt på sida
     *   knapp.vis();  // viser knappen
     *   knapp.skjul();  // skjuler knappen
     */
    function Knapp(tekst) {
      var el = document.createElement('button');
      el.style.display = 'none';
      el.innerText = tekst;
      el.style.position = 'fixed';
      el.style.top = '50%';
      el.style.left = '50%';
      el.style.padding = '20px';
      el.style.border = 'solid 1px';
      document.body.appendChild(el);
    
      el.skjul = function () {
        el.style.display = 'none';
      };
      el.vis = function () {
        el.style.display = '';
        // plasser akkurat på midten
        // midten av skjermen er 50 % minus halvparten av storleiken til knappen
        var w = el.offsetWidth / 2;
        var h = el.offsetHeight / 2;
        el.style.marginLeft = '-' + w + 'px';
        el.style.marginTop = '-' + h + 'px';
      };
    
      return el;
    }
    
  • var knapp = Knapp('Prøv ein gong til');
    knapp.onclick = start;
    
  • function stopp() {
      ...
      knapp.vis();
    }
    
  • function start() {
      ...
      knapp.skjul();
    }
    

Tips

Her er fasiten.

Utfordringar

Her er nokre utfordringar:

Lisens: CC BY-SA 4.0

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!