private void TrySwapElements(Element source, Element target) { int sourceIndex; int targetIndex; try { sourceIndex = int.Parse(source.name); targetIndex = int.Parse(target.name); } catch (Exception e) { #if UNITY_EDITOR print(PrettyLog.GetMessage($"Swap object name parse error: {e.Message}")); #endif return; } var canSwap = _playground.CanSwap(sourceIndex, targetIndex); if (canSwap) { StartCoroutine(MakeSwap(sourceIndex, targetIndex)); } #if UNITY_EDITOR print(PrettyLog.GetMessage($"Opportunity to swap {sourceIndex} with {targetIndex} is {canSwap}")); #endif }
private void OnMouseUp() { if (!_isDragging) { return; } var upPosition = transform.position; transform.position = _startPosition; #if UNITY_EDITOR print(PrettyLog.GetMessage(OnMouseUp, $"transform.position = {transform.position}")); #endif if (OnTrySwap != null) { if (Input.GetMouseButtonDown(0)) { return; } RaycastHit hit; Physics.Raycast(upPosition, new Vector3(0f, 0f, 1f), out hit); var selectedItem = hit.transform?.gameObject.GetComponent <Element>(); #if UNITY_EDITOR print(PrettyLog.GetMessage(OnMouseUp, $"selectedItem: {selectedItem}")); #endif if (this != selectedItem) { OnTrySwap(this, selectedItem); } } }
private void Start() { #if UNITY_EDITOR print(PrettyLog.GetMessage(Start)); #endif _mainMenu.Init(StartGame); _ingameMenu.Init(EndGame); _ingameMenu.gameObject.SetActive(false); }
private void OnMouseDown() { _startPosition = transform.position; transform.position -= new Vector3(0f, 0f, 1f); _screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position); #if UNITY_EDITOR print(PrettyLog.GetMessage(OnMouseDown, $"_startPosition = {_startPosition}")); #endif }
public void Rearrange() { var rearrangedElements = new List <Tuple <int, byte> >(); for (var i = 0; i < Width; i++) { rearrangedElements.AddRange(GetSortedColumn(i)); } OnPlaygroundUpdated?.Invoke(rearrangedElements); #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(Rearrange), rearrangedElements)); #endif }
public Playground(byte n, byte m, byte elementTypesCount) { Width = n; Height = m; ElementTypesCount = elementTypesCount; _elements = new List <byte>(); for (var i = 0; i < n * m; i++) { Add((byte)new Random().Next(1, new Random().Next(1, new Random().Next(1, elementTypesCount)))); } #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), "Ctor", _elements)); #endif }
public void StartGame(byte n, byte m, byte count) { Assert.IsTrue(count < n * m, "Element types count higher than n * m!"); var nValue = n != 0 ? n : _n; var mValue = m != 0 ? m : _m; var typesCountValue = count != 0 ? count : _elementTypesCount; _playground = new Playground(nValue, mValue, typesCountValue); _playgroundView = new GameObject(nameof(PlaygroundView)).AddComponent <PlaygroundView>(); _playgroundView.Init(_playground); _mainCamera.orthographicSize = Math.Max(n, m); _ingameMenu.gameObject.SetActive(true); #if UNITY_EDITOR print(PrettyLog.GetMessage(nameof(App), nameof(StartGame), $"n = {n}, m = {m}, count = {count}")); #endif }
public void CleanAt(int index) { #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(CleanAt), $"{index}")); #endif var list = GetRemovableElements(index); if (list.Count == 1) { return; } list.ForEach(RemoveAt); var result = list.Select(element => Tuple.Create(element, (byte)0)).ToList(); OnPlaygroundUpdated?.Invoke(result); #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(CleanAt), result)); #endif }
public void Fill() { var filledElements = new List <Tuple <int, byte> >(); var i = 0; _elements.ForEach(element => { if (element == 0) { filledElements.Add(Tuple.Create(i, (byte)new Random().Next(1, new Random().Next(1, ElementTypesCount)))); } i++; }); filledElements.ForEach(element => _elements[element.Item1] = element.Item2); OnPlaygroundUpdated?.Invoke(filledElements); #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(Fill), filledElements)); #endif }
private List <int> GetRemovableElements(int index) { var result = new List <int>() { index }; while (true) { var elements = GetAllAvailableElements(result); if (!elements.Any()) { break; } result.AddRange(elements); } #if UNITY_EDITOR Debug.Log(PrettyLog.GetMessage(nameof(Playground), nameof(GetRemovableElements), result)); #endif return(result.Distinct().ToList()); }
public void Init(Playground playground) { #if UNITY_EDITOR print(PrettyLog.GetMessage(typeof(PlaygroundView).GetMethod(nameof(Init)), playground.ToString())); // =) #endif _playground = playground; _playground.OnPlaygroundUpdated += UpdatePlaygroundView; // Initialization background _backgroundPlane = GameObject.CreatePrimitive(PrimitiveType.Plane); _backgroundPlane.transform.SetParent(transform); _backgroundPlane.transform.localScale = new Vector3(playground.Width, 1, playground.Height); _backgroundPlane.transform.rotation = new Quaternion(0, -90, 90, 0); _backgroundPlane.GetComponent <MeshRenderer>().material = new Material(Shader.Find(Defaults.BackgroundPlaneShader)) { color = Color.black }; // Initialization game elements pallete _colors = new List <Color>(); _colors.Add(Color.black); #if UNITY_EDITOR print(PrettyLog.GetMessage(Color.white, "is color of empty element 0")); #endif for (var i = 1; i <= playground.ElementTypesCount; i++) { var color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f); _colors.Add(color); #if UNITY_EDITOR print(PrettyLog.GetMessage(color, $"is color of element {i}")); #endif } // Initialization game elements _elements = new GameObject(Defaults.ElementsGameObjectName); _elements.transform.SetParent(transform); int index; playground.ToList().ForEach(element => { var @object = GameObject.CreatePrimitive(PrimitiveType.Cube); var elementComponent = @object.AddComponent <Element>(); elementComponent.OnTrySwap += TrySwapElements; @object.transform.SetParent(_elements.transform); index = @object.transform.GetSiblingIndex(); @object.GetComponent <MeshRenderer>().material = new Material(Shader.Find(Defaults.BackgroundPlaneShader)) { color = _colors[playground[index]] }; var x = (index * 2) % (2 * playground.Width) - playground.Width; var y = playground.Height - (index / playground.Width * 2) % (playground.Height * 2); @object.name = $"{index}"; @object.transform.localPosition = new Vector3(x, y, -1); }); }