Lag en HTML5 Canvas Tile Bytte Puzzle

Create en HTML5 Canvas Tile Bytte Puzzle
16
Del
26
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I denne opplæringen vi skal jobbe med HTML5 lerret og Javascript for å skape en dynamisk flis bytte spill. Resultatet vil bli et puslespill som fungerer med alle gitt bilde, og har fleksible vanskelighetsgrader som er lett justeres.




The Complete HTML5 Canvas Puzzle

Her er en rask skutt i puslespillet vi skal bygge:
Klikk for å spille

Et par merknader:

Cross-nettleser kompatibilitet:

Mobil: koden gir her fungerer i ovennevnte desktop nettleser og er ikke optimalisert for mobil. Puslespillet vil laste inn og gjengi helt fint, men på grunn av berørings og dra atferd i mobile nettlesere, er optimalisering kreves for at det skal fungere riktig. Optimalisere dette puslespillet for mobil vil bli dekket i en fremtidig opplæringen.

Justerbar Vanskelighetsgrad: Koden inneholder en konstant, PUZZLE_DIFFICULTY, som bestemmer antall brikker. I demoen ovenfor, er dette satt til 4, noe som gir en 4x4 puslespill. Vi kan enkelt endre dette - for eksempel, har denne versjonen en PUZZLE_DIFFICULTY på 10.



Komme i gang

For å komme i gang, opprette en katalog for prosjektet. Plassere et bilde i katalogen som du ønsker å bruke som puslespill. Eventuelle web vennlig image vil gjøre, og det kan være noen størrelse ditt hjerte ønsker - bare sørg for at det passer inn i folden av nettleserens vindu



Trinn 1:. Opprette HTML-malen
< p> Åpne en ny fil ved hjelp av din favoritt teksteditor og lagre det inni prosjektkatalogen, ved siden av bildet. Deretter fylle ut dette grunnleggende HTML-mal
. ≪! DOCTYPE html > < html > < head > ≪ title > HTML5 Puzzle < /title > ≪ script > ≪ /script > < /head > < body onload = "init ();" > ≪ lerret id = "lerret" > < /canvas > < /body > < /html >

Alt vi trenger å gjøre her er å lage en standard HTML5 mal som inneholder ett lerret tag med id av "lerret ". Vi skal skrive en onload lytteren i kroppen tag som vil ringe vår init () funksjonen når sparken.

Nå starter ved å plassere markøren inne i skriptmerket. Herfra ut det handler javascript. Med unntak av de første variablene, vil jeg være å organisere delene av funksjon. Først viser du koden og deretter forklare logikken.

Klar? La oss få rett til det



Trinn 2:. Klar Våre variabler

La oss sette opp våre variabler og ta en titt på hver enkelt
konst PUZZLE_DIFFICULTY = 4; konst PUZZLE_HOVER_TINT = '# 009900'; Var _canvas, Div _stage, Div _img, Var _pieces, Div _puzzleWidth, Div _puzzleHeight, Div _pieceWidth, Div _pieceHeight, Div _currentPiece, Div _currentDropPiece, Var _mouse;

Først har vi et par konstanter : PUZZLE_DIFFICULTY og PUZZLE_HOVER_TINT. Den PUZZLE_DIFFICULTY konstant holder antall brikker i vår oppgave. I dette programmet, rader og kolonner alltid overens, så ved å sette PUZZLE_DIFFICULTY til 4, får vi 16 puslebiter totalt. . Økende dette øker vanskelighetsgraden i puslespillet

Neste er en rekke variabler:

_canvas og _stage vil holde en referanse til lerretet og til sin tegning sammenheng, henholdsvis. Vi gjør dette slik at vi ikke trenger å skrive ut hele spørringen hver gang vi bruker dem. Og vi skal bruke dem mye!

  • _img vil være en referanse til den lastet bildet, som vi skal kopiere piksler fra hele programmet.
  • _puzzleWidth, _puzzleHeight, _pieceWidth, og _pieceHeight vil bli brukt til å lagre dimensjonene av både hele puslespillet, og hver enkelt oppgave brikke. Vi setter disse en gang for å unngå å beregne dem om og om igjen hver gang vi trenger dem.
  • _currentPiece har en referanse til stykket tiden blir dratt.
  • _currentDropPiece har en referanse til stykket som er i posisjon til å bli droppet på. (I demoen er dette stykket uthevet i grønt.)
  • _mouse er en referanse som vil holde musen nåværende x og y posisjon. Denne blir oppdatert når puslespillet er klikket for å avgjøre hvilken brikke er berørt, og når en brikke blir dratt for å finne ut hva stykke det svever over.

    Nå, over til våre funksjoner.
    < hr>
    Trinn 3: init () funksjon
    funksjonen init () {_img = new Image (); _img.addEventListener ( 'load', onImage, false); _img.src = "mke.jpg";}

    Det første vi vil gjøre i vår søknad er å laste bildet for puslespillet. Bildet objektet først instansiert og satt til vår _img variabel. Deretter lytter vi for lasten hendelse som da vil fyre vår onImage () funksjonen når bildet er ferdig lastet. Til slutt satt vi kilden til bildet, noe som utløser belastningen



    Trinn 4:. The onImage () Funksjon
    funksjon onImage (e) {_pieceWidth = Math.floor (_img.width /PUZZLE_DIFFICULTY) _pieceHeight = Math.floor (_img.height /PUZZLE_DIFFICULTY) _puzzleWidth = _pieceWidth * PUZZLE_DIFFICULTY; _puzzleHeight = _pieceHeight * PUZZLE_DIFFICULTY; setCanvas (); initPuzzle ();}

    Nå som bildet er lastet, kan vi sette de fleste av variabler deklarert tidligere. Vi gjør dette her fordi vi nå har informasjon om bildet og kan sette våre verdier på riktig måte.

    Det første vi gjør er å beregne størrelsen på hver puslespill brikke. Vi gjør dette ved å dele PUZZLE_DIFFICULTY verdien av bredden og høyden på lastet bilde. Vi trim også fettet ut av kantene for å gi oss noen fine partall å jobbe med og sikrer at hver brikke kan hensiktsmessig bytte 'slots' med andre.

    Neste vi bruker våre nye puzzle piece verdier for å bestemme den totale størrelsen på puslespillet og sette disse verdiene til _puzzleWidth og _puzzleHeight

    Til slutt, kaller vi av noen få funksjoner -. setCanvas () og initPuzzle ().



    Trinn 5: setCanvas () -funksjonen
    funksjons setCanvas () {_canvas = document.getElementById ( 'lerret'); _stage = _canvas.getContext ( '2d'); _canvas.width = _puzzleWidth; _canvas.height = _puzzleHeight; _canvas.style.border = "1px solid black";}

    Nå som våre puslespill verdier er fullført, ønsker vi å sette opp vår lerretet element. Først satt vi vår _canvas variabel for å referere til vår lerret element, og _stage å referere til sin sammenheng.

    Nå har vi satt bredden og høyden av vår lerret å matche størrelsen på vår trimmet bilde, etterfulgt av å bruke noen enkle stiler å skape en svart ramme rundt vår lerret å vise grensene for vår oppgave



    Trinn 6:. Den initPuzzle () funksjon
    funksjon initPuzzle () {_pieces = []; _mouse = {x: 0, y: 0}; _currentPiece = null; _currentDropPiece = null; _stage.drawImage (_img, 0, 0, _puzzleWidth, _puzzleHeight, 0, 0, _puzzleWidth, _puzzleHeight); createTitle ( "Klikk for å starte Puzzle"); buildPieces ();}

    Her initial vi puslespillet. Vi setter denne funksjonen opp på en slik måte at vi kan kalle det igjen senere når vi ønsker å spille av puslespillet. Noe annet som måtte være satt før spiller ikke trenger å bli satt på nytt.

    Først satt vi _pieces som en tom matrise og skape _mouse objektet, som vil holde vår mus posisjon gjennom hele programmet. Neste vi setter _currentPiece og _currentPieceDrop til null. (På det første stykket disse verdiene vil allerede være null, men vi ønsker å sørge for at de får tilbakestilt når du kjører i puslespillet.)

    Til slutt, er det på tide å trekke! Først tegner vi hele bildet for å vise til spilleren hva de vil lage. Etter det skaper vi noen enkle instruksjoner ved å ringe vår createTitle () -funksjonen



    Trinn 7:. Den createTitle () Funksjon
    funksjon createTitle (msg) {_stage.fillStyle = "# 000000"; _stage.globalAlpha = 0,4; _stage.fillRect (100, _puzzleHeight - 40, _puzzleWidth - 200,40); _stage.fillStyle = "#FFFFFF"; _stage.globalAlpha = 1; _stage.textAlign = "center"; _stage.textBaseline = "middle"; _stage.font = "20px Arial"; _stage.fillText (msg, _puzzleWidth /2, _puzzleHeight - 20);}

    Her skaper vi et ganske enkelt budskap som instruerer brukeren til å klikke puslespillet for å begynne
    Vårt budskap vil være en semi-gjennomsiktig rektangel som. vil tjene som bakgrunn for vår tekst. Dette gjør at brukeren kan se bildet bak det, og også sikrer våre hvit tekst vil være leselig på et bilde

    Vi bare satt fyllstil til svart og globalAlpha til 0,4, før du fyller i en kort svart rektangel på bunnen av bildet.

    Siden globalAlpha påvirker hele lerretet, må vi sette det tilbake til 1 (ugjennomsiktig) før tegning teksten. For å sette opp vår tittel, setter vi Tekstjustering til "sentrum" og textBaseline til "midten". Vi kan også bruke noen skriftegenskaper.

    Hvis du vil tegne teksten, bruker vi fillText () -metoden. Vi passerer i msg variable og plassere den på den horisontale sentrum av lerretet, og den vertikale sentrum av rektangelet



    Trinn 8:. De buildPieces () -funksjonen
    funksjons buildPieces () { Var i; Var stykke; Var XPOS = 0; Var yPos = 0; for (i = 0; i < PUZZLE_DIFFICULTY * PUZZLE_DIFFICULTY; i ++) {stykke = {}; piece.sx = XPOS; piece.sy = yPos; _pieces.push (piece); XPOS + = _pieceWidth; if (XPOS > = _puzzleWidth) {XPOS = 0; yPos + = _pieceHeight; }} Document.onmousedown = shufflePuzzle;!}

    Til slutt er det på tide å bygge puslespill

    Vi gjør dette ved å bygge et objekt for hver brikke. Disse objektene vil ikke være ansvarlig for å gjengi til lerretet, men heller å bare holde referanser på hva du skal tegne og der. Når det er sagt, la oss få til det.

    First off, la oss erklære noen variabler som vi skal gjenbruk gjennom løkken. Vi ønsker å sette opp sløyfen for å iterere gjennom antall brikkene vi trenger. Vi får denne verdien ved å multiplisere PUZZLE_DIFFICULTY av seg selv - så i dette tilfellet får vi 16.

    I loopen:
    for (i = 0; i < PUZZLE_DIFFICULTY * PUZZLE_DIFFICULTY; i ++) {stykke = { }; piece.sx = XPOS; piece.sy = yPos; _pieces.push (piece); XPOS + = _pieceWidth; if (XPOS > = _puzzleWidth) {XPOS = 0; yPos + = _pieceHeight; }}

    Start med å lage en tom stykke objekt. Neste legge SX og sy egenskaper til objektet. I den første iterasjon, disse verdiene er 0 og representerer et punkt i vårt bilde hvor vi skal begynne å trekke fra. Nå skyver det til _pieces [] array. Dette objektet vil også inneholde eiendommer XPOS og yPos, som vil fortelle oss den nåværende posisjon i puslespillet hvor stykket skal trekkes. Vi kommer til å stokke gjenstandene før det spilles slik at disse verdiene ikke trenger å bli satt helt enda.

    Det siste vi gjør i hver sløyfe er å øke den lokale variable XPOS av _pieceWidth. Før du fortsetter med loop, bestemmer vi om vi trenger å gå ned til neste rad brikker ved å sjekke om XPOS er utenfor bredden av puslespillet. Hvis ja, null vi XPOS tilbake til 0 og øke yPos av _pieceHeight.

    Nå har vi våre brikkene all lagret bort pent i vår _pieces array. På dette punktet koden endelig stopper gjennomføre og venter for brukeren å samhandle. Vi setter et klikk lytter til dokumentet for å fyre av shufflePuzzle () -funksjonen når den utløses, som vil starte spillet.



    Trinn 9: shufflePuzzle () Funksjon
    funksjon shufflePuzzle () {_pieces = shuffleArray (_pieces); _stage.clearRect (0,0, _puzzleWidth, _puzzleHeight); Var i; Var stykke; Var XPOS = 0; Var yPos = 0; for (i = 0; i < _pieces.length; i ++) {piece = _pieces [i]; piece.xPos = XPOS; piece.yPos = yPos; _stage.drawImage (_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, XPOS, yPos, _pieceWidth, _pieceHeight); _stage.strokeRect (XPOS, yPos, _pieceWidth, _pieceHeight); XPOS + = _pieceWidth; if (XPOS > = _puzzleWidth) {XPOS = 0; yPos + = _pieceHeight; }} Document.onmousedown = onPuzzleClick;} funksjon shuffleArray (o) {for (var j, x, i = o.length; i; j = parseInt (Math.random () * i), x = o [- i ], o [i] = o [j], o [j] = x); returnere o;}

    Første ting først: stokke _pieces [] array. Jeg bruker en fin nyttefunksjon her som vil stokke indeksene i tabellen gått inn i den. Forklaringen på denne funksjonen er utenfor temaet for denne opplæringen, slik at vi skal gå videre, vel vitende om at vi har lykkes stokket våre stykker. (For en grunnleggende innføring i shuffling, ta en titt på denne opplæringen.)

    La oss først klart all grafikk trukket til lerretet for å gjøre vei for å tegne våre stykker. Deretter sette opp matrisen lik hvordan vi gjorde da først å lage våre stykke stedene.

    I loopen:
    for (i = 0; i < _pieces.length; i ++) {stykke = _pieces [i]; piece.xPos = XPOS; piece.yPos = yPos; _stage.drawImage (_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, XPOS, yPos, _pieceWidth, _pieceHeight); _stage.strokeRect (XPOS, yPos, _pieceWidth, _pieceHeight); XPOS + = _pieceWidth; if (XPOS > = _puzzleWidth) {XPOS = 0; yPos + = _pieceHeight; }}

    Først av alt, bruker jeg variabelen for å sette opp vår henvisning til løpende stykke objektet i loop. Nå fyller vi XPOS og yPos egenskapene jeg nevnte tidligere, som vil være 0 i vår første iterasjon.

    Nå, endelig, trekker vi våre stykker.

    Den første parameteren for drawImage () tildeler kilden til bildet vi ønsker å trekke fra. Deretter bruker stykket objekter sx og sy egenskaper, sammen med _pieceWidth og _pieceHeight, for å fylle de parametrene som erklærer den delen av bildet som å trekke fra. De siste fire parametere satt området på lerretet hvor vi ønsker å tegne. Vi bruker XPOS og yPos verdier som vi er både bygg i loop og tildele til objektet.

    Umiddelbart etter dette trekker vi en rask strek rundt stykket for å gi den en grense, som vil skille det pent fra de andre brikkene.

    nå venter vi for brukeren å ta en del ved å sette en annen klikk lytteren. Denne gangen vil det brann en onPuzzleClick () -funksjonen



    Trinn 10:. Den onPuzzleClick () Funksjon
    funksjon onPuzzleClick (e) {if (e.layerX || e.layerX == 0 ) {_mouse.x = e.layerX - _canvas.offsetLeft; _mouse.y = e.layerY - _canvas.offsetTop; } Else if (e.offsetX || e.offsetX == 0) {_mouse.x = e.offsetX - _canvas.offsetLeft; _mouse.y = e.offsetY - _canvas.offsetTop; } _currentPiece = CheckPieceClicked (); if (_currentPiece = null) {_stage.clearRect (_currentPiece.xPos, _currentPiece.yPos, _pieceWidth, _pieceHeight); _stage.save (); _stage.globalAlpha = 0,9; _stage.drawImage (_img, _currentPiece.sx, _currentPiece.sy, _pieceWidth, _pieceHeight, _mouse.x - (_pieceWidth /2), _mouse.y - (_pieceHeight /2), _pieceWidth, _pieceHeight); _stage.restore (); document.onmousemove = updatePuzzle; document.onmouseup = pieceDropped; }}

    Vi vet at puslespillet ble klikket; Nå må vi finne ut hva stykke ble klikket på. Denne enkle betinget vil få oss vår mus posisjon på alle moderne nettlesere som støtter lerretet, ved hjelp av enten e.layerX og e.layerY eller e.offsetX og e.offsetY. Bruk disse verdiene til å oppdatere vår _mouse objekt ved å tilordne den en x og y eiendom for å holde den gjeldende museposisjon -. I dette tilfellet, posisjonen der det ble klikket

    I tråd 112 vi så umiddelbart satt _currentPiece til returnerte verdien fra vår checkPieceClicked () -funksjonen. Vi skiller denne koden fordi vi ønsker å bruke det senere når du drar puslespill brikke. Jeg skal forklare denne funksjonen i neste trinn.

    Hvis den returnerte verdien var null, vi rett og slett ikke gjøre noe, da dette innebærer at brukeren ikke faktisk klikker på et puslespill brikke. Men hvis vi gjør hente et puslespill brikke, ønsker vi å feste den til mus og fade den ut litt for å avsløre bitene under. Så hvordan gjør vi dette?

    Først fjerner vi lerretet området der stykket satt før vi klikket det. Vi bruker clearRect () enda en gang, men i dette tilfelle vi passere i bare området oppnås fra _currentPiece objektet. Før vi tegne det, ønsker vi å lagre () sammenheng med lerretet før du fortsetter. Dette vil sikre at alt vi trekke etter lagring vil ikke bare tegne over alt i sin vei. Vi gjør dette fordi vi vil være litt fading dratt stykke og ønsker å se bitene under den. Hvis vi ikke kalle lagre (), ville vi bare tegne over all grafikk i måten - falmet eller ikke

    Nå trekker vi på bildet så sitt senter er plassert på musepekeren.. De første 5 parametere av drawImage vil alltid være den samme gjennom hele programmet. Når du klikker, vil de neste to parametre oppdateres for å sentrere seg til pekeren på musen. De to siste parametrene, bredden og høyden til å tegne, vil også aldri endres.

    Til slutt vi kaller gjenopprette () -metoden. Dette betyr i hovedsak er vi ferdig med å bruke den nye alpha verdi og vil gjenopprette alle eiendommene tilbake til der de var. For å bryte opp denne funksjonen vi legge til to flere lyttere. Én for når vi beveger musen (dra puslespill brikke), og en for når vi la gå (slippe puslespill brikke)



    Trinn 11:. Den checkPieceClicked () Funksjon
    funksjon checkPieceClicked () {var i; Var stykke; for (i = 0; i < _pieces.length; i ++) {piece = _pieces [i]; if (_mouse.x < piece.xPos || _mouse.x > (piece.xPos + _pieceWidth) || _mouse.y < piece.yPos || _mouse.y > (piece.yPos + _pieceHeight)) { //PIECE IKKE HIT} else {return stykke; }} Returnerer null;}

    Nå må vi backtrack litt. Vi var i stand til å avgjøre hva stykket ble klikket, men hvordan vi gjør det? Det er ganske enkelt faktisk. Det vi trenger å gjøre er å sløyfe gjennom alle brikkene og finne ut om klikk var innenfor reglene for noen av våre stedene. Hvis vi finner en, vi returnere matchet objektet og avslutte funksjonen. Hvis vi finner ingenting, returnerer vi null



    Trinn 12:. Den updatePuzzle () Funksjon
    funksjon updatePuzzle (e) {_currentDropPiece = null; if (e.layerX || e.layerX == 0) {_mouse.x = e.layerX - _canvas.offsetLeft; _mouse.y = e.layerY - _canvas.offsetTop; } Else if (e.offsetX || e.offsetX == 0) {_mouse.x = e.offsetX - _canvas.offsetLeft; _mouse.y = e.offsetY - _canvas.offsetTop; } _stage.clearRect (0,0, _puzzleWidth, _puzzleHeight); Var i; Var stykke; for (i = 0; i < _pieces.length; i ++) {piece = _pieces [i]; if (stykke == _currentPiece) {fortsette; } _stage.drawImage (_img, Piece.sx, piece.sy, _pieceWidth, _pieceHeight, piece.xPos, piece.yPos, _pieceWidth, _pieceHeight); _stage.strokeRect (piece.xPos, piece.yPos, _pieceWidth, _pieceHeight); if (_currentDropPiece == null) {if (_mouse.x < piece.xPos || _mouse.x > (piece.xPos + _pieceWidth) || _mouse.y < piece.yPos || _mouse.y > ( piece.yPos + _pieceHeight)) {//IKKE OVER} else {_currentDropPiece = stykke; _stage.save (); _stage.globalAlpha = 0,4; _stage.fillStyle = PUZZLE_HOVER_TINT; _stage.fillRect (_currentDropPiece.xPos, _currentDropPiece.yPos, _pieceWidth, _pieceHeight); _stage.restore (); }}} _stage.save (); _stage.globalAlpha = 0,6; _stage.drawImage (_img, _currentPiece.sx, _currentPiece.sy, _pieceWidth, _pieceHeight, _mouse.x - (_pieceWidth /2), _mouse.y - (_pieceHeight /2), _pieceWidth, _pieceHeight); _stage.restore (); _stage.strokeRect (_mouse.x - (_pieceWidth /2), _mouse.y - (_pieceHeight /2), _pieceWidth, _pieceHeight);}

    Nå tilbake til å dra. Vi kaller denne funksjonen når brukeren beveger musen. Dette er den største funksjonen av programmet som det gjør flere ting. La oss begynne. Jeg vil bryte det ned så vi går
    _currentDropPiece = null.; if (e.layerX || e.layerX == 0) {_mouse.x = e.layerX - _canvas.offsetLeft; _mouse.y = e.layerY - _canvas.offsetTop; } Else if (e.offsetX || e.offsetX == 0) {_mouse.x = e.offsetX - _canvas.offsetLeft; _mouse.y = e.offsetY - _canvas.offsetTop; }

    Start med å sette _currentDropPiece til null. Vi trenger å tilbakestille dette tilbake til null på oppdatering på grunn av muligheten for at våre stykke ble dratt tilbake til sitt hjem. Vi ønsker ikke den forrige _currentDropPiece verdi hengende rundt. Neste vi setter _mouse objekt på samme måte som vi gjorde på klikk
    _stage.clearRect (0,0, _puzzleWidth, _puzzleHeight);.

    Her må vi gjøre klar alle grafikk på lerretet. Vi trenger egentlig å tegne brikkene fordi objektet som dras på toppen vil påvirke deres utseende. Hvis vi ikke gjør dette, vil vi se noen svært merkelige resultater å følge veien til vår dratt puslespill brikke
    Var jeg.; Var stykke; for (i = 0; i < _pieces.length; i ++) {

    Begynn med å sette opp vår vanlige brikker sløyfe

    In the Loop.
    stykke = _pieces [i]; if (stykke == _currentPiece) {fortsette; }

    Opprett våre stykke referanse som vanlig. Neste sjekk om stykket vi nå refererer er det samme som stykket vi drar. Hvis så, fortsetter sløyfen. Dette vil holde dratt stykke hjem slot tom
    _stage.drawImage (_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, piece.xPos, piece.yPos, _pieceWidth, _pieceHeight.); _stage.strokeRect (piece.xPos, piece.yPos, _pieceWidth, _pieceHeight);

    Moving on, tegne puslespill brikke ved hjelp av dens egenskaper nøyaktig samme måte som vi gjorde da først trakk dem. Du må trekke grensen så vel
    if (_currentDropPiece == null) {if (_mouse.x. ≪ piece.xPos || _mouse.x > (piece.xPos + _pieceWidth) || _mouse. y < piece.yPos || _mouse.y > (piece.yPos + _pieceHeight)) {//IKKE OVER} else {_currentDropPiece = stykke; _stage.save (); _stage.globalAlpha = 0,4; _stage.fillStyle = PUZZLE_HOVER_TINT; _stage.fillRect (_currentDropPiece.xPos, _currentDropPiece.yPos, _pieceWidth, _pieceHeight); _stage.restore (); }}

    Siden vi har en referanse til hvert objekt i loop, kan vi også bruke denne anledningen til å sjekke om den dras brikke er på toppen av det. Vi gjør dette fordi vi ønsker å gi brukeren tilbakemelding på hva stykke det kan bli droppet på. La oss grave i den koden nå.

    Først ønsker vi å se om denne sløyfen har allerede produsert en dråpe mål. I så fall trenger vi ikke å bry siden bare en dråpe mål kan være mulig og enhver mus flytte. Hvis ikke, vil _currentDropPiece være null, og vi kan fortsette inn i logikken. Siden vår musen er i midten av dratt stykke, er alt vi virkelig trenger å gjøre bestemme hva andre stykke vår musen er over.

    Deretter bruker vår praktiske checkPieceClicked () -funksjonen til å avgjøre om musen svever i løpet av den gjeldende stykket objektet i sløyfen. Hvis ja, vi setter _currentDropPiece variabel og tegne en farget boks over puslespill brikke, noe som indikerer at det nå er på rulle målet.

    Husk å lagre () og gjenopprette (). Ellers vil du få tonet boksen og ikke bildet under

    Out of the Loop:
    _stage.save ();. _stage.globalAlpha = 0,6; _stage.drawImage (_img, _currentPiece.sx, _currentPiece.sy, _pieceWidth, _pieceHeight, _mouse.x - (_pieceWidth /2), _mouse.y - (_pieceHeight /2), _pieceWidth, _pieceHeight); _stage.restore (); _stage.strokeRect (_mouse.x - (_pieceWidth /2), _mouse.y - (_pieceHeight /2), _pieceWidth, _pieceHeight);

    Sist men ikke minst må vi tegne dratt stykke. Koden er den samme som når vi først klikket det, men musa har flyttet så sin posisjon vil bli oppdatert



    Trinn 13:. Den pieceDropped () Funksjon
    funksjon pieceDropped (e) { document.onmousemove = null; document.onmouseup = null; if (_currentDropPiece = null!) {var tmp = {XPOS: _currentPiece.xPos, yPos: _currentPiece.yPos}; _currentPiece.xPos = _currentDropPiece.xPos; _currentPiece.yPos = _currentDropPiece.yPos; _currentDropPiece.xPos = tmp.xPos; _currentDropPiece.yPos = tmp.yPos; } ResetPuzzleAndCheckWin ();}

    OK, er det verste bak oss. Vi er nå lykkes å dra en puslespill brikke og selv får visuell tilbakemelding på hvor det vil bli droppet. Nå er alt som er igjen er å slippe stykket. La oss først ta tilhørerne med en gang siden ingenting blir dratt.

    Deretter sjekker du at _currentDropPiece er ikke null. Dersom det er, betyr dette at vi dratt den tilbake til stykket hjemmeområde og ikke over en annen spalte. Hvis det ikke er null, fortsetter vi med funksjonen.

    Hva vi gjør nå er rett og slett bytte XPOS og yPos av hver brikke. Vi gjør en rask temp objekt som en buffer for å holde en av objektets verdier i bytte prosessen. På dette punktet, de to delene begge har nye XPOS og yPos verdier, og vil knipse i sine nye hjem på neste trekning. Det er det vi skal gjøre nå, samtidig sjekke om spillet har blitt vunnet



    Trinn 14:. Den resetPuzzleAndCheckWin () Funksjon
    funksjon resetPuzzleAndCheckWin () {_stage.clearRect (0,0, _puzzleWidth, _puzzleHeight); Var gameWin = true; Var i; Var stykke; for (i = 0; i < _pieces.length; i ++) {piece = _pieces [i]; _stage.drawImage (_img, piece.sx, piece.sy, _pieceWidth, _pieceHeight, piece.xPos, piece.yPos, _pieceWidth, _pieceHeight); _stage.strokeRect (piece.xPos, piece.yPos, _pieceWidth, _pieceHeight); if (piece.xPos = piece.sx || piece.yPos = piece.sy!) {gameWin = false; }} If (gameWin) {setTimeout (Gameover, 500); }}

    Nok en gang, fjerner lerretet og sette opp en gameWin variabel, sette den til sann som standard. Nå går videre med vårt altfor kjent stykker loop.

    Koden her bør se kjent, slik at vi ikke vil gå over det. Det trekker bare bitene tilbake til sine opprinnelige eller nye spor. Innenfor denne sløyfen, ønsker vi å se om hver brikke blir trukket i sin vinnende posisjon. Dette er enkel: vi sjekke for å se om våre sx og sy egenskaper matche opp med XPOS og yPos. Hvis ikke, vet vi at vi kunne ikke muligens vinne puslespill og satt gameWin til false. Hvis vi gjorde det gjennom løkken med alle i deres vinnende steder, vi satt opp en rask timeout for å ringe vår Gameover () -metoden. (Vi satt en timeout slik at skjermen ikke forandre seg så drastisk på å slippe puslespill brikke.)



    Trinn 15: The Gameover () Funksjon
    funksjon Gameover () {document.onmousedown = null; document.onmousemove = null; document.onmouseup = null; initPuzzle ();}

    Dette er vår siste funksjonen! Her har vi bare fjerne alle lyttere og ringe initPuzzle (), som tilbakestiller alle nødvendige verdier og venter for brukeren å spille igjen.



    Konklusjon

    Klikk her for å se det endelige resultatet.

    Som du ser, kan du gjøre en masse nye kreative ting i HTML5 hjelp utvalgte bitmap områdene lastet bilder og tegning. Du kan enkelt utvide dette programmet ved å legge scoring og kanskje til og med en timer for å gi det mer gameplay. En annen idé ville være å øke vanskelighetsgraden og velge et annet bilde i Gameover () -funksjonen, noe som gir spillet nivåer.