JS: Trykkomania
Skrevet av: Arve Seljebu
Oversatt av: Stein Olav Romslo
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.

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.
Sjekkliste
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.
Sjekkliste
-
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();
-
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%'
.
Sjekkliste
-
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.
Sjekkliste
-
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.
Sjekkliste
-
-
-
-
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.
-
-
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
Sjekkliste
-
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.
Sjekkliste
-
/** * 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 avpoeng.auk
. Det er fordi funksjonen ikkje blir køyrt her, men kvar gong nokon klikkar på ballen. -
Tips
Viss du står fast kan du sjå på koden så langt.
Teste 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.
Sjekkliste
-
<meta name="viewport" content="width=device-width, user-scalable=no">
-
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.
Sjekkliste
-
/** * 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?
Sjekkliste
-
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:
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!