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; }
// 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; } }