Brugernavn:




Kodeord: Husk
Forside Forum Artikler Downloads Søg
 

Lav dit eget spil i javascript! (Ping Pong)


Spillet som vi skal lave i denne artikkel virker kun i IE eller IE baserede browsere.
For at få spillet til at virke i andre browseren, læs "Update" nederst i artiklen.


Velkommen til

I denne artikkel vil jeg lære dig at lave dit eget lille spil i javascript!
Det spil vi skal lave er en simpel udgave af den gamle klassikker Ping Pong!
Denne artikkel kræver at du ved noget om javascript, ikke så meget alle de forskellige kommandoer for de vil alligevel blive forklaret i denne artikkel, men det kræver at du har forståelse for sproget, ellers vil du ikke fatte hvad det er der sker.

Det første vi skal finde ud af er hvordan vi skal lave vores spil.
Vi skal allerførst lave vores bane, og det gør vi med ganske almindeligt css.
  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div id="bane"><br /></div>
  17. </body>
  18. </html>

Jeg går ud fra at du kan det mest basale CSS, så vil ikke sige mere om det der.
Nu skal vi så finde ud af hvilke elementer vi skal have i vores spil, vi skal have
en bold og vi skal have et bat.
Dem laver vi i CSS ligesom banen :)

  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. #bold{
  14.    position:absolute;
  15.    position:absolute;
  16.    width:20;
  17.    border: 1px solid #fff;
  18.    top:0;
  19.    left:0;
  20. }
  21. #bat{
  22.    position:absolute;
  23.    width:100;
  24.    border: 1px solid #fff;
  25.    top:470;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div id="bane"><br /></div>
  31. <div id="bold" style="left:0;top:0;"><br /></div>
  32. <div id="bat" style="left:300;"><br /></div>
  33. </body>
  34. </html>

Nu er vi kommet over den kedelige opsætning, nu skal vi igang med at lave javascript ;)
Som sagt skal vi bruge 2 elementer; en bold og et bat.
Så vi skal have oprettet en variabel til hver, som vi kan hente frem og manipulere med senere i scriptet. Følgende skal sættes ind i body lige efter <body.
  1. <script type="text/javascript">
  2. var bat
  3. var bold
  4. </script>

Nu skal vi til at putte noget i vores variabler som vi kan manipulere med senere, til det skal vi bruge en funktion som sætter variablerne lig med noget.
  1. function start(){
  2.    self.focus()
  3.    bat = document.getElementById("bat");
  4.    bold = document.getElementById("bold");
  5. }

Allerførst har du måske lagt mærke til at jeg har sat self.focus() ind i scriptet, og det gør jeg udelukkende for at sætte vinduet i fokus.
Hvis man f.eks kører spillet i et iframe, kan man godt resikere at focus ikke er i iframet og så virker spillet ikke, men det sørger vi for ikke sker.

Så har du lagt mærke til noget nyt:
document.getElementById("element")
Det betyder at vi henter informationerne fra et element ved hjælp af elementets id.
Og de informationer giver vi så til variabler bat og bold.

For at resumere op hvad vi har lavet indtil videre, viser jeg lige scriptet som det ser ud indtil videre.
  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. #bold{
  14.    position:absolute;
  15.    position:absolute;
  16.    width:20;
  17.    border: 1px solid #fff;
  18.    top:0;
  19.    left:0;
  20. }
  21. #bat{
  22.    position:absolute;
  23.    width:100;
  24.    border: 1px solid #fff;
  25.    top:470;
  26. }
  27. </style>
  28. </head>
  29. <body onLoad="start();">
  30. <script type="text/javascript">
  31. var bat
  32. var bold

  33. function start(){
  34.    self.focus()
  35.    bat = document.getElementById("bat");
  36.    bold = document.getElementById("bold");
  37. }
  38. </script>
  39. <div id="bane"><br /></div>
  40. <div id="bold" style="left:0;top:0;"><br /></div>
  41. <div id="bat" style="left:300;"><br /></div>
  42. </body>
  43. </html>

Jeg har tilføjet noget i koden, <body onLoad="start();"> som betyder at når siden er loadet færdig vil den starte funktionen start().
Som gør at scriptet virker :)

Nu skal vi igang med at lave funktionen til at flytte vores bat med piletasterne.
Det skal vi gøre med kommandoen event.keyCode.
Alle tasterne på dit keyboard har en bestemt kode i JavaScript, og dem vi skal bruge er 37 & 39 som er henholdsvis; venstre og højre piletast.
Nu skriver jeg funktionen flytbat() og lidt forklaring kommer bagefter.
  1. function flytbat(){
  2.    if(event.keyCode=="37"){
  3.     bat.style.left = parseInt(bat.style.left) - 10
  4.    }
  5.    if(event.keyCode=="39"){
  6.     bat.style.left = parseInt(bat.style.left) + 10
  7.    }

  8. }

Det der sker i denne funktion er at der bliver tjekket om knappen "37"(venstre) er trykket ned.
Hvis det er sandt så skal vi have scriptet til at udføre noget.
Det vi gør er at vi siger "bat.style.left" som betyder:
bat = Det element vi skal bruge (som vi har defineret i funktionen start).
style = Vi vil gøre noget med elementets style.
left = Den del af elementets style vi vil bruge er tagget; left.

Så er der kommet en ny funktion ind i scriptet; parseInt(), som gør det at den omdanner et tal til en anden type tal (int) som JavaScript kan arbejde med.
Så vi laver battets style.left om til et tal som javascript kan arbejde med og trækker 10 fra det.
Det betyder at vores bat har flyttet sig 10 pixels til venstre.
( Det modsatte sker hvis man trykker højre piletast ned ).

Nu har vi lavet funktionen til at flytte vores bat, men hvordan får vi fat i funktionen?
Det gør vi ved at tilføje dette lille stykke kode til vores start() funktion lige efter self.focus().
  • document.onkeydown = flytbat;
Det den gør er at den registrerrer hvis der bliver trykket på en knap, hvis det er sandt så sender den en videre til funktionen flytbat

Nu burde du kunne flytte dit bat med piletasterne, hvis det ikke virker er det fordi du har skrevet forkert af, så jeg viser lige hele koden, som den ser ud indtil videre. (Det er testet!)
  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. #bold{
  14.    position:absolute;
  15.    position:absolute;
  16.    width:20;
  17.    border: 1px solid #fff;
  18.    top:0;
  19.    left:0;
  20. }
  21. #bat{
  22.    position:absolute;
  23.    width:100;
  24.    border: 1px solid #fff;
  25.    top:470;
  26. }
  27. </style>
  28. </head>
  29. <body onLoad="start();">
  30. <script type="text/javascript">
  31. var bat
  32. var bold

  33. function flytbat(){
  34.    if(window.event.keyCode=="37"){
  35.     bat.style.left = parseInt(bat.style.left) - 10
  36.    }
  37.    if(window.event.keyCode=="39"){
  38.     bat.style.left = parseInt(bat.style.left) + 10
  39.    }
  40. }

  41. function start(){
  42.    self.focus()
  43.    document.onkeydown = flytbat;
  44.    bat = document.getElementById("bat");
  45.    bold = document.getElementById("bold");
  46. }
  47. </script>
  48. <div id="bane"><br /></div>
  49. <div id="bold" style="left:0;top:0;"><br /></div>
  50. <div id="bat" style="left:300;"><br /></div>
  51. </body>
  52. </html>

Så fik du leget lidt med det går jeg ud fra ;)
Men nu er det jo sådan at ping pong ikke er særligt skægt hvis bolden ikke flytter sig, så det skal vi igang med nu.
Allerførst skal vi tilføje nogle flere variabler i toppen af scriptet
  1. var boldleft
  2. var boldtop

  3. var vertikal
  4. var horisontal
boldleft skal vi bruge til at opbevare bold.style.left og boldtop skal vi bruge til at opbevare bold.style.top
horisontal skal vi bruge til at bevæge bolden vandret og vertikal skal vi bruge til at bevæge den lodret.

Nu skal vi give vores nye variabler boldleft og boldright nogle værdier.
boldleft skal have væredien af boldens venstre kants placering, og boldright den højre side.
  1.    boldleft = parseInt(bold.style.left);
  2.    boldtop = parseInt(bold.style.top);
Meget simpelt, jeg har forklaret hvad parseInt() gør før.

Nu skal vi igang med at flytte bolden vandret. Det gør vi ved at tjekke boldens placering, hvis den er ude ved venstre kant, skal vi sende den mod højre.
Og er den ude ved højre kant skal vi sende den mod venstre.
  1.     if(boldleft>="680"){
  2.       horisontal = "left"
  3.     }
  4.     if(boldleft<="0"){
  5.        horisontal = "right"
  6.     }
  7.     if(horisontal=="left"){
  8.        bold.style.left = boldleft - 10
  9.     }
  10.     if(horisontal=="right"){
  11.        bold.style.left = boldleft + 10
  12.     }

Som sagt tjekker vi først om bold.style.left er nul eller derunder, hvis det er sandt skal vi sætte horisontal til right(højre), og omvendt.

Så tjekker vi så om horisontal er lig med venstre, hvis det er sandt skal vi sende bolde 10 pixels længere væk fra venstre kant, og omvendt.

Hvis du nu sidder og siger "Det virker ikke, den flytter sig kun et felt!" så har du fuldstændigt ret, for vi har nemlig ikke sat den til at loppe endnu,
men det kan vi hurtigt gøre ved at sætte dette ned i bunden af vores start() funktion.
  •     window.setTimeout("start();",50);
Det er et stykke kode som hver tyvendedel af et sekund genstarter funktionen start().
( 1000 = 1 sek ).

Hvis du er lige i tvivl om nogen af de forskellige elementer her i vores spil indtil videre, kan du lige få dem alle sammen her:
  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. #bold{
  14.    position:absolute;
  15.    position:absolute;
  16.    width:20;
  17.    border: 1px solid #fff;
  18.    top:0;
  19.    left:0;
  20. }
  21. #bat{
  22.    position:absolute;
  23.    width:100;
  24.    border: 1px solid #fff;
  25.    top:470;
  26. }
  27. </style>
  28. </head>
  29. <body onLoad="start();">
  30. <script type="text/javascript">
  31. var bat
  32. var bold

  33. var boldleft
  34. var boldtop

  35. var vertikal
  36. var horisontal

  37. function flytbat(){
  38.    if(window.event.keyCode=="37"){
  39.     bat.style.left = parseInt(bat.style.left) - 10
  40.    }
  41.    if(window.event.keyCode=="39"){
  42.     bat.style.left = parseInt(bat.style.left) + 10
  43.    }
  44. }

  45. function start(){
  46.    self.focus()
  47.    document.onkeydown = flytbat;
  48.    bat = document.getElementById("bat");
  49.    bold = document.getElementById("bold");

  50.    boldleft = parseInt(bold.style.left);
  51.    boldtop = parseInt(bold.style.top);

  52.     if(boldleft>="680"){
  53.        vertikal = "left"
  54.     }
  55.     if(boldleft<="0"){
  56.        vertikal = "right"
  57.     }
  58.     if(vertikal=="left"){
  59.        bold.style.left = boldleft - 10
  60.     }
  61.     if(vertikal=="right"){
  62.        bold.style.left = boldleft + 10
  63.     }
  64.     window.setTimeout("start();",50);
  65. }
  66. </script>
  67. <div id="bane"><br /></div>
  68. <div id="bold" style="left:0;top:0;"><br /></div>
  69. <div id="bat" style="left:300;"><br /></div>
  70. </body>
  71. </html>

Se det er meget sjovt :)
Men nu skal vi have bolden til at køre lodret også.
Det gør vi meget nemt ved at "vende" vores allerede programmerede "if"er" om.
Jeg vil ikke forklare så meget hvad der sker nu, for det er samme koncept som før.
  1.     if(boldtop>="450"){
  2.        vertikal = "up"
  3.     }
  4.     if(boldtop<="0"){
  5.       vertikal = "down"
  6.     }
  7.     if(vertikal=="up"){
  8.        bold.style.top = boldtop - 10
  9.     }
  10.     if(vertikal=="down"){
  11.        bold.style.top = boldtop + 10
  12.     }
Det skal bare tilføjes umiddelbart efter det stykke kode som sender bolden til venstre og højre :)

Se det er da meget sjovt at sidde og kigge på den bold der flagrer rundt der, men det sjovere hvis man kan bruge sit bat til andet end bare at flytte det.
Så det skal vi til nu, igen skal vi tilføje mere til vores start() funktion:)
Det vi skal til at gøre nu er;
- Tjekke om bolden kommer ned i bunden.
- Hvis den er nede i bunden, skal vi tjekke om battet er inde under det.
- Hvis battet er inde under skal vi sende bolden opad.
- Hvis battet ikke er inde under, skal vi generere en "ny" bold.

Det lyder måske meget svært men det er faktisk ikke spor indviklet. Men allerførst skal vi lige tilføje nogle nye variabler.
Dette indsættes ved de andre variabler:
  1. var batleft
  2. var batright
og dette tilføjes umiddelbart efter vi definerer vores boldleft og boldright.
  1.    batleft = parseInt(bat.style.left)-10
  2.    batright = parseInt(bat.style.left)+100

Den første trækker vi 10 fra, og hvorfor gør vi det?
Det er fordi at bold.style.left regner fra den venstre kant af bolden, men hvad så hvis man rammer med bolden på dens højre kant ;)
Den næste lægger vi 100 til, det er fordi at battet er 100px bred, og igen er bat.style.left battets venstre kant.

Nu skal vi igang med at tjekke om bolden "rammer" battet når den kommer ned i bunden.
Det gør vi med endnu en "if" inde i den "if" som tjekker om bolden er nede i bunden.
Så vores if(boldtop>=480){.. skal ændres til følgende.
  1.     if(boldtop>="450"){
  2.         if(boldleft>=batleft && boldleft<=batright){
  3.             horisontal = "up"
  4.        } else {
  5.         boldleft = Math.random()*680
  6.         boldtop = 0
  7.        }
  8.     }

Første tjekker vi om bolden er inden for battets venstre og højre kant, hvis den er sender vi bolde opad.
Hvis den ikke er inden for så gør vi...... Ja nu gik du lige i stå? ;)
Bare rolig jeg forklarer hvad der sker nu :)
Math.random() er en javascript funktion som genererer et filfældigt tal mellem 1 og 0. Det kan vi forhøje ved at gange det med et tal.
F.eks giver Math.random()*100 et tilfældigt tal mellem 0 og 100.

Så ved at siger bold.style.left = Math.random()*680 giver vi bolden en tilfældig placering horisontal, og ved at sige
Og bagefter sætter vi bold.style.stop til nul, så den kommer op i toppen igen.

Så er vi næsten færdige med vores nye spil, men med hvad vi har lært indtil videre kan vi faktisk gøre vores spil endnu bedre, vi kan nemlig sørge for at vores bat ikke kan forlade banen.
Det gør vi ved at tjekke battets højre og venstre kan som vi har i variablerne batleft og batright er inden for kanterne. Hvis de er skal vi flytte battet eller skal vi ikke.
Så vores funktion flytbat() kommer til at se sådan her ud:
  1. function flytbat(){
  2.    if(window.event.keyCode=="37" && batleft>="0"){
  3.     bat.style.left = parseInt(bat.style.left) - 10
  4.    }
  5.    if(window.event.keyCode=="39" && batright<="690"){
  6.     bat.style.left = parseInt(bat.style.left) + 10
  7.    }
  8. }
Så er vores spil faktisk helt færdigt og nu er det bare om at gå igang med at spille og viderudvikle spillet.

Hvis du i løbet af denne artikkel har tabt tråden selvom jeg har prøvet at forklare det så godt som muligt kommer her den færdige kode som er testet.
Og hele koden er samlet af brudstykkerne her fra artiklen.
  1. <html>
  2. <head>
  3. <style>
  4. body{
  5.    margin:0px;
  6. }
  7. #bane{
  8.    position:absolute;
  9.    background-color:green;
  10.    width:700px;
  11.    height:500px;
  12. }
  13. #bold{
  14.    position:absolute;
  15.    position:absolute;
  16.    width:20;
  17.    border: 1px solid #fff;
  18.    top:0;
  19.    left:0;
  20. }
  21. #bat{
  22.    position:absolute;
  23.    width:100;
  24.    border: 1px solid #fff;
  25.    top:470;
  26. }
  27. </style>
  28. </head>
  29. <body onLoad="start();">
  30. <script type="text/javascript">
  31. var bat
  32. var bold

  33. var boldleft
  34. var boldtop
  35. var batleft
  36. var batright

  37. var vertikal
  38. var horisontal

  39. function flytbat(){
  40.    if(window.event.keyCode=="37" && batleft>="0"){
  41.     bat.style.left = parseInt(bat.style.left) - 10
  42.    }
  43.    if(window.event.keyCode=="39" && batright<="690"){
  44.     bat.style.left = parseInt(bat.style.left) + 10
  45.    }
  46. }

  47. function start(){
  48.    self.focus()
  49.    document.onkeydown = flytbat;
  50.    bat = document.getElementById("bat");
  51.    bold = document.getElementById("bold");

  52.    boldleft = parseInt(bold.style.left);
  53.    boldtop = parseInt(bold.style.top);
  54.    batleft = parseInt(bat.style.left)-10
  55.    batright = parseInt(bat.style.left)+100

  56.     if(boldleft>="680"){
  57.        vertikal = "left"
  58.     }
  59.     if(boldleft<="0"){
  60.        vertikal = "right"
  61.     }
  62.     if(vertikal=="left"){
  63.        bold.style.left = boldleft - 10
  64.     }
  65.     if(vertikal=="right"){
  66.        bold.style.left = boldleft + 10
  67.     }

  68.     if(boldtop>="450"){
  69.         if(boldleft>=batleft && boldleft<=batright){
  70.             horisontal = "up"
  71.        } else {
  72.         boldleft = Math.random()*680
  73.         boldtop = 0
  74.        }
  75.     }
  76.     if(boldtop<="0"){
  77.        horisontal = "down"
  78.     }
  79.     if(horisontal=="up"){
  80.        bold.style.top = boldtop - 10
  81.     }
  82.     if(horisontal=="down"){
  83.        bold.style.top = boldtop + 10
  84.     }
  85.     window.setTimeout("start();",50);
  86. }
  87. </script>
  88. <div id="bane"><br /></div>
  89. <div id="bold" style="left:0;top:0;"><br /></div>
  90. <div id="bat" style="left:300;"><br /></div>
  91. </body>
  92. </html>

Det var alt for denne gang, jeg håber du kunne bruge min artikkel til noget og samtidig lærte noget om javascript.
Du må meget gerne kommentere artiklen, så jeg ved om jeg skal skrive flere eller om jeg skal blive langt væk.

Du skal føle dig velkommen til at spørge i forumet hvis du skal have hjælpt til scriptet, eller hjælp til udvidelse i form af pointtæller osv.
Du skal helst ikke skrive en privat besked eller i min gæstebog, da de andre brugere ikke vil kunne få udbytte af det vi skriver om der.

Hilsen Andreas (Webstuff)

Update:
For at få spillet til at virke i andre browsere end IE, udskift flytbat() funktionen med denne: (12/02 - 06)
  1. function flytbat(e){
  2.     e = e ? e : window.event;
  3.     if(e.keyCode=="37" && batleft>="0"){
  4.         bat.style.left = (bat.offsetLeft - 10) + "px";
  5.     }
  6.     if(e.keyCode=="39" && batright<="690"){
  7.         bat.style.left = (bat.offsetLeft + 10) + "px";
  8.     }
  9. }
Tak til olebole fra eksperten for update.
Sidst redigeret 13:18 - 21/09/2006
Oprettet af:

Javascript

Point modtaget: 0

Rate:
04:16 12/02/2006

Kommentarer

Giv din mening tilkende om denne artikel, eller læs andres.
Har du spørgsmål eller brug for hjælp til denne artikel henvises du til forummet.
Hehe.. Jeg har ikke lige fået gjort det da jeg er ude at rejse, men hvorfor copy/paste"er i ikke bare det sidste kode eksempel, der har jeg samlet hele koden til spillet..
Oprettet af:
  Mail
17:38 17/02/2006
Sejt vidste ikke man kunne lave online spil uden flash eller java?
Oprettet af:
  Mail
23:02 07/08/2006
Mega god artikel
Oprettet af:
  Mail
21:33 19/01/2007
Super artikel! :D
Oprettet af:
  Mail
09:40 11/03/2007
__ak. En artikel er ikke god hvis den er lang, man kan godt forkorte teksten ned.
Oprettet af:
  Mail
19:47 24/09/2007
Øhm. det virker ik rigtigt? der er 1 bat, og battet kan ikke rykke sig? =)
Oprettet af:
  Mail
10:01 06/12/2009
Du skal være oprettet og logget ind for at kommentere en artikel
Copyright © Rowl.dk v/ Michael Raagaard | 2005-12 | Alle rettigheder forbeholdes