Exemplo n.º 1
0
    /// <summary>
    /// Verifica se o slide (movimento por chute) é possível até a tile à frente
    /// </summary>
    /// <param name="dir"> Direção (e.g. Vector2.up) </param>
    /// <returns> Movimento possível ou não </returns>
    bool possibleSlide(Vector2 dir)
    {
        List <GameObject> contents = gc.tileContent((Vector2)transform.position + dir, GridCalculator.Objects, GridCalculator.Bonecos);

        if (contents.Count > 0)
        {
            // Desenho amigável em "PossibleMove & Slide" na pasta "Design & etc".
            // Não permite o translate abaixo de 0.1 pra garantir um teleporte liso pro centro da tile ao encerrar a SlideCR.

            if (dir == Vector2.right || dir == Vector2.left)
            {
                if (dir.x * (curTileCenter().x - transform.position.x) > 0.1)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else if (dir == Vector2.up || dir == Vector2.down)
            {
                if (dir.y * (curTileCenter().y - transform.position.y) > 0.1)
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                Debug.Log("PutaVida.exception: Impossible direction");
            }
        }
        return(true); // Próxima tile sem obstáculos
    }
Exemplo n.º 2
0
    /// <summary>
    /// Analisa os inputs dos eixos de movimento e realiza as ações que forem possíveis (mover o boneco, chutar uma bomba).
    /// </summary>
    void axisInputs()
    {
        // Informações da última animação de movimento. Ver declaração de "previousWalkAnimationState"
        string[] walkAnimationState = (string[])previousWalkAnimationState.Clone();

        string xsInput = "", ysInput = "",         // Qual o input em tal direção do respectivo eixo ("" = nenhum)
               xsMove = "", ysMove = "";           // Qual o movimento possível em tal direção do respectivo eixo ("" = nenhum)
        bool xObstacle = false, yObstacle = false; // Há obstáculo que limita movimento em tal eixo

        // Análise dos inputs de movimento

        if (Input.GetAxis(horizontalAxis) > 0)
        {
            xsInput = "Right";
            if (possibleMove(Vector2.right, out xObstacle))
            {
                xsMove = "Right";
            }
        }
        else if (Input.GetAxis(horizontalAxis) < 0)
        {
            xsInput = "Left";
            if (possibleMove(Vector2.left, out xObstacle))
            {
                xsMove = "Left";
            }
        }

        if (Input.GetAxis(verticalAxis) > 0)
        {
            ysInput = "Up";
            if (possibleMove(Vector2.up, out yObstacle))
            {
                ysMove = "Up";
            }
        }
        else if (Input.GetAxis(verticalAxis) < 0)
        {
            ysInput = "Down";
            if (possibleMove(Vector2.down, out yObstacle))
            {
                ysMove = "Down";
            }
        }

        // Determinação e (se possível) realização do movimento. Também determina alguns aspectos da animação a ser realizada.

        if (updateMovementState(xsMove != "", ysMove != ""))
        {
            // Há movimento

            walkAnimationState[0] = "Walk";
            walkAnimationState[2] = "Normal";

            if (movementState[0] == 1)
            {
                calculateMovement(xsMove, xObstacle);
                walkAnimationState[1] = xsMove;
            }
            else if (movementState[1] == 1)
            {
                calculateMovement(ysMove, yObstacle);
                walkAnimationState[1] = ysMove;
            }
        }
        else
        {
            // Não há movimento

            if (xsInput != "")
            {
                walkAnimationState[0] = "Walk";
                walkAnimationState[1] = xsInput;
                walkAnimationState[2] = "Slow";
            }
            else if (ysInput != "")
            {
                walkAnimationState[0] = "Walk";
                walkAnimationState[1] = ysInput;
                walkAnimationState[2] = "Slow";
            }
            else
            {
                walkAnimationState[0] = "Stand";
            }
        }

        // Coisas do chute

        if (hasKick)
        {
            // ATENÇÃO (19/04/2018): Essa parte precisa de Tender Loving Care
            if (xsMove == "" && ysMove == "")
            {
                if (xsInput != "")
                {
                    Vector2 dir      = new Vector2(Mathf.Sign(Input.GetAxis(horizontalAxis)), 0);
                    Vector2 nextTile = curTileCenter() + dir;

                    GameObject content = gc.tileContent(nextTile);
                    if (content != null && content.CompareTag("Bomb"))
                    {
                        content.GetComponent <Bomb>().wasKicked(dir);
                    }
                }
                else if (ysInput != "")
                {
                    Vector2 dir      = new Vector2(0, Mathf.Sign(Input.GetAxis(verticalAxis)));
                    Vector2 nextTile = curTileCenter() + dir;

                    GameObject content = gc.tileContent(nextTile);
                    if (content != null && content.CompareTag("Bomb"))
                    {
                        content.GetComponent <Bomb>().wasKicked(dir);
                    }
                }
            }
        }

        // Animação
        playWalkAnimation(walkAnimationState);
        previousWalkAnimationState = (string[])walkAnimationState.Clone();
    }
Exemplo n.º 3
0
    /// <summary>
    /// Prepara o tabuleiro. Posiciona os blocos destrutíveis no mapa e os jogadores.
    /// </summary>
    void setupBoard()
    {
        // Verifica se o mapa está corretamente posicionado
        Vector2 curPos = gc.centerPosition(new Vector2(0, 0));

        if (curPos != new Vector2(0, 0) || !gc.tileContent(new Vector2(-1, 0)).CompareTag("Border") ||
            !gc.tileContent(new Vector2(0, -1)).CompareTag("Border"))
        {
            Debug.Log("Deu ruim. Tabuleiro mal formado"); // PutaVida.exception
            return;
        }

        // Pegando tamanho da parte jogável do mapa
        do
        {
            GameObject content = gc.tileContent(curPos + Vector2.up);
            if (content != null && content.CompareTag("Border"))
            {
                break;
            }
            curPos += Vector2.up;
            ySize++;
        } while (ySize < 100); // Limite arbitrário pra impedir loop infinito :P

        do
        {
            GameObject content = gc.tileContent(curPos + Vector2.right);
            if (content != null && content.CompareTag("Border"))
            {
                break;
            }
            curPos += Vector2.right;
            xSize++;
        } while (xSize < 100);

        // População da boardInfo
        boardInfo = new TileInfo[xSize * ySize];
        for (int i = 0; i < xSize; i++)
        {
            for (int j = 0; j < ySize; j++)
            {
                boardInfo[index(i, j)] = new TileInfo(gc.centerPosition(new Vector2(i, j)));
                GameObject content = gc.tileContent(new Vector2(i, j));
                if (content != null)
                {
                    boardInfo[index(i, j)].Block = content.tag;
                }
            }
        }

        // Spawn dos jogadores
        boardInfo[index(0, ySize - 1)].Spawn = true;
        boardInfo[index(1, ySize - 1)].Spawn = true;
        boardInfo[index(0, ySize - 2)].Spawn = true;
        if (playersAmount == 2)
        {
            boardInfo[index(xSize - 1, 0)].Spawn = true;
            boardInfo[index(xSize - 2, 0)].Spawn = true;
            boardInfo[index(xSize - 1, 1)].Spawn = true;
        }

        Boneco player1 = Instantiate <Boneco>(Resources.Load <Boneco>("Prefabs/Boneco 1"));

        player1.transform.position = gc.centerPosition(new Vector2(0, ySize - 1)); // Ajusta o boneco pro centro da tile.
        player1.setup(sandboxMode);
        if (playersAmount == 2)
        {
            Boneco player2 = Instantiate <Boneco>(Resources.Load <Boneco>("Prefabs/Boneco 2"));
            player2.transform.position = gc.centerPosition(new Vector2(xSize - 1, 0)); // Ajusta o boneco pro centro da tile.
            player2.setup(sandboxMode);
        }

        // Criação dos blocos destrutíveis aleatórios e itens (WIP)
        // Atenção (14/06/2018): Tem que gerar os blocos em locais "igualmente" aleatórios e garantindo que exatamente 80 blocos serão criados.

        // Embaralho a array, ou os numeros correspondentes?
        // Aproveitar o futuro loop pra já setupar os itens
        if (!sandboxMode)
        {
            List <SoftBlock> rbs = new List <SoftBlock>();
            foreach (TileInfo t in boardInfo)
            {
                if (!t.Spawn && t.Block == "")
                {
                    if (UnityEngine.Random.Range(0, 100) < 70)
                    {
                        t.Block = "SoftBlock";
                        rbs.Add(Instantiate(Resources.Load <SoftBlock>("Prefabs/SoftBlock"), t.Center, Quaternion.identity));
                    }
                }
            }
            randomizeItems(rbs);
        }
    }