//Megcserél két piece-t public void FlipPieces(Point firstPoint, Point secondPoint, bool isItMain) { if (GetValueofPoint(firstPoint) < 0) { return; } GridCell firstCell = GetCellAtPoint(firstPoint); Piece firstPiece = firstCell.GetPieceFromCell(); //Ellenőrzi a másik elemet is if (GetValueofPoint(secondPoint) > 0) { GridCell secondCell = GetCellAtPoint(secondPoint); Piece secondPiece = secondCell.GetPieceFromCell(); firstCell.AddPieceToCell(secondPiece); secondCell.AddPieceToCell(firstPiece); if (isItMain) { flippedPieceList.Add(new FlippedPieces(firstPiece, secondPiece)); } //Hozzáadjuk őket, mert kell az update updatePieceList.Add(firstPiece); updatePieceList.Add(secondPiece); } //Ha a második piece nem érvényes (pl hole, blank stb) akkor nincs csere else { ResetPiece(firstPiece); } }
//A már rendezett grid értékek szerint létrehozza a Piece elemeket és a cellákhoz adja őket void CreateBoard() { for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { GridCell currentCell = GetCellAtPoint(new Point(x, y)); if (currentCell.valueOfCell <= 0) { continue; } GameObject point = Instantiate(piecePrefab, gameBoard); Piece piece = point.GetComponent <Piece>(); RectTransform basePosition = point.GetComponent <RectTransform>(); basePosition.anchoredPosition = new Vector2(imageSize / 2 + (imageSize * x), -imageSize / 2 - (imageSize * y)); piece.Initialize(currentCell.valueOfCell, new Point(x, y), dataController.elements[currentCell.valueOfCell - 1].returnSprite()); currentCell.AddPieceToCell(piece); } } }
void ApplyGravityToColumn(int x) { //Lentről felfele vizsgáljuk a gridet. for (int y = (height - 1); y >= 0; y--) { Point checkedPoint = new Point(x, y); GridCell cell = GetCellAtPoint(checkedPoint); int val = GetValueofPoint(checkedPoint); if (val != 0) { continue; } //A következő elemeket vizsgáljuk for (int my = (y - 1); my >= -1; my--) { Point nextPoint = new Point(x, my); int nextval = GetValueofPoint(nextPoint); if (nextval == 0) { continue; } //Ha a következő pont nem egy lyuk if (nextval != -1) { //Akkor a következő elemet magunkra húzzuk és lyukat hagyunk helyette GridCell nextCell = GetCellAtPoint(nextPoint); Piece nextPiece = nextCell.GetPieceFromCell(); cell.AddPieceToCell(nextPiece); updatePieceList.Add(nextPiece); nextCell.AddPieceToCell(null); } //Ha a következő elem egy lyuk else { //Kérünk egy random értéket int newPieceValue = GiveRandomPieceValue(); Piece newPiece; //Beállítjuk az eséspontot Point fallPoint = new Point(x, (-1 - fills[x])); //Ha van már használt piece akkor újrahasznosítjuk if (usedPieceList.Count > 0) { Piece reusedPiece = usedPieceList[0]; reusedPiece.gameObject.SetActive(true); newPiece = reusedPiece; //Eltávolítjuk az újrahasznált piece-t a listáról usedPieceList.RemoveAt(0); } //Ha nincs akkor meg csinálunk újat else { GameObject obj = Instantiate(piecePrefab, gameBoard); Piece createdPiece = obj.GetComponent <Piece>(); newPiece = createdPiece; } //Létrehozzuk a zuhanási pontra az új elemünket newPiece.Initialize(newPieceValue, checkedPoint, dataController.elements[newPieceValue - 1].returnSprite()); newPiece.rect.anchoredPosition = GetPositionFromPoint(fallPoint); //Betömjük a lyukat GridCell hole = GetCellAtPoint(checkedPoint); hole.AddPieceToCell(newPiece); ResetPiece(newPiece); fills[x]++; } break; } } }
//*******Aktív fázis******* //Változások kezelése void Update() { if (battleManager.GetBattleState() == BattleState.PlayerTurn) { //Mozgások szerint a pozíciók frissítése List <Piece> finishedUpdatingList = new List <Piece>(); for (int i = 0; i < updatePieceList.Count; i++) { Piece piece = updatePieceList[i]; if (!piece.UpdatePiece()) { finishedUpdatingList.Add(piece); } } for (int i = 0; i < finishedUpdatingList.Count; i++) { Piece piece = finishedUpdatingList[i]; FlippedPieces flip = GetFlipped(piece); Piece flippedPiece = null; //Simább piece esés int x = (int)piece.positionInGrid.x; fills[x] = Mathf.Clamp(fills[x] - 1, 0, width); List <Point> listOfConnectedPoints = IsConnected(piece.positionInGrid, true); bool wasFlipped = (flip != null); //Ha volt flip az update előtt megnézzük, hogy lett-e match if (wasFlipped) { flippedPiece = flip.GetOtherPiece(piece); IncludePoints(ref listOfConnectedPoints, IsConnected(flippedPiece.positionInGrid, true)); } //Ha nem lett match if (listOfConnectedPoints.Count == 0) { if (wasFlipped) //Visszacsinaljuk a flippet { FlipPieces(piece.positionInGrid, flippedPiece.positionInGrid, false); } } //Ha match lett else { //Eltávolítja a listában szereplő pontokat foreach (Point pointInConnection in listOfConnectedPoints) { GridCell cell = GetCellAtPoint(pointInConnection); Piece tempPiece = cell.GetPieceFromCell(); if (tempPiece != null) { tempPiece.gameObject.SetActive(false); usedPieceList.Add(tempPiece); //Növeljük az adott típus counterét ScoreController.IncreasePoints(tempPiece.typeValue - 1); battleManager.Attack(tempPiece.typeValue - 1); } //Kinullázzuk az adott cellához tartozó piece-t cell.AddPieceToCell(null); //Lyuk keletkezett, szóval hívjuk a gravitációt ApplyGravityToColumn(cell.positionOfCell.x); } battleManager.ChangeTurn(); } //Eltakarítjuk a pontokat mikor már végeztünk velük flippedPieceList.Remove(flip); updatePieceList.Remove(piece); } } else if (battleManager.GetBattleState() == BattleState.EnemyTurn) { int random = UnityEngine.Random.Range(1, 3); for (int i = 0; i < random; i++) { battleManager.Attack(); } battleManager.ChangeTurn(); } }