void OnContainerSizeChanged(object sender, EventArgs args) { View container = (View)sender; double width = container.Width; double height = container.Height; if (width <= 0 || height <= 0) { return; } // Orient StackLayout based on portrait/landscape mode. stackLayout.Orientation = (width < height) ? StackOrientation.Vertical : StackOrientation.Horizontal; // Calculate tile size and position based on ContentView size. tileSize = Math.Min(width, height) / this.puzzle.width; absoluteLayout.WidthRequest = this.puzzle.width * tileSize; absoluteLayout.HeightRequest = this.puzzle.width * tileSize; Random random = new Random(); foreach (View fileView in absoluteLayout.Children) { JigsawTile tile = JigsawTile.Dictionary[fileView]; AbsoluteLayout.SetLayoutBounds(fileView, new Rectangle(random.NextDouble() * ((this.puzzle.width - 1) * tileSize), random.NextDouble() * ((this.puzzle.width - 1) * tileSize), tileSize, tileSize)); } }
void FuzhiUsable() { usableJigsawTile.Clear(); foreach (var item in curentJigsawTile) { JigsawTile tempTile = null; tempTile = item.GetJigsawTile(item.adjacentTile.upTileid); if (tempTile != null && !usableJigsawTile.Contains(tempTile)) { usableJigsawTile.Add(tempTile); } tempTile = item.GetJigsawTile(item.adjacentTile.rightTileid); if (tempTile != null && !usableJigsawTile.Contains(tempTile)) { usableJigsawTile.Add(tempTile); } tempTile = item.GetJigsawTile(item.adjacentTile.downTileid); if (tempTile != null && !usableJigsawTile.Contains(tempTile)) { usableJigsawTile.Add(tempTile); } tempTile = item.GetJigsawTile(item.adjacentTile.leftTileid); if (tempTile != null && !usableJigsawTile.Contains(tempTile)) { usableJigsawTile.Add(tempTile); } } foreach (var temp in curentJigsawTile) { if (usableJigsawTile.Contains(temp)) { usableJigsawTile.Remove(temp); } } }
public JigsawPuzzlePage(Puzzle puzzle, Attraction attraction) { InitializeComponent(); gc = GameController.getInstance(); subtitles.Source = ServerConection.URL_MEDIA + "subtitles.jpg"; info.Source = ServerConection.URL_MEDIA + "info.jpg"; playVideo.Source = ServerConection.URL_MEDIA + "playVideo.jpg"; scoreLabel.Text = AppResources.score + ": " + gc.GetScore(); how.Source = ServerConection.URL_MEDIA + "how.png"; this.puzzle = puzzle; tiles = new List <JigsawTile>(); this.attraction = attraction; for (int row = 0; row < puzzle.width; row++) { for (int col = 0; col < puzzle.height; col++) { JigsawTile tile = new JigsawTile(row, col, puzzle.piecesURLS[row * puzzle.width + col]); PanGestureRecognizer panGestureRecognizer = new PanGestureRecognizer(); panGestureRecognizer.PanUpdated += OnTilePanUpdated; tile.TileView.GestureRecognizers.Add(panGestureRecognizer); tiles.Add(tile); absoluteLayout.Children.Add(tile.TileView); } } }
//遍历已经合成的图块 void Recursive(JigsawTile tree) { if (!tree.visited && tree.tilesTree.Count > 0) { tree.visited = true; foreach (var item in tree.tilesTree) { Recursive(item); } } if (!tempList.Contains(tree)) { tempList.Add(tree); } }
void Set(JigsawTile tile1, JigsawTile tile2) { //合成准备 if (tile2.compound) { tile1.compound = true; tile1.transform.SetParent(tile2.parentTile.transform); tile1.parentTile = tile2.parentTile; if (!tile1.parentTile.curentJigsawTile.Contains(tile1)) { parentTile.curentJigsawTile.Add(tile1); } tile1.SetPosition(tile2.GetPosition() + jg.GetTilePos(tile2.id, tile1.id)); return; } //赋值相对位置 tile1.compound = true; tile2.compound = true; GameObject tileParent = Instantiate(jg.tileParent); tile1.parentTile = tileParent.GetComponent <JigsawTileParent>(); tile2.parentTile = tile1.parentTile; if (!tile1.parentTile.curentJigsawTile.Contains(tile1)) { tile1.parentTile.curentJigsawTile.Add(tile1); } if (!tile1.parentTile.curentJigsawTile.Contains(tile2)) { tile1.parentTile.curentJigsawTile.Add(tile2); } //Set tileParent.name = "tileParent"; tileParent.transform.SetParent(jg.transform); tileParent.transform.localScale = Vector3.one; (tileParent.transform as RectTransform).anchoredPosition = tile1._thisRect.anchoredPosition; (tileParent.transform as RectTransform).sizeDelta = tile1._thisRect.sizeDelta; //setParent tile1.transform.SetParent(tileParent.transform); tile2.transform.SetParent(tileParent.transform); tile2.SetPosition(tile1.GetPosition() + jg.GetTilePos(tile1.id, tile2.id)); }
/// <summary> /// 切割 /// </summary> public void Split(int rc) { int count = 1; for (int r = 0; r < rc; r++) { for (int c = 0; c < rc; c++) { GameObject go = Instantiate(tileItem); go.name = $"tile{r}{c}"; JigsawTile tile = go.GetComponent <JigsawTile>(); tile.id = count++; tile.DragEvent = () => { _curJigsawTile = tile; lastPos = tile._thisRect.anchoredPosition; };//拖拽事件 tile.AllMove = FinishTileMove; _allJigsawTiles.Add(tile); go.transform.SetParent(this.transform, false); } } }
/// <summary> /// oh is good /// </summary> /// <param name="tile1">thisTile</param> /// <param name="tile2">item</param> public void Joint(JigsawTile tile1, JigsawTile tile2) { if (tile2.compound) { tile1.compound = true; tile1.transform.SetParent(tile2.parentTile.transform); tile1.parentTile = tile2.parentTile; if (!tile1.parentTile.curentJigsawTile.Contains(tile1)) { tile1.parentTile.curentJigsawTile.Add(tile1); } tile1.SetPosition(tile2.GetPosition() + GetTilePos(tile2.id, tile1.id)); tile1.parentTile.IsReachAStandard?.Invoke(); return; } //赋值相对位置 tile1.compound = true; tile2.compound = true; GameObject parent = Instance(); tile1.parentTile = parent.GetComponent <JigsawTileParent>(); tile2.parentTile = tile1.parentTile; if (!tile1.parentTile.curentJigsawTile.Contains(tile1)) { tile1.parentTile.curentJigsawTile.Add(tile1); } if (!tile1.parentTile.curentJigsawTile.Contains(tile2)) { tile1.parentTile.curentJigsawTile.Add(tile2); } //Set (parent.transform as RectTransform).anchoredPosition = tile1._thisRect.anchoredPosition; (parent.transform as RectTransform).sizeDelta = tile1._thisRect.sizeDelta; //setParent tile1.transform.SetParent(parent.transform); tile2.transform.SetParent(parent.transform); tile2.SetPosition(tile1.GetPosition() + GetTilePos(tile1.id, tile2.id)); tile2.parentTile.IsReachAStandard?.Invoke(); }
void OnTilePanUpdated(object sender, PanUpdatedEventArgs e) { View tileView = (View)sender; JigsawTile tile = JigsawTile.Dictionary[tileView]; if (tile.isSetOnPossition) { return; } double newXPosition = getXPositionOfTile(e, tileView); if (!(newXPosition <= 0 || newXPosition >= Math.Abs(tileSize - absoluteLayout.WidthRequest))) { tileView.TranslationX = tileView.TranslationX + e.TotalX; } double newYPosition = getYPositionOfTile(e, tileView); if (!(newYPosition <= 0 || newYPosition >= Math.Abs(tileSize - absoluteLayout.HeightRequest))) { tileView.TranslationY = tileView.TranslationY + e.TotalY; } double xDeltaFromCorrectPossition = Math.Abs(tileSize * tile.correctCol - newXPosition); double yDeltaFromCorrectPossition = Math.Abs(tileSize * tile.correctRow - newYPosition); if (xDeltaFromCorrectPossition < 3 && yDeltaFromCorrectPossition < 3) { tileView.TranslationX = tileSize * tile.correctCol - tileView.X; tileView.TranslationY = tileSize * tile.correctRow - tileView.Y; absoluteLayout.LowerChild(tileView); tile.isSetOnPossition = true; isPuzzleSolvedAsync(); } }
//吸附 void Adsorb() { foreach (var item in jg.AllJigsawTiles) { if (item.id == adjacentTile.upTileid) { Vector3 targetPos = jg.transform.InverseTransformPoint(item.downPoint.transform.position); Vector3 localPos = jg.transform.InverseTransformPoint(this.upPoint.transform.position); if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance) { JigsawTile tempTile = item; //清除两个图块的互交 this.adjacentTile.upTileid = 0; tempTile.adjacentTile.downTileid = 0; //清除点 this.upPoint = null; tempTile.downPoint = null; //连接两图块id this.tileTree.upTileid = tempTile.id; tempTile.tileTree.downTileid = this.id; //为连接的图块列表赋值 this.tilesTree.Add(GetJigsawTile(this.tileTree.upTileid)); tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.downTileid)); //合成准备 jg.Joint(this, tempTile); } } else if (item.id == adjacentTile.rightTileid) { Vector3 targetPos = jg.transform.InverseTransformPoint(item.leftPoint.transform.position); Vector3 localPos = jg.transform.InverseTransformPoint(this.rightPoint.transform.position); if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance) { JigsawTile tempTile = item; //清除两个图块的互交 this.adjacentTile.rightTileid = 0;//使之只执行一次 tempTile.adjacentTile.leftTileid = 0; //清除点 this.rightPoint = null; tempTile.leftPoint = null; //连接两图块id this.tileTree.rightTileid = tempTile.id; tempTile.tileTree.leftTileid = this.id; //为连接的图块列表赋值 this.tilesTree.Add(GetJigsawTile(this.tileTree.rightTileid)); tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.leftTileid)); //合成准备 jg.Joint(this, tempTile); } } else if (item.id == adjacentTile.downTileid) { Vector3 targetPos = jg.transform.InverseTransformPoint(item.upPoint.transform.position); Vector3 localPos = jg.transform.InverseTransformPoint(this.downPoint.transform.position); if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance) { JigsawTile tempTile = item; //清除两个图块的互交 this.adjacentTile.downTileid = 0;//使之只执行一次 tempTile.adjacentTile.upTileid = 0; //清除点 this.downPoint = null; tempTile.upPoint = null; //连接两图块id this.tileTree.downTileid = tempTile.id; tempTile.tileTree.upTileid = this.id; //为连接的图块列表赋值 this.tilesTree.Add(GetJigsawTile(this.tileTree.downTileid)); tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.upTileid)); //合成准备 jg.Joint(this, tempTile); } } else if (item.id == adjacentTile.leftTileid) { Vector3 targetPos = jg.transform.InverseTransformPoint(item.rightPoint.transform.position); Vector3 localPos = jg.transform.InverseTransformPoint(this.leftPoint.transform.position); if ((localPos - targetPos).sqrMagnitude < _adsorptionDistance) { JigsawTile tempTile = item; //清除两个图块的互交 this.adjacentTile.leftTileid = 0;//使之只执行一次 tempTile.adjacentTile.rightTileid = 0; //清除点 this.leftPoint = null; tempTile.rightPoint = null; //连接两图块id this.tileTree.leftTileid = tempTile.id; tempTile.tileTree.rightTileid = this.id; //为连接的图块列表赋值 this.tilesTree.Add(GetJigsawTile(this.tileTree.leftTileid)); tempTile.tilesTree.Add(GetJigsawTile(tempTile.tileTree.rightTileid)); //合成准备 jg.Joint(this, tempTile); } } } }