public override void ExitSinglemodel([NotNull] SinglemodelContext context) { var fullpath = path.GetPath(); path.Pop(); logger.Trace("Exit singlemodel {0}", fullpath); var obj = ObjProps.Get(context.obj()); var model = new Models.SingleModel(context.ID().GetText(), obj); var orderby = ObjOrderByProps.Get(context.obj()); model.Path = fullpath; model.OrderBy.AddRange(orderby); //model.Section = CurrentSection; if (context.inherits() != null) { model.Inherits = true; model.InheritsFrom = context.inherits().ID().GetText(); } string obs = ""; logger.Trace("Single model = {0}{1}{2}", model.Name, context.inherits() != null ? " : " + model.InheritsFrom : "", orderby.Any() ? " / " + orderby.Aggregate(obs, (f, run) => obs += run + ", ") : ""); GraphElements.Add(model.Path, new GraphElement(model.Path, model)); SingleModels.Put(context, model); base.ExitSinglemodel(context); }
//подсветить бомбу... private void LightBomb(ObjProps obj) { GameObject light = obj.transform.GetChild(0).gameObject; light.SetActive(true); light.GetComponent <SpriteRenderer>().color = obj.GetComponent <SpriteRenderer>().color; }
/// <summary> /// Корутина, которая делает задержку при появлении нового объекта /// </summary> /// <param name="obj"></param> /// <returns></returns> IEnumerator DestroyObj(ObjProps obj, GameObject _explosion) { InitObject(obj); yield return(new WaitForSeconds(0.5f)); Destroy(_explosion); obj.gameObject.SetActive(true); }
/// <summary> /// Инициализация объекта /// </summary> /// <param name="obj"></param> private void InitObject(ObjProps obj) { int indexOfComplexity = gameConroller.ReturnIndexOfComplexity(); int rnd = Random.Range(0, color.Length - indexOfComplexity); obj.Id = rnd; obj.sprite.color = color[rnd]; }
/// <summary> /// Метод, меняющий местами логическое расположение объектов в массиве /// </summary> /// <param name="x"></param> /// <param name="y"></param> private void SwippingInArray(int x, int y) { for (int i = y; i + 1 < height; i++) { ObjProps copyObj = allObj[x, i]; allObj[x, i] = allObj[x, i + 1]; allObj[x, i + 1] = copyObj; } }
/// <summary> /// Метод, меняющий фактическое местоположение объектов /// </summary> /// <param name="obj"></param> /// <param name="x"></param> /// <param name="y"></param> private void Move(ObjProps obj, int x, int y) { for (int i = y; i + 1 < height; i++) { allObj[x, i + 1].Y = i; allObj[x, i + 1].targetPosition = new Vector2(x, i); allObj[x, i + 1].isMoving = true; } allObj[x, y].Y = height - 1; allObj[x, y].targetPosition = new Vector2(x, height - 1); obj.gameObject.transform.position = new Vector3(x, height - 1); SwippingInArray(x, y); }
public override void ExitValueObject([NotNull] ValueObjectContext context) { base.ExitValueObject(context); var newObj = new Models.ModelCompositeObject { Value = ObjProps.Get(context.obj()) }; var orderby = ObjOrderByProps.Get(context.obj()); newObj.OrderBy.AddRange(orderby); ValueProps.Put(context, newObj); }
public override void ExitObjEmpty([NotNull] ObjEmptyContext context) { var obj = new List <Models.IModelObject>(); var orderby = new List <string>(); if (context.orderstatement() != null) { foreach (var item in context.orderstatement()._orderby) { orderby.Add(item.Text); } } ObjOrderByProps.Put(context, orderby); ObjProps.Put(context, obj); base.ExitObjEmpty(context); }
public override void ExitObjFull([NotNull] ObjFullContext context) { var obj = new List <Models.IModelObject>(); var orderby = new List <string>(); if (context.orderstatement() != null) { foreach (var item in context.orderstatement()._orderby) { orderby.Add(item.Text); } } foreach (var item in context._pairs) { var p = PairProps.Get(item); obj.Add(p); } ObjProps.Put(context, obj); ObjOrderByProps.Put(context, orderby); base.ExitObjFull(context); }
public void CheckFirstTurn() { int j = -1; // проверка на наличие линий по горизонтали for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (x + 2 < width && j < 0 && allObj[x + 1, y].Id == allObj[x, y].Id && allObj[x + 2, y].Id == allObj[x, y].Id) { j = allObj[x, y].Id; } if (j == allObj[x, y].Id) { destroyObj.Add(allObj[x, y]); } else { j = -1; } } j = -1; } j = -1; // проверка на наличие линий по вертикали for (int y = 0; y < width; y++) { for (int x = 0; x < height; x++) { if (x + 2 < height && j < 0 && allObj[y, x + 1].Id == allObj[y, x].Id && allObj[y, x + 2].Id == allObj[y, x].Id) { j = allObj[y, x].Id; } if (j == allObj[y, x].Id) { destroyObj.Add(allObj[y, x]); } else { j = -1; } } j = -1; } if (destroyObj.Count > 0) { targetForHand = destroyObj[0].transform.position; foreach (ObjProps obj in destroyObj) { LightBomb(obj); } } else { int _x = Random.Range(0, width); int _y = Random.Range(0, height); ObjProps _obj = allObj[_x, _y]; destroyObj.Add(_obj); LightBomb(_obj); targetForHand = _obj.transform.position; } }
/// <summary> /// Метод проверки на линии /// </summary> /// <param name="obj"></param> public void CheckLines(ObjProps obj) { if (!isLose && !isPaused && !isChecking) { isChecking = true; if (isFirstTurn) { foreach (ObjProps _obj in destroyObj) { GameObject light = _obj.transform.GetChild(0).gameObject; light.SetActive(false); } destroyObj.Clear(); isFirstTurn = false; Destroy(handPrefab); } List <ObjProps> verticalLines = new List <ObjProps>(); List <ObjProps> horizontalLines = new List <ObjProps>(); int _x = obj.X; int _y = obj.Y; // Проверка совпадений по вертикали, ниже выбранного объекта if (_y - 1 >= 0) { for (int i = _y - 1; i >= 0; i--) { if (allObj[_x, i].Id == allObj[_x, _y].Id) { verticalLines.Add(allObj[_x, i]); } else { break; } } verticalLines.Reverse(); } destroyObj.Add(obj); // Добавление самого объекта в список для уничтожения // Проверка совпадений по вертикали, выше выбранного объекта if (_y + 1 < height) { for (int i = _y + 1; i < height; i++) { if (allObj[_x, i].Id == allObj[_x, _y].Id) { verticalLines.Add(allObj[_x, i]); } else { break; } } } // Проверка совпадений по горизонтали, левее выбранного объекта if (_x - 1 >= 0) { for (int i = _x - 1; i >= 0; i--) { if (allObj[i, _y].Id == allObj[_x, _y].Id) { horizontalLines.Add(allObj[i, _y]); } else { break; } } } // Проверка совпадений по горизонтали, правее выбранного объекта if (_x + 1 < width) { for (int i = _x + 1; i < width; i++) { if (allObj[i, _y].Id == allObj[_x, _y].Id) { horizontalLines.Add(allObj[i, _y]); } else { break; } } } // Добавление объектов в основной список для уничтожения (Разделил на 2 списка, т.к. дальше потребуется считать очки) if (verticalLines.Count > 1) { // TODO: Добавить подсчет очков foreach (ObjProps item in verticalLines) { destroyObj.Add(item); } } if (horizontalLines.Count > 1) { // TODO: добавить подсчет очков foreach (ObjProps item in horizontalLines) { destroyObj.Add(item); } } gameConroller.ScoreCount(destroyObj.Count); CountTurns(horizontalLines); CountTurns(verticalLines); verticalLines.Clear(); horizontalLines.Clear(); if (destroyObj.Count == 1) { gameConroller.MinusTurns(); } DeleteObject(destroyObj); } }