private void HighlightSelectedBalls(int x, int y, bool[,] visit) { int[] dx = { -1, 0, 1, 0 }; int[] dy = { 0, 1, 0, -1 }; visit[x, y] = true; var ball = CurrentField.GetBall(x, y); if (ball is OjamaBall) { return; } var color = ball.Color; ball.IsOnMouse = true; for (var i = 0; i < 4; ++i) { var tx = x + dx[i]; var ty = y + dy[i]; if (!CurrentField.IsInFieldRange(tx, ty) || visit[tx, ty] || CurrentField.GetBall(tx, ty).Color != color) { continue; } HighlightSelectedBalls(tx, ty, visit); } }
private void GameControlOnMouseLeftButtonUp( object sender, MouseButtonEventArgs mouseButtonEventArgs) { if (!IsRunning) { return; } var screenPoint = new Point(Cursor.Position.X, Cursor.Position.Y); var controlPoint = _gameControl.PointFromScreen(screenPoint); var ratioX = _camera.WorldWidth / _gameControl.ActualWidth; var ratioY = _camera.WorldHeight / _gameControl.ActualHeight; var worldPosition = new Vector2((float)(controlPoint.X * ratioX), (float)(controlPoint.Y * ratioY)); Microsoft.Xna.Framework.Point bordPos; if (!CurrentField.ToBordPointFromRenderPosition(worldPosition, out bordPos) || !CurrentField.IsInFieldRange(bordPos.X, bordPos.Y)) { return; } var gameConfig = CurrentField.GameConfig; var visit = new bool[gameConfig.Column + 1, gameConfig.Row + 1]; var tempCount = CurrentField.DfsDestroyableBalls(bordPos.X, bordPos.Y, visit); if (tempCount < gameConfig.MinChain) { return; } var ball = CurrentField.GetBall(bordPos.X, bordPos.Y); if (ball is OjamaBall) { return; } OutPut = bordPos; IsRunning = false; }