Exemplo n.º 1
0
    public void spawnCampEnnemi(GameObject _campAllie)
    {
        campAllie = _campAllie;

        oPathFinding pathFinding  = GetComponent <oPathFinding>();
        MapGenerator mapGenerator = GetComponent <MapGenerator>();

        Vector2 positionCamp = new Vector2(campAllie.transform.position.x, campAllie.transform.position.y);

        Vector2 meilleurePosition         = new Vector2();
        int     longueurMeilleurePosition = 0;

        foreach (oNoeud noeud in pathFinding.grid.grid)
        {
            //On récupère la position du noeud testé
            Vector2 positionNoeud = new Vector2(noeud.gridX, noeud.gridY);

            //On regarde si il y a rien en 3x3 autour de la position testée
            bool positionValide = true;
            for (int y = -1; y <= 1; y++)
            {
                for (int x = -1; x <= 1; x++)
                {
                    if (y == -1 || y == 1 || x == -1 || x == 1)
                    {
                        Vector2 positionValidationTeste = new Vector2(positionNoeud.x + x, positionNoeud.y + y);
                        if (positionValidationTeste.x < 0 || positionValidationTeste.x >= mapGenerator.largeur ||
                            positionValidationTeste.y < 0 || positionValidationTeste.y >= mapGenerator.hauteur ||
                            mapGenerator.tuileSurPosition(positionValidationTeste) == MapGenerator.TypeTuile.Eau)
                        {
                            positionValide = false;
                        }
                    }
                }
            }

            //On regarde si le chemin vers cette position est plus loin que le chemin sauvegardé
            if (positionValide)
            {
                List <Vector2> cheminTeste = pathFinding.FindPath(positionCamp, positionNoeud, false);
                if (cheminTeste.Count > longueurMeilleurePosition)
                {
                    meilleurePosition         = positionNoeud;
                    longueurMeilleurePosition = cheminTeste.Count;
                }
            }
        }

        //Instantiation du camp ennemi
        campOrc = Instantiate(prefabCampEnnemi);
        campOrc.transform.position = meilleurePosition;

        //Suppresion des arbres alentours sur la grille du path finding
        for (int i = -2; i <= 2; i++)
        {
            for (int j = -2; j <= 2; j++)
            {
                Vector2 positionVerification = new Vector2(campOrc.transform.position.x + i, campOrc.transform.position.y + j);
                //Bordures autour du camp
                if (i == -2 || i == 2 || j == -2 || j == 2)
                {
                    if (mapGenerator.arbreSurPosition(positionVerification))
                    {
                        pathFinding.definirNoeudArbre(positionVerification, false);
                    }
                }
                else                   //Intérieur du camp
                {
                    pathFinding.definirNoeudArbre(positionVerification, true);
                }
            }
        }

        //Debut de l'instantiation des ennemis
        debutVaguesEnnemie = true;
    }
Exemplo n.º 2
0
    // Update is called once per frame
    void Update()
    {
        switch (etatDebutPartie)
        {
        //Dezoom général
        case EtatDebutPartie.Dezoom:
            float valeurIncrementationDezoom = sigmoid(etatDezoom);
            etatDezoom += incrementationZooms * Time.deltaTime;
            if (etatDezoom >= 1)
            {
                Camera.main.orthographicSize = dezoomMax;
                etatDebutPartie = EtatDebutPartie.ChoixCamp;
            }
            else
            {
                Camera.main.orthographicSize = startZoom + ((dezoomMax - startZoom) * valeurIncrementationDezoom);
            }
            break;

        //Choix de la position du camp
        case EtatDebutPartie.ChoixCamp:
            Vector2 positionCamp = new Vector2();
            positionCamp.x = Mathf.Floor(Camera.main.ScreenToWorldPoint(Input.mousePosition).x + .5f);
            positionCamp.y = Mathf.Floor(Camera.main.ScreenToWorldPoint(Input.mousePosition).y + .5f);
            if (!Input.GetMouseButtonDown(0))
            {
                if (campAPoser == null)
                {
                    campAPoser = Instantiate(prefabCamp);
                    GameObject placementBatiment = Instantiate(uniteBlanche);
                    placementBatiment.name                 = nomGameObjectPlacementBatiment;
                    placementBatiment.transform.parent     = campAPoser.transform;
                    placementBatiment.transform.localScale = new Vector3(.96f, .92f, 1);
                    placementBatiment.transform.position   = campAPoser.transform.position;
                    placementBatiment.GetComponent <SpriteRenderer>().color = new Color(0, 0, 0, .4f);
                }
                campAPoser.transform.position = positionCamp;
                //Coloration du camp pour une position disponible
                bool positionValide = true;
                for (int y = debutYCamp; y <= finYCamp; y++)
                {
                    for (int x = debutXCamp; x <= finXCamp; x++)
                    {
                        //Verification des tuiles autours du camp
                        try {
                            if (mapGenerator.tuilesMap[(int)positionCamp.y + y, (int)positionCamp.x + x] == MapGenerator.TypeTuile.Eau)
                            {
                                positionValide = false;
                            }
                        }
                        catch {
                            positionValide = false;
                        }
                    }
                }
                campAPoser.GetComponent <SpriteRenderer>().color = positionValide ? Color.white : Color.red;
            }
            else
            {
                bool positionValide = true;
                for (int y = debutYCamp; y <= finYCamp; y++)
                {
                    for (int x = debutXCamp; x <= finXCamp; x++)
                    {
                        //Verification des tuiles autours du camp
                        //Si c'est de l'eau ou en dehors de la carte la position n'est plus valide
                        try {
                            if (mapGenerator.tuilesMap[(int)positionCamp.y + y, (int)positionCamp.x + x] == MapGenerator.TypeTuile.Eau)
                            {
                                positionValide = false;
                            }
                        }
                        catch {
                            positionValide = false;
                        }
                    }
                }
                if (positionValide)
                {
                    //Pathfinding
                    oPathFinding pathFinding = GameObject.Find("MapGenerator").GetComponent <oPathFinding>();
                    //Détruit les arbres autours
                    campAPoser.transform.Find("ColliderPoseCamp").GetComponent <BoxCollider2D>().enabled = true;
                    //Indique au PathFinding les nouvelles zones marchables ou non
                    for (int i = -2; i <= 2; i++)
                    {
                        for (int j = -2; j <= 2; j++)
                        {
                            Vector2 positionVerification = new Vector2(campAPoser.transform.position.x + i, campAPoser.transform.position.y + j);
                            //Bordures autour du camp
                            if (i == -2 || i == 2 || j == -2 || j == 2)
                            {
                                if (mapGenerator.arbreSurPosition(positionVerification))
                                {
                                    pathFinding.definirNoeudArbre(positionVerification, false);
                                }
                            }
                            else                                       //Intérieur du camp
                            {
                                pathFinding.definirNoeudArbre(positionVerification, true);
                            }
                        }
                    }
                    //Enlève la zone noir de visualisation de placement
                    Destroy(campAPoser.transform.Find(nomGameObjectPlacementBatiment).gameObject);
                    //Passe au prochain état du début de partie : Le zoom qui recentre sur le camp
                    etatDebutPartie = EtatDebutPartie.Zoom;
                    //Spawn le camp ennemi
                    GameObject.Find("MapGenerator").GetComponent <EnnemiSpawner>().spawnCampEnnemi(campAPoser);
                }
            }
            break;

        //Zoom sur la cabane finale
        case EtatDebutPartie.Zoom:
            //On determine la position vers laquelle se diriger si le camp est près d'une limite de la map
            Vector3 positionFinaleZoom = campAPoser.transform.position;
            positionFinaleZoom.x = Mathf.Clamp(positionFinaleZoom.x, 10.5f, nombreTuilesX - 11f);
            positionFinaleZoom.y = Mathf.Clamp(positionFinaleZoom.y, 5.5f, nombreTuilesY - 6.5f);
            //Incrementation du zoom
            float valeurIncrementationZoom = sigmoid(etatZoom);
            etatZoom += incrementationZooms * Time.deltaTime;
            if (etatZoom >= 1)
            {
                Camera.main.orthographicSize   = startZoom;
                Camera.main.transform.position = new Vector3(positionFinaleZoom.x, positionFinaleZoom.y, -10);
                //Suppression du script quand les phases du début sont toutes terminées
                Destroy(this);
                //Créé le script pour faire spawn le joueur
                GetComponent <SpawnPlayer>().camp         = campAPoser;
                GetComponent <SpawnPlayer>().uniteBlanche = uniteBlanche;
                GetComponent <SpawnPlayer>().enabled      = true;
            }
            else
            {
                Camera.main.orthographicSize   = dezoomMax - ((dezoomMax - startZoom) * valeurIncrementationZoom);
                Camera.main.transform.position = new Vector3(
                    startZoomCameraPosition.x + ((positionFinaleZoom.x - startZoomCameraPosition.x) * valeurIncrementationZoom),
                    startZoomCameraPosition.y + ((positionFinaleZoom.y - startZoomCameraPosition.y) * valeurIncrementationZoom),
                    -10
                    );
            }
            break;
        }
        //Deplacement de la camera dans le placement du camp
        if (etatDebutPartie == EtatDebutPartie.ChoixCamp)
        {
            Vector2 positionSouris = Input.mousePosition;
            Vector3 positionCamera = Camera.main.transform.position;
            if (positionSouris.x <= 2 && Camera.main.ScreenToWorldPoint(Vector3.zero).x >= -offsetLimitesCamera.x)
            {
                positionCamera.x -= vitesseCamera * Time.deltaTime;
            }
            if (positionSouris.x >= Screen.width - 2 && Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height)).x <= nombreTuilesX - offsetLimitesCamera.x)
            {
                positionCamera.x += vitesseCamera * Time.deltaTime;
            }
            if (positionSouris.y <= 2 && Camera.main.ScreenToWorldPoint(Vector3.zero).y >= -offsetLimitesCamera.y)
            {
                positionCamera.y -= vitesseCamera * Time.deltaTime;
            }
            if (positionSouris.y >= Screen.height - 2 && Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height)).y <= nombreTuilesY - offsetLimitesCamera.y)
            {
                positionCamera.y += vitesseCamera * Time.deltaTime;
            }
            Camera.main.transform.position = positionCamera;
            startZoomCameraPosition        = positionCamera;
        }
    }