private static void ProcessHorizontal(Grid grid, TetraminoMono tetraminoMono, Vector2Int offset) { if (offset.sqrMagnitude == 0) { return; } Tetramino tetraminoData = tetraminoMono.tetramino; //Vector2Int projectionDir = VectorUtil.V2_V2Int(((Vector2)offset).normalized); Vector2Int projectionDir = offset; Vector2Int stopPosition = Grid.StopPosition(grid, tetraminoData, projectionDir); Vector2Int stopDeltaPosition = stopPosition - tetraminoData.centerPos; int stopDeltaPositionSqrManitude = stopDeltaPosition.sqrMagnitude; int offsetPositionSqrManitude = offset.sqrMagnitude; if (stopDeltaPositionSqrManitude < offsetPositionSqrManitude) { tetraminoMono.SetCenterPosition(stopPosition); Debug.Log("stopDeltaPositionSqrManitude < offsetPositionSqrManitude"); // tetramino can't move because of grid blocks being occupied } else { tetraminoMono.TranslateCenterPosition(offset); } }
private static void ProcessHorizontal(Grid grid, TetraminoMono tetraminoMono, Vector2Int offset) { if (offset.sqrMagnitude == 0) { return; } Tetramino tetraminoData = tetraminoMono.tetramino; //bool collision = // Grid.Collision(grid, tetraminoData, offset, Tetramino.RotationType.None); //if (!collision) //{ // tetraminoMono.TranslateCenterPosition(offset); //} Vector2Int projectionDir = VectorUtil.V2_V2Int(((Vector2)offset).normalized); Vector2Int stopPosition = Grid.StopPosition(Grid.Ins, tetraminoData, projectionDir); Vector2Int stopDeltaPosition = stopPosition - tetraminoData.centerPos; int stopDeltaPositionSqrManitude = stopDeltaPosition.sqrMagnitude; int offsetPositionSqrManitude = offset.sqrMagnitude; if ((stopDeltaPositionSqrManitude < offsetPositionSqrManitude)) { tetraminoMono.SetCenterPosition(stopPosition); Debug.Log("stopDeltaPositionSqrManitude < offsetPositionSqrManitude"); } else { tetraminoMono.TranslateCenterPosition(offset); } }
// creates projection GameObject based on "tetramino to project" public TetraminoMono SetUpProjection(TetraminoMono tetraminoToProject) { Destroy(this.projection); this.projection = TetraminoMono.Instantiate(type, "DrawProjection.SetUpProjection"); projectionTetraminoMono.SetOpacity(0.3f); this.projection.transform.parent = transform; return(projectionTetraminoMono); }
private void CacheTetraminoComponent() { tetraminoMono = GetComponent <TetraminoMono>(); if (tetraminoMono == null) { Debug.LogError("No tetramino mono!"); } }
public static GameObject Instantiate(Tetramino.TetraminoType type, string name = "") { GameObject instance = new GameObject(name); TetraminoMono tetraminoMono = instance.AddComponent <TetraminoMono>(); tetraminoMono.type = type; tetraminoMono.Init(); return(instance); }
private static void ProcessHorizontal(TetraminoMono tetraminoMono) { //ProcessHorizontal(Grid.Ins, tetraminoMono, ProcessHorizontalInput.Movement); Vector2Int horMovement; bool processHorizontal = ProcessHorizontalInput(out horMovement); if (processHorizontal) { ProcessHorizontal(Grid.Ins, tetraminoMono, horMovement); } }
void Start() { int tetraminoTypeIndex = 0; foreach (Tetramino.TetraminoType tetraminoType in EnumUtil.GetValues <Tetramino.TetraminoType>()) { Vector3 localPosition = Vector3.right * offset * tetraminoTypeIndex; GameObject go = InstantiateChildEmptyGameObject(localPosition); TetraminoMono tetraminoMono = go.AddComponent <TetraminoMono>(); tetraminoMono.type = tetraminoType; tetraminoTypeIndex++; } }
// makes cells occupied by tetramino impassable public void FreezeTetraminoArea(TetraminoMono tetraminoMono) { Tetramino tetramino = tetraminoMono.tetramino; Vector2Int[] absPoses = tetramino.AbsPoses; LoopUtil.LoopAction((i) => { this[absPoses[i]] = new WallBlock(BlockType.Unspecified, tetraminoMono.GetChildGameObject(i)); } , absPoses.Length); DisplayBlocks.UpdateBlocks(); }
// creates copy of projection GameObject at projection position, // but adjusts some things(like opacity). Also makes blocks where projection had been // stoppable for tetramino controlled by player public Tetramino DropProjection() { Vector2Int projectionCenterPos = projectionTetraminoData.centerPos; int rotationCount = projectionTetraminoData.rotationCount; TetraminoMono projectionCopy = TetraminoMono.Instantiate(type).GetComponent <TetraminoMono>(); projectionCopy.transform.parent = transform; projectionCopy.SetOpacity(1f); projectionCopy.SetCenterPosition(projectionTetraminoData.centerPos); projectionCopy.Rotate(rotationCount); Grid.Ins.FreezeTetraminoArea(projectionCopy); return(projectionCopy.tetramino); }
private static void ProcessRotation(TetraminoMono tetraminoMono, TetraminoMono projection) { Tetramino tetraminoData = tetraminoMono.tetramino; if (Input.GetKeyDown(KeyCode.W)) { bool collision = Grid.Collision(Grid.Ins, tetraminoData, Vector2Int.zero, Tetramino.RotationType.Clockwise); if (!collision) { tetraminoMono.RotateClockwise(); projection.RotateClockwise(); } } }
// makes cells occupied by tetramino impassable public void FreezeTetraminoArea(TetraminoMono tetraminoMono) { //foreach (Vector2Int pos in ) //{ // blocks[pos.x, pos.y] = new WallBlock(BlockType.Unspecified); //} Tetramino tetramino = tetraminoMono.tetramino; Vector2Int[] absPoses = tetramino.AbsPoses; LoopUtil.LoopAction((i) => { blocks[absPoses[i].x, absPoses[i].y] = new WallBlock(BlockType.Unspecified, tetraminoMono.GetChildGameObject(i)); } , absPoses.Length); DisplayBlocks.UpdateBlocks(); }
// creates copy of projection GameObject at projection position, // but adjusts some things(like opacity). Also makes blocks where projection had been // stoppable for tetramino controlled by player public Tetramino DropProjection() { Vector2Int projectionCenterPos = projectionTetraminoData.centerPos; int rotationCount = projectionTetraminoData.rotationCount; TetraminoMono projectionCopy = TetraminoMono.Instantiate(type).GetComponent <TetraminoMono>(); projectionCopy.transform.parent = transform; projectionCopy.SetOpacity(1f); projectionCopy.SetCenterPosition(projectionTetraminoData.centerPos); projectionCopy.tetramino.Rotate(projectionTetraminoData.rotationCount); projectionCopy.UpdatePosesAfterRotation(); Grid.Ins.FreezeTetraminoArea(projectionCopy); return(projectionCopy.tetramino); //Debug.Log("projection rotation count: " + projectionTetraminoData.rotationCount); //Debug.Log("tetramino to track rotation count: " + tetraminoToTrack.tetramino.rotationCount); }
private Vector2Int StopPosition(TetraminoMono tetraminoMono) { return(Grid.StopPosition(Grid.Ins, tetraminoMono.tetramino, projectionDirection)); }
// show projection in the scene public void Draw(TetraminoMono tetraminoToProject) { Vector2Int projectionCenterPosition = StopPosition(tetraminoToProject); projectionTetraminoMono.SetCenterPosition(projectionCenterPosition); }
private static void ProcessMovementAndRotation(TetraminoMono tetraminoMono, TetraminoMono projection) { ProcessHorizontal(tetraminoMono); ProcessRotation(tetraminoMono, projection); }
public void UpdateProjection() { projection = projectionDrawer.SetUpProjection(toControl); }