IEnumerator TweenInvalidBrick(Transform t) { Vector3 vel = Vector3.zero; _isTweening = true; while (!MathUtils.NearEqual(t.position, _originalPos)) { t.position = Vector3.SmoothDamp(t.position, _originalPos, ref vel, 0.1f); yield return(0); } if (_newBrickCreated) { Destroy(t.gameObject); _dragCellData = null; _newBrickCreated = false; selectedPart = null; UpdateAvailableParts(selectedPart); UpdateAvailableColors(selectedPart); } else { t.position = _originalPos; t.parent = constructionTarget; if (_dragCellData != null) { _dragCellData.Brick.position = _originalPos; _builder.construction.AddBrick(_dragCellData.Brick); _validPosition = true; } } _isTweening = false; }
void UnselectDragBrick() { if (draggingScenePart) { if (_validPosition) { if (_dragCellData != null) { Vector3 position = draggingScenePart.transform.position; //WEIRD HACK...I HAVE TO OFFSET BY HALF A BRICK TO GET THE CORRECT POSITION position.z -= LXFMLHelper.kBrickSize.x / 2f; _dragCellData.Brick.position = position; _builder.construction.AddBrick(_dragCellData.Brick); } else { CreateNewBrickData(); } _modelUI.UpdateColorsList(LXFMLHelper.GetColors(draggingScenePart.designId), _builder.construction.GetBrick(draggingScenePart.id).materialId); _dragCellData = null; _bricks[draggingScenePart.id].transform.parent = constructionTarget; draggingScenePart = null; _newBrickCreated = false; } else { StartCoroutine(TweenInvalidBrick(_bricks[draggingScenePart.id].transform)); draggingScenePart = null; _bricks.Remove(-1); } } }
public void Unselect() { _modelUI.UpdateColorsList(new int[0], 0); _dragCellData = null; selectedPart = null; draggingScenePart = null; _newBrickCreated = false; }
public void AddBrick(BrickData brick) { _bricks[brick.id] = brick; _bricksCellsCache[brick.id] = new LXFMLCell[brick.design.width * brick.design.height]; var brickOrigin = GetNormalizedBrickOrigin(brick); var normalizedOrigin = new Vector2(brickOrigin.x, brickOrigin.y); if (brick.isFlipped) { normalizedOrigin.x = normalizedOrigin.x - (brick.design.width - 1); } LXFMLCell originCell = _grid.GetCellAt(brickOrigin); LXFMLCell cell; LXFMLCellData cellData; int cellCount = 0; for (int y = 0; y < brick.design.height; ++y) { for (int x = 0; x < brick.design.width; ++x) { cellData = new LXFMLCellData(); cell = _grid.GetCellAt(normalizedOrigin.x + x, normalizedOrigin.y + y); if (normalizedOrigin.x + x >= LXFMLHelper.kGridSize || normalizedOrigin.y + y >= LXFMLHelper.kGridSize) { Debug.LogWarning("Invalid position"); } _bricksCellsCache[brick.id][cellCount++] = cell; if (!cell.IsEmpty) { //Debug.LogWarningFormat("Overriting cell at {0}.", cell.Coordinates); } cellData.Brick = brick; //TODO: Is it necessary? cellData.IsFull = true; cell.Data = cellData; cell.BrickOrigin = originCell; } } SetConnectedBricks(brick, brickOrigin); originCell.Data.IsOrigin = true; CommitChange(ConstructionChangesetOperation.Addition, originCell.Data.Brick, originCell.Coordinates); _lastBrickId++; }
public void ReleaseDragPart() { if (draggingScenePart) { if (removeButton.IsOverButton) { DestroyPart(); _dragCellData = null; removeButton.IsOverButton = false; } else { UnselectDragBrick(); } } }
public void CheckSelectedBrick() { if (!_isTweening) { #if UNITY_EDITOR Vector2 mousePos = Input.mousePosition; #else Vector2 mousePos = Input.touchCount > 0 ? Input.GetTouch(0).position : Vector2.zero; #endif Vector2 gridPos = screenPointToGridPosition(mousePos); LXFMLCell cell = _builder.construction.Grid.GetCellAt(gridPos); if (cell != null && cell.Data != null) { selectedPart = draggingScenePart = _bricks[cell.Data.Brick.id]; _startDragPosition = selectedPart.transform.position; _startDragCell = gridPos; UpdateAvailableParts(selectedPart); UpdateAvailableColors(selectedPart); _dragCellData = cell.Data; _originalPos = selectedPart.transform.position; Vector2 blockOrigin = _builder.construction.GetBrickCell(selectedPart.id).Coordinates; if (cell.Data.Brick.isFlipped) { blockOrigin.x -= cell.Data.Brick.design.width - 1; } _cellOffset.x = gridPos.x - blockOrigin.x; _cellOffset.y = gridPos.y - blockOrigin.y; _builder.construction.RemoveBrick(cell.Data.Brick.id); } else { _modelUI.UpdateColorsList(new int[0], 0); selectedPart = null; UpdateAvailableParts(null); UpdateAvailableColors(null); } } }