void RuchWKierunkuWezla(Vector2 d) //zeby poruszal sie od wezla do wezla { Wezly ruchWKierunkuWezla = MozliwoscRuchu(d); if (ruchWKierunkuWezla != null) { transform.localPosition = ruchWKierunkuWezla.transform.position; obecnyWezel = ruchWKierunkuWezla; } }
public Vector2[] prawidlowyKierunek; //obiekt bez przypisanej wartosci//pod spodem piszemy kod, ktory za mnie przypisuje mozliwe kierunki(gora,dol,lewo,prawo) //vector2 reprezentuje 2wymiarowy wektor lub punkt // Use this for initialization void Start() // w trakcie rozpoczacia gry dopiero przypisuje kierunki//length to rozmiar tablicy { prawidlowyKierunek = new Vector2[sasiedztwo.Length]; //tablica prawidlowyKierunek ma dlugosc taka sama jak sasiedztwo for (int i = 0; i < sasiedztwo.Length; i++) //zalezy ile ma sasiedztwa wokol siebie wezel { Wezly sasiad = sasiedztwo [i]; Vector2 chwilowyWektor = sasiad.transform.localPosition - transform.localPosition; //odejmuje pozycje sasaiada od aktualnej pozycji prawidlowyKierunek [i] = chwilowyWektor.normalized; //normalized sprawia ze zachowuje swoj kierunek, ale dlugosc staje sie 1 } }
Wezly WybierzKolejneZiarno() { Vector2 doceloweZiarno = Vector2.zero; //(0,0) if (obecnyStan == Stan.Poscig) { doceloweZiarno = PobieranieZiarnaDocelowego(); //miejsce znajdowania sie pacmana } else if (obecnyStan == Stan.Rozproszenie) //duchy poruszaja sie wokol swojego otoczenia { doceloweZiarno = domowyWezel.transform.position; } Wezly ruchWKierunkuWezla = null; //wczesniej wyrzucalo blad, a po przypisaniu null jest ok Wezly[] znalezioneWezly = new Wezly[4]; Vector2[] znalezionyKierunekWezla = new Vector2[4]; int licznikWezlow = 0; for (int i = 0; i < obecnyWezel.sasiedztwo.Length; i++) //do ilosci sasiadow wezla { if (obecnyWezel.prawidlowyKierunek [i] != kierunek * -1) //jezeli nie zmienia kierunku o 180 stopni, bo tak to wraca sie na stara pozycje { znalezioneWezly [licznikWezlow] = obecnyWezel.sasiedztwo [i]; //sasiedztwo danego wezla znalezionyKierunekWezla [licznikWezlow] = obecnyWezel.prawidlowyKierunek [i]; //w ktorym kierunku moze sie poruszac licznikWezlow++; //liczy wezly w sasiedztwie } } if (znalezioneWezly.Length == 1) //jezeli mam jeden wezel { ruchWKierunkuWezla = znalezioneWezly [0]; kierunek = znalezionyKierunekWezla [0]; } if (znalezioneWezly.Length > 1) //dla kilku wezlow szukamy tego najkrotszego { float najmniejszaOdleglosc = 100000f; //f na koncu, zeby zajmowalo mniej pamieci bo inaczej jest double for (int i = 0; i < znalezioneWezly.Length; i++) { if (znalezionyKierunekWezla [i] != Vector2.zero) { float odleglosc = PobieranieOdleglosci(znalezioneWezly [i].transform.position, doceloweZiarno); //liczy odleglosc if (odleglosc < najmniejszaOdleglosc) //szukamy najmniejszej odleglosci do pokonania jak najkrotszej trasy { najmniejszaOdleglosc = odleglosc; ruchWKierunkuWezla = znalezioneWezly [i]; kierunek = znalezionyKierunekWezla [i]; } } } } return(ruchWKierunkuWezla); }
public void Restart() //powrot do poczatkowych pozycji po zabiciu pacmana { iloscZyc--; if (iloscZyc == 0) { SceneManager.LoadScene("Przegrana"); } transform.position = pozycjaPoczatkowa.transform.position; //resetuje pozycje pacmana do pozycji startowej obecnyWezel = pozycjaPoczatkowa; //ustawiam pierwszy wezel na pozycji pacmana kierunek = Vector2.left; //ruszamy w lewo orientacja = Vector2.left; //orientacja grafiki pacmana kolejnyKierunek = Vector2.left; ZmianaPozycji(kierunek); // to musi byc, bo inaczej pacman wraca nie na pozycje startowa tylko na pozycje w ktorej zginal }
Wezly MozliwoscRuchu(Vector2 d) //wskazuje na mozliwosci ruchow po wezlach { Wezly ruchDoWezla = null; for (int i = 0; i < obecnyWezel.sasiedztwo.Length; i++) { if (obecnyWezel.prawidlowyKierunek [i] == d) //jezeli znajdzie co chcial to przerywa dzialanie petli { ruchDoWezla = obecnyWezel.sasiedztwo [i]; break; //w pewnym momencie wyrzucalo blad, a po zastosowaniu break dziala poprawnie } } return(ruchDoWezla); }
private Wezly pozycjaPoczatkowa; //upup // Use this for initialization void Start() //zachowanie pacmana na poczatku rozgrywki, poczatkowe polozenie, poczatkowy kierunek ruchu { Wezly wezel = PozycjonowanieWezla(transform.localPosition); //ustawianie poczatkowej pozycji wezla pozycjaPoczatkowa = wezel; //upup if (wezel != null) { obecnyWezel = wezel; Debug.Log(obecnyWezel); } kierunek = Vector2.left; //zakladam poczatkowy kierunek ruchu pacmana w lewo orientacja = Vector2.left; //ZmianaPozycji (kierunek); //wczesniej tego uzywalem to pacman poruszal sie od razu na lewo, a bez tego moge sobie wybrac kierunek ruchu pacmana }
void Ruch() { if (wezelDocelowy != obecnyWezel && wezelDocelowy != null) { if (kolejnyKierunek == kierunek * -1) //zeby mogl zmieniac zwrot pomiedzy wezlami { kierunek *= -1; Wezly chwilowyWezel = wezelDocelowy; wezelDocelowy = poprzedniWezel; //zeby nie zmienial pozycji w wezle tylko w obojetnym polozeniu poprzedniWezel = chwilowyWezel; //zeby nie wracal nagle na pozycje starego wezla } if (OminietyCel()) //do poruszania sie miedzy wezlami { obecnyWezel = wezelDocelowy; transform.localPosition = obecnyWezel.transform.position; GameObject innyPortal = PrzejsciePortalem(obecnyWezel.transform.position); if (innyPortal != null) { transform.localPosition = innyPortal.transform.position; //zamienia pozycje portali obecnyWezel = innyPortal.GetComponent <Wezly>(); //teraz na pozycji drugiego portalu znajduje sie obecnywezel } Wezly poruszaniewKierunkuWezla = MozliwoscRuchu(kolejnyKierunek); if (poruszaniewKierunkuWezla != null) //zeby nie przechodzic przez sciany { kierunek = kolejnyKierunek; } if (poruszaniewKierunkuWezla == null) { poruszaniewKierunkuWezla = MozliwoscRuchu(kierunek); } if (poruszaniewKierunkuWezla != null) { wezelDocelowy = poruszaniewKierunkuWezla; //zeby pacman poruszal sie od wezla do wezla po kazdym ziarnie poprzedniWezel = obecnyWezel; obecnyWezel = null; } else { kierunek = Vector2.zero; } } else //do poruszenia pacmanem { transform.localPosition += (Vector3)(kierunek * predkosc) * Time.deltaTime; //zeby pacman mogl wystartowac } } }
void ZmianaPozycji(Vector2 d) //jezeli napotka na wezel to ma do wyboru rozne kierunki poruszania sie { if (d != kierunek) //kierunkowi na poczatek przypisalem wartosc wektora zerowego { kolejnyKierunek = d; //nowy kierunek } if (obecnyWezel != null) { Wezly ruchWKierunkuWezla = MozliwoscRuchu(d); if (ruchWKierunkuWezla != null) //do poruszania sie od wezla do wezla Pacmana { kierunek = d; wezelDocelowy = ruchWKierunkuWezla; poprzedniWezel = obecnyWezel; obecnyWezel = null; } } }
// Use this for initialization void Start() { pacMan = GameObject.FindGameObjectWithTag("Pacman"); //szuka obiektu oznaczonego tagiem Pacman Wezly ziarno = UstawianieZiarenekNaPozycjach(transform.localPosition); if (ziarno != null) { obecnyWezel = ziarno; //przypisuje wezel w ktorym sie znajduje do ziarna } if (czyJestWDomuDuchow) { kierunek = Vector2.up; //bo w gore wychodza docelowyWezel = obecnyWezel.sasiedztwo[0]; //poniewaz nad nim jest tylko jeden sasiad } else //jak jest poza domkiem { kierunek = Vector2.left; //zakladamy kierunek ruchu w lewo docelowyWezel = WybierzKolejneZiarno(); } poprzedniWezel = obecnyWezel; }
public void Restart() { transform.position = pozycjaStartowa.transform.position;//ustawia duchy na pozycji startowej CzasUwolnieniaCzerwonegoDucha = 0; iteracjaZmianyTrybu = 1; czasZmianyTrybu = 0; if (transform.name != "Duch") //czy nazwa obiektu to nie duch, czyli wszystkie poza czerwonym { czyJestWDomuDuchow = true; //zaznaczamy automatycznie ze sa w domu duszkow } obecnyWezel = pozycjaStartowa; if (czyJestWDomuDuchow) { kierunek = Vector2.up; //poczatkowy ruch w gore docelowyWezel = obecnyWezel.sasiedztwo [0]; //jest tylko jeden docelowy wezel na poczatku } else { kierunek = Vector2.left; //czerwony rusza sie w lewo docelowyWezel = WybierzKolejneZiarno(); } poprzedniWezel = obecnyWezel; }
void Ruch() { if (docelowyWezel != obecnyWezel && docelowyWezel != null && !czyJestWDomuDuchow) //czyjestwdomuduchow musi byc falszem(odpala sie jak duch jest poza domem) { if (OminietyCel()) //sprawdza czy duch znajduje sie w swoim otoczeniu, jezeli tak to wykonuje sie else { obecnyWezel = docelowyWezel; transform.localPosition = obecnyWezel.transform.position; //pozycja wzgledem macierzystej pozycji GameObject innyPortal = PrzejsciePortalem(obecnyWezel.transform.position); //poruszanie sie ducha w portalu if (innyPortal != null) { transform.localPosition = innyPortal.transform.position; //zamiana pozycji na pozycje drugiego portalu obecnyWezel = innyPortal.GetComponent <Wezly> (); //ustawia obecnyWezel na pozycje innego portalu } docelowyWezel = WybierzKolejneZiarno(); //nastepny wezel bedzie kolejnym wezlem przez ktory przejdzie duch poprzedniWezel = obecnyWezel; obecnyWezel = null; } else { transform.localPosition += (Vector3)kierunek * przyspieszenie * Time.deltaTime; //sluzy do poruszania sie duchow } //time.deltaTime daje czas jaki uplynal od wyrenderowania ostatniej klatki gry } }