because the input of my game does not work

0

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum MoveDirection
{
    Left, Right, Up, Down
}

public class InputManager : MonoBehaviour {

    private GameManager gm;

    void Awake()
    {
        gm = GameObject.FindObjectOfType<GameManager>();
    }

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update ()
    {

        if (gm.State == GameState.Playing)
        {
            if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                //Right move
                gm.Move(MoveDirection.Right);
            }
            else if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                //Right move
                gm.Move(MoveDirection.Left);
            }
            else if (Input.GetKeyDown(KeyCode.UpArrow))
            {
                //Right move
                gm.Move(MoveDirection.Up);
            }
            else if (Input.GetKeyDown(KeyCode.DownArrow))
            {
                //Right move
                gm.Move(MoveDirection.Down);
            }
        }
    }
}

/////////////////////////////////////////////// /////////////////////////////////

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public enum GameState
{
    Playing, GameOver, WaitingForMoveToEnd
}

public class GameManager : MonoBehaviour
{

    public GameState State;
    [Range(0, 2f)]
    public float delay;
    private bool moveMade;
    private bool[] lineMoveComplete = new bool[4] { true, true, true, true };

    public GameObject GameOverPanel;

    private Tile[,] AllTiles = new Tile[4,4];
    private List<Tile[]> columns = new List<Tile[]>();
    private List<Tile[]> rows = new List<Tile[]>();
    private List<Tile> EmptyTiles = new List<Tile>();

    public ScreenFader screenFader;
    public GameObject GameCompleteCtrl;


    void Start()
    {
        Tile[] AllTilesOneDim = GameObject.FindObjectsOfType<Tile>();
        foreach(Tile t in AllTilesOneDim)
        {
            t.Number = 0;
            AllTiles[t.indRow, t.indCol] = t;
            EmptyTiles.Add(t);
        }

        columns.Add(new Tile[]{ AllTiles[0,0], AllTiles[1,0], AllTiles[2, 0], AllTiles[3, 0]});
        columns.Add(new Tile[] { AllTiles[0, 1], AllTiles[1, 1], AllTiles[2, 1], AllTiles[3, 1] });
        columns.Add(new Tile[] { AllTiles[0, 2], AllTiles[1, 2], AllTiles[2, 2], AllTiles[3, 2] });
        columns.Add(new Tile[] { AllTiles[0, 3], AllTiles[1, 3], AllTiles[2, 3], AllTiles[3, 3] });

        rows.Add(new Tile[] { AllTiles[0, 0], AllTiles[0, 1], AllTiles[0, 2], AllTiles[0, 3] });
        rows.Add(new Tile[] { AllTiles[1, 0], AllTiles[1, 1], AllTiles[1, 2], AllTiles[1, 3] });
        rows.Add(new Tile[] { AllTiles[2, 0], AllTiles[2, 1], AllTiles[2, 2], AllTiles[2, 3] });
        rows.Add(new Tile[] { AllTiles[3, 0], AllTiles[3, 1], AllTiles[3, 2], AllTiles[3, 3] });

        Generate();
        Generate();
    }

    private void YouWon()
    {
        Invoke("ShowGameCompleteMenu", 3f);

        if(SoundManager.Instance != null)
        {
            SoundManager.Instance.PlayWinSound();
        }
    }

    void ShowGameCompleteMenu()
    {
        GameCompleteCtrl.SetActive(true);
    }

    private void GameOver()
    {
        Invoke("ShowGameOverPanel", 3f);

        if (SoundManager.Instance != null)
        {
            SoundManager.Instance.PlayLoseSound();
        }
    }

    void ShowGameOverPanel()
    {
        GameOverPanel.SetActive(true);
    }

    bool CanMove()
    {
        if (EmptyTiles.Count > 0)
        {
            return true;
        }
        else
        {
            //Check columns
            for (int i = 0; i < columns.Count; i++)
            {
                for(int j = 0; j < rows.Count-1; j++)
                {
                    if(AllTiles[j,i].Number == AllTiles[j + 1,i].Number)
                    {
                        return true;
                    }
                }
            }

            //Check rows
            for (int i = 0; i < rows.Count; i++)
            {
                for (int j = 0; j < columns.Count - 1; j++)
                {
                    if (AllTiles[i, j].Number == AllTiles[i, j + 1].Number)
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public void NewGameButtonHandler()
    {
        Application.LoadLevel(Application.loadedLevel);
    }

    bool MakeOneMoveDownIndex(Tile[] LineOfTiles)
    {
        for (int i = 0; i < LineOfTiles.Length - 1; i++)
        {
            //Move block
            if (LineOfTiles[i].Number == 0 && LineOfTiles[i+1].Number != 0)
            {
                LineOfTiles[i].Number = LineOfTiles[i + 1].Number;
                LineOfTiles[i + 1].Number = 0;
                return true;
            }
            //Merge block
            if (LineOfTiles[i].Number != 0 && LineOfTiles[i].Number == LineOfTiles[i + 1].Number && LineOfTiles[i].mergeThisTurn == false && LineOfTiles[i + 1].mergeThisTurn == false)
            {
                LineOfTiles[i].Number *= 2;
                LineOfTiles[i + 1].Number = 0;
                LineOfTiles[i].mergeThisTurn = true;
                LineOfTiles[i].PlayMergeAnimation();
                if(SoundManager.Instance != null)
                {
                    SoundManager.Instance.PlayMergeSound();
                }
                ScoreTrack.Instance.Score += LineOfTiles[i].Number;
                if(LineOfTiles[i].Number == 2048)
                {
                    YouWon();
                }
                return true;
            }
        }
        return false;
    }


    bool MakeOneMoveUpIndex(Tile[] LineOfTiles)
    {
        for (int i = LineOfTiles.Length-1; i > 0; i--)
        {
            //Move block
            if (LineOfTiles[i].Number == 0 && LineOfTiles[i - 1].Number != 0)
            {
                LineOfTiles[i].Number = LineOfTiles[i - 1].Number;
                LineOfTiles[i - 1].Number = 0;
                return true;
            }
            //Merge block
            if (LineOfTiles[i].Number != 0 && LineOfTiles[i].Number == LineOfTiles[i - 1].Number && LineOfTiles[i].mergeThisTurn == false && LineOfTiles[i - 1].mergeThisTurn == false)
            {
                LineOfTiles[i].Number *= 2;
                LineOfTiles[i - 1].Number = 0;
                LineOfTiles[i].mergeThisTurn = true;
                LineOfTiles[i].PlayMergeAnimation();
                ScoreTrack.Instance.Score += LineOfTiles[i].Number;
                if (LineOfTiles[i].Number == 2048)
                {
                    YouWon();
                }
                return true;
            }
        }
        return false;
    }

    void Generate()
    {
        if(EmptyTiles.Count > 0)
        {
            int indexForNewNumber = Random.Range(0, EmptyTiles.Count);
            int randomNum = Random.Range(0,10);
            if (randomNum == 0)
            {
                EmptyTiles[indexForNewNumber].Number = 4;
            }
            else
            {
                EmptyTiles[indexForNewNumber].Number = 2;
            }

            EmptyTiles[indexForNewNumber].PlayAppearAnimation();
            EmptyTiles.RemoveAt(indexForNewNumber);
        }
    }

    /*
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.G))
        {
            Generate();
        }
    }
    */

    private void ResetMergedFlags()
    {
        foreach (Tile t in AllTiles)
        {
            t.mergeThisTurn = false;
        }
    }

    private void UpdateEmptyTiles()
    {
        EmptyTiles.Clear();
        foreach(Tile t in AllTiles)
        {
            if (t.Number == 0)
            {
                EmptyTiles.Add(t);
            }
        }
    }

    public void Move(MoveDirection md)
    {
        Debug.Log(md.ToString() + " Move.");

        moveMade = false;
        ResetMergedFlags();

        if(delay > 0)
        {
            StartCoroutine(MoveCoroutine(md));
        }
        else
        {
            for (int i = 0; i < rows.Count; i++)
            {
                switch (md)
                {
                    case MoveDirection.Down:
                        while (MakeOneMoveUpIndex(columns[i]))
                        {
                            moveMade = true;
                        }
                        break;
                    case MoveDirection.Left:
                        while (MakeOneMoveDownIndex(rows[i]))
                        {
                            moveMade = true;
                        }
                        break;
                    case MoveDirection.Right:
                        while (MakeOneMoveUpIndex(rows[i]))
                        {
                            moveMade = true;
                        }
                        break;
                    case MoveDirection.Up:
                        while (MakeOneMoveDownIndex(columns[i]))
                        {
                            moveMade = true;
                        }
                        break;
                }
            }
        }   

        if (moveMade)
        {
            UpdateEmptyTiles();
            Generate();

            if(!CanMove())
            {
                GameOver();
            }
        }
    }

    IEnumerator MoveCoroutine(MoveDirection md)
    {
        State = GameState.WaitingForMoveToEnd;

        switch (md)
        {
            case MoveDirection.Down:
                for (int i = 0; i < columns.Count; i++)
                {
                    StartCoroutine(MoveOneLineUpCoroutine(columns[i], i));
                }
                break;
            case MoveDirection.Left:
                for (int i = 0; i < rows.Count; i++)
                {
                    StartCoroutine(MoveOneLineDownCoroutine(rows[i], i));
                }
                break;
            case MoveDirection.Right:
                for (int i = 0; i < rows.Count; i++)
                {
                    StartCoroutine(MoveOneLineUpCoroutine(rows[i], i));
                }
                break;
            case MoveDirection.Up:
                for (int i = 0; i < columns.Count; i++)
                {
                    StartCoroutine(MoveOneLineDownCoroutine(columns[i], i));
                }
                break;
        }

        while (!(lineMoveComplete[0] && lineMoveComplete[1] && lineMoveComplete[2] && lineMoveComplete[3]))
        {
            yield return null;
        }

        if (moveMade)
        {
            UpdateEmptyTiles();
            Generate();

            if (!CanMove())
            {
                GameOver();
            }
        }

        State = GameState.Playing;
        StopAllCoroutines();
    }

    IEnumerator MoveOneLineDownCoroutine(Tile[] line, int index)
    {
        lineMoveComplete[index] = false;
        while (MakeOneMoveDownIndex(line))
        {
            moveMade = true;
            yield return new WaitForSeconds(delay);

        }
        lineMoveComplete[index] = true;
    }

    IEnumerator MoveOneLineUpCoroutine(Tile[] line, int index)
    {
        lineMoveComplete[index] = false;
        while (MakeOneMoveUpIndex(line))
        {
            moveMade = true;
            yield return new WaitForSeconds(delay);

        }
        lineMoveComplete[index] = true;
    }
}
    
asked by CeciPeque 17.11.2018 в 21:31
source

0 answers