예제 #1
0
    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);
        }
    }
예제 #3
0
 // 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);
 }
예제 #4
0
 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);
        }
    }
예제 #7
0
    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++;
        }
    }
예제 #8
0
    // 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();
            }
        }
    }
예제 #11
0
    // 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();
    }
예제 #12
0
    // 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);
    }
예제 #13
0
 private Vector2Int StopPosition(TetraminoMono tetraminoMono)
 {
     return(Grid.StopPosition(Grid.Ins, tetraminoMono.tetramino, projectionDirection));
 }
예제 #14
0
    // 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);
 }