POR poate accelera dezvoltarea și aplicațiile dvs. se execută mai repede. În timpul acestui tutorial voi demonstra cum să construiți un joc ActionScript Connect 4, folosind o abordare organizată OOP.
Să începem!
În fișierele sursă am inclus un fișier connect4_start.fla. Începeți din acest fișier; conține toate instrumentele necesare pentru terminarea tutorialului. Acesta conține 4 movieclips. Un movieclip cu chip roșu, un movieclip de cip galben, un movieclip de pătrată și un dialog cinematografic câștigător.
Creați un nou fișier ActionScript și salvați-l cu numele Connect4. Apoi adăugați următorul cod:
pachet import flash.display.Sprite import flash.events.MouseEvent; importul flash.events.Event; import flash.geom.Point; import caurina.transitions.Tweener; clasa publică Connect4 extinde Sprite private var coloane: uint; private var rows: uint; placă privată var: Array = new Array (); coloană privată var Width: uint; private var rowHeight: uint; private var actualPlayer: uint = 1; private var currentChip; funcția publică Connect4 (coloane: uint, rânduri: uint): void this.columns = coloane this.rows = rânduri coloanăWidth = new BoardPiece () width rowHeight = new BoardPiece ()
În acest bloc de coduri vom importa clasele (am folosit de asemenea clasa Tweener pe care o puteți găsi aici sau în fișierele sursă). Definim variabilele de câmp și creăm constructorul. Constructorul are două argumente, numărul de coloane și rânduri pe care le doriți pentru jocul dvs. Am pus aceste valori în variabilele noastre de câmp.
În final, introducem variabila Coloană Lățime și Rând. O coloană are aceeași lățime ca lățimea unui singur placă (același principiu pentru rowHeight).
Această funcție va desena panoul de joc al jocului în funcție de câte coloane și rânduri doriți. Adăugați această funcție la constructorul din clasa Connect4:
funcția privată drawboard (): void pentru (var i: uint = 0; i < rows; i++) for(var j:uint = 0; j < columns; j++) var boardpiece:BoardPiece = new BoardPiece(); boardpiece.x = j * boardpiece.width; boardpiece.y = i * boardpiece.height; this.addChild(boardpiece);
Aici vom crea o matrice bidimensională care va conține toate locațiile plăcii.
Completăm matricea cu 0. Un zero înseamnă că nu a fost plasat un cip pe această poziție. Această funcție trebuie, de asemenea, adăugată constructorului.
funcția privată createboardArray (): void pentru (var i: uint = 0; i < rows; i++) board[i] = [] for(var j:uint=0; j < columns; j++) board[i][j] = 0;
În această funcție, identificăm cine este jucătorul curent și adăugați cipul corespunzător în lista de afișare. Oferim cipului o valoare negativă y, astfel încât acesta să apară deasupra tabloului de bord. Încă o dată, adăugați această funcție la constructor.
funcția privată putChipReady (): void if (currentPlayer == 1) currentChip = nou RedChip (); altceva currentChip = noul YellowChip (); currentChip.y = -50; this.addChildAt (currentChip, 0);
În fiecare cadru, această funcție calculează coloana în care cipul curent ar trebui să cadă dacă faceți clic în acel moment. În acest fel este mai ușor pentru utilizator să facă o mutare. Funcția calculateColumn (explicată în pasul următor) returnează coloana pe care o plasați.
Apoi vom calcula noua pozitie x a cipului. Prin urmare, înmulțim coloana actuală cu lățimea coloanei. Deoarece punctul de înregistrare al chips-urilor în centru trebuie să adăugăm lățimea coloanei împărțită la 2.
În cele din urmă, am adăugat chipul curent la poziția pe care tocmai l-am calculat.
funcția privată enterFrameHandler (e: Eveniment): void var currentcolumn: uint = calculColumn (this.mouseX); var xPosChip: uint = coloană curentă * coloană Lățime + coloană Lățime / 2 Tweener.addTween (actualChip, x: xPosChip, timp: 0,3, tranziție: "lineair");
Adăugați constructorul pentru introducerea cadrului pentru evenimente.
this.addEventListener (Event.ENTER_FRAME, enterFrameHandler);
Această funcție de ajutor primește poziția x a mouse-ului și returnează oricare coloană care se potrivește.
Dacă poziția x a mouse-ului este mai mică decât zero atunci vom întoarce prima coloană (0 deoarece matricea este indexată zero). Dacă poziția x a mouse-ului este mai mare decât lățimea plăcii dvs., vom returna ultima coloană. Dacă poziția x a mouse-ului este pe placă, împărțiți poziția x cu lățimea unei coloane.
funcția privată calculateColumn (mouseXPos): uint if (mouseXPos < 0) return 0; else if(mouseXPos > this.width) retur coloane - 1; altceva return mouseXPos / columnWidth;
Această funcție verifică mai întâi ce coloană ați făcut clic (utilizând funcția de calculare a coloanelor pe care am explicat-o în pasul anterior).
pentru buclele prin toate rândurile și cât mai curând bord [rând] [col.clicked] == 0 știm că cipul trebuie plasat pe acea locație. Rețineți că 0 din tabloul BOARD înseamnă că locația este goală.
Dacă găsim locația unde cipul trebuie să cadă, vom completa poziția respectivă în tabloul de bord cu numărul jucătorului curent (avem nevoie de aceste numere mai târziu pentru a verifica câștigătorul) și plasăm cipul cu funcția placeChip ( explicat în pasul următor).
În cele din urmă, vom comuta pe player (explicat 2 pași mai departe) și am pus un alt cip gata. Returul ne asigură că ieșim din pentru buclă.
funcția privată a funcțieiClick (e: MouseEvent): void var columnclicked: uint = calculColumn (e.currentTarget.mouseX); pentru (rândul var: int = rânduri-1; rândul = = 0; rândul--) if (bord [row] [columnclicked] == 0) bord [rând] [columnclicked] = currentPlayer; placeChip (punct nou (rând, coloană cromată)) togglePlayer (); putChipReady (); întoarcere
Adăugați clicătorul de evenimente pentru eveniment la constructor.
this.addEventListener (MouseEvent.CLICK, boardClick)
Această funcție primește rândul (position.x) și coloana (position.y) unde trebuie introdus cipul, apoi calculează distanța y și x.
distanceY: înmulți rândul pe care ai făcut clic cu înălțimea unui rând. Deoarece punctul de înregistrare a cipurilor este centrat, trebuie să adăugăm înălțimea rândului împărțită la 2.
distanceX utilizează același principiu.
Apoi vom folosi tweener pentru a trece între cipul curent și poziția corectă.
funcția privată placeChip (poziție: Point): void var distanțaY: int = position.x * rowHeight + rowHeight / 2; var distanceX: int = position.y * coloana Lățime + coloană Lățime / 2; Tweener.addTween (actualChip, x: distanceX, y: distanceY, timp: 0.7, tranziție: "easeOutBounce");
Această funcție este destul de dreaptă. Dacă playerul curent este 1, comutați la playerul 2, altfel comutați înapoi la playerul 1.
funcția privată togglePlayer (): void if (currentPlayer == 1) currentPlayer = 2 altceva currentPlayer = 1
În acest moment puteți plasa deja jetoanele, dar în prezent nu există nici un control pentru a vedea dacă un jucător a reușit să conecteze 4 jetoane. Următorul pas este codarea acestei verificări.
Această funcție are 1 argument, poziția cipului ultimul plasat și returnarea adevărată sau falsă. Funcția utilizează 4 subfuncții, fiecare dintre acestea verificând un câștigător.
Trecem prin poziția pentru fiecare subfuncție. Dacă unul dintre cele 4 retururi este adevărat, avem un câștigător.
funcția privată checkForWinner (position: Point): Boolean if (verticalCheck (poziție)) return true; dacă (horizontalCheck (poziție)) return true; dacă (leftUpDiagonalCheck (position)) returnează adevărat; dacă (rightUpDiagonalCheck (position)) returnează adevărat; return false;
Pentru a verifica o conexiune verticală 4, trebuie doar să privim chips-urile de sub cipul curent. (Nu poate fi un chip deasupra cipului curent în acest moment).
Mai întâi verificăm dacă există 3 locații sub cipul curent. Dacă nu, nu există nicio modalitate de a vă conecta 4 și vom reveni false.
Dacă există 3 sau mai multe locații dedesubt, începem o buclă care trece prin cele 3 rânduri de dedesubt. Dacă unul dintre jetoanele de dedesubt este de la celălalt jucător nu am conectat 4 jetoane (return false).
Dacă bucla poate fi terminată știm că sunt 4 conectate (return true).
funcția verticalCheck (poziție: Point): Boolean var row: uint = position.x; var coloana: uint = position.y; var jucător: uint = bord [rând] [coloană]; dacă (rând> = rânduri - 3) return false; pentru (var i: uint = rând + 1; i <= row + 3; i++) if (board[i][column] != player) return false; return true;
Ceea ce facem aici este verificarea mai întâi a jetoanelor din partea stângă a cipului curent și apoi a chips-urilor din partea dreaptă.
Prin urmare, inițializăm un contor cu 1 (chipul pe care tocmai l-ai plasat este primul din rând). Apoi vom merge în stânga până când vom ajunge la un cip de alt jucător și în același timp vom număra jetoanele jucătorului curent.
Facem același lucru și pentru partea dreaptă. Deci, dacă contorul nostru este de 4 sau mai mult, am conectat 4 jetoane (return true).
funcția horizontalCheck (poziție: Point): Boolean var row: uint = position.x; var coloana: uint = position.y; var jucător: uint = bord [rând] [coloană]; var contor: uint = 1; pentru (var i: uint = coloana 1; i> = 0; i -) if (bord [rând] [i]! = player) break; contra ++; pentru (var j: uint = coloana + 1; j= 4) return true; altfel return false;
Aceste funcții sunt similare cu verificarea orizontală. Singura diferență este că acum verificăm în diagonală.
Mai întâi mergem la stânga: numărăm chips-urile jucătorului curent și dacă întâlnim un chip al celuilalt jucător, rupem bucla. Pentru a vă asigura că nu ieșim în afara tabloului nostru de bord in timp ce buclă trebuie să se oprească atunci când rândul nostru sau coloana noastră este mai mică de 0.
Folosim același principiu pentru a verifica pozițiile directe în jos.
function leftUpDiagonalCheck (pozitie: Point): Boolean var player: uint = placa [position.x] [position.y]; rândul var: număr = poziție.x - 1; coloană var: Număr = poziție.y - 1; var contor: uint = 1; în timp ce (rând> = 0 && coloană = = 0) if (bord [rând] [coloană] == player) counter ++; rând--; coloană--; altceva break; rând = poziția.x + 1; coloana = poziția.y + 1; în timp ce (rândul < rows && column < columns) if (board[row][column] == player) counter++; row++; column++; else break; if(counter >= 4) return true; altfel return false;
Această funcție este aproape identică cu cea anterioară. Singura diferență este direcția diagonalei pe care o verificăm.
funcția privată rightUpDiagonalCheck (poziția: Point): Boolean var player: uint = board [position.x] [position.y]; rândul var: numărul = position.x + 1; coloană var: Număr = poziție.y - 1; var contor: uint = 1; în timp ce (rândul < rows && column >= 0) dacă (bord [rând] [coloană] == player) contra ++; rând ++; coloană--; altceva break; rând = poziția.x - 1; coloana = poziția.y + 1; în timp ce (rând> 0 = & coloană < columns) if (board[row][column] == player) counter++; row--; column++; else break; if(counter >= 4) return true; altfel return false;
Acum trebuie să implementăm codul pe care tocmai l-am scris. După ce plasăm cipul, verificăm un câștigător. Dacă avem un câștigător, eliminăm EventListeners, astfel încât să nu puteți plasa un nou cip și vom arăta cine a câștigat (explicat în pasul următor). Dacă nu avem un câștigător, vom comutaPlayer și vom pune un nou cip gata.
funcția privată a funcțieiClick (e: MouseEvent): void var columnclicked: uint = calculColumn (e.currentTarget.mouseX); pentru (rândul var: int = rânduri-1; rândul = = 0; rândul--) if (bord [row] [columnclicked] == 0) bord [rând] [columnclicked] = currentPlayer; placeChip (punct nou (rând, coloanăclasat)) dacă (checkForWinner (punct nou (rând, coloanăclasat))) this.removeEventListener (Event.ENTER_FRAME, enterFrameHandler); this.removeEventListener (MouseEvent.CLICK, boardClick); showWinnerDialog (); altceva togglePlayer (); putChipReady (); întoarcere
Această funcție adaugă pur și simplu o nouă instanță a WinnerDialog pe care o puteți găsi în bibliotecă. Dacă jucătorul actual are 1 victorie roșie, altfel galbenul câștigă.
funcția privată showWinnerDialog (): void var dialog: WinnerDialog = nou WinnerDialog (); var câștigător: String = (currentPlayer == 1)? "roșu": "galben" dialog.txtWinner.text = câștigător + "câștigă !!!"; dialog.x = (această lățime - dialog.width) / 2; dialog.y = 100; this.addChild (dialog);
Creați un nou fișier ActionScript și salvați-l cu numele "Application".
În această clasă adăugăm o instanță a clasei Connect4 pe care am scris-o în lista de afișare. Nu uitați argumentele constructorului.
pachet import flash.display.MovieClip; importul flash.events.Event; clasa publică Aplicația extinde MovieClip funcția publică funcția (): void var connect4: Connect4 = new Connect4 (7,6); connect4.x = (stadiu.stageWidth - connect4.width) / 2; connect4.y = (stadiu.altitudineHeight - connect4.height) / 2 + 50; this.addChild (Connect4);
În cele din urmă, faceți clic pe scenă și setați Class Document la "Application".
Tocmai ați învățat cum să creați un joc de conectare 4 și modul în care mai multe dimensiuni pot face viața mult mai ușoară! Sper că v-ați bucurat de tutorial și vă mulțumesc pentru lectură.