Witam na maj├│wkowym wpisie ­čÖé Pogoda za oknem nie rozpieszcza, aby chodzi─ç na d┼éugie spacery po g├│rach. Dzisiaj troch─Ö o kontrataku oraz modernizacji modelu ruchu na mniej dynamiczny, ale za to bardziej stabilny.

Podsumowanie poprzednich wpisów na temat LifeLike

W poprzednim odcinku atakowali┼Ťmy wroga (link). Tym razem, wr├│cimy do tematu i go rozwiniemy o kontratak ze strony przeciwnika. Dodatkowo wprowadzi┼éem zatrzymanie si─Ö na innym obiekcie, a nie na graczu, wi─Öc nie wejdziemy na niego, a jednocze┼Ťnie go zaznaczymy (tzn. przeciwnika).

Edytor kodu

Od ostatniego odcinka zmieni┼éem IDE. Wiecie, na Macu mam ┼Ťredni wyb├│r do c#, a Mono Develop i jego klony ÔÇŽ to nie wyb├│r. InteliJ wyda┼é ┼Ťwietnego Ridera, ale potrafi by─ç ÔÇťklocowatyÔÇŁ dla pami─Öci i czasami niestabilny. Wyb├│r pad┼é na Visual Studio Code, kt├│ry jest klonem lekkiego edytora, zwanego ATOM. Ma ┼Ťwietne wsparcie dla C# oraz Unity. Tak┼╝e dla innych j─Özyk├│w. Obs┼éuguje gitÔÇÖa, a nawet i posiada debugger. Czyli du┼╝o potrzebnego stuffuÔÇŽ poza sprawny refactoringiem, kt├│ry dostarcza nam np. wspomniany InteliJ Rider, czy wtyczka do VS – Resharper (tak┼╝e od InteliJ).

LifeLike
Visual Studio Code

Ruch

Poprzedni model ruchu inspirowany by┼é kursem od Unity – Rogue Like. Nie by┼é on doskona┼éy, poniewa┼╝, gdy naci┼Ťn─Öli┼Ťmy zbyt du┼╝o klawiszy na raz, nasza posta─ç porusza┼éa si─Ö zbyt niestabilnie i wychodzi┼éa poza kratk─Ö. Tym razem poruszamy si─Ö my oraz przeciwnik o ca┼é─ů klatk─Ö.

  public IEnumerator Movement(Vector3 destination)
        {
            var remainingDistance = (transform.position - destination).sqrMagnitude;
            //Tak by┼éo wcze┼Ťniej:
            // while (remainingDistance>float.Epsilon)
            // {
            //     var newPosition=Vector3.MoveTowards(_rb2D.position, destination, _inverseMoveTime * Time.deltaTime);
            //     _rb2D.MovePosition(newPosition);
            //     remainingDistance = (transform.position - destination).sqrMagnitude;
            //     yield return null;
            // }      
	//Tak jest teraz:
            transform.position=destination;
            yield return null;
        }

System Turowy

Jest to prosty system – On atakuje albo my atakujemy. ┼╗ycie jest Proste! ­čÖé
W GameManagerze doda┼éem now─ů zmienn─ů ÔÇťIsPlayerTurnÔÇŁ, od kt├│rej zale┼╝y, do kogo nale┼╝y obecnie tura. Tzn. ruch jest zablokowany, a przeciwnicy jeden po drugim si─Ö poruszaj─ů.

   public void EndPlayerTurn()
    {  
	//Zostanie zmienione na co┼Ť konkretniejszego o ruchach
        UiUtils.AddLog("Enemies Turn");
        IsPlayerTurn = false;
        if (PlayerObject!=null && PlayerStatistic!=null)
        	EnemyUtils.EnemiesMove(PlayerObject);
  	//Zostanie zmienione na co┼Ť konkretniejszego o ruchach
      	UiUtils.AddLog("Player Turn");
        IsPlayerTurn = true;
    }

Dodatkowo parametr PlayerObject zostanie om├│wiony w nast─Öpnym punkcie.

Poruszanie si─Ö za nami

Skoro ju┼╝ wiemy, za kim maj─ů si─Ö rusza─ç, to przejd┼║my do ruchu za nami. W klasie Enemy, doda┼éem metod─Ö MoveToPlayer, w kt├│rej pobieramy vector ruchu pomi─Ödzy graczem a przeciwnikiem, a nast─Öpnie skracamy do warto┼Ťci -1,0,1 ( w zale┼╝no┼Ťci, do strony, w kt├│r─ů ma si─Ö porusza─ç). Odbywa si─Ö to w metodzie RoundEnemyMoves

 public void MoveToPlayer(GameObject playerObject)
        {       
            var moveVector = (Vector2)(transform.position- playerObject.transform.position);
            RoundEnemyMoves(ref moveVector);
            transform.eulerAngles=SetRotation(moveVector);
       
           if (Math.Abs(moveVector.x) > TOLERANCE || Math.Abs(moveVector.y) > TOLERANCE)
                AttemtMove<MovingObject>(moveVector);        
        }

Atak na gracza

Jak wspomina┼éem na wst─Öpie, wprowadzi┼éem tak┼╝e kolizj─Ö, gdy przeciwnik wejdzie na gracza. Dodatkowo, dzi─Öki nowemu systemowi walki musia┼éem sporo zmieni─ç logi. ­čÖé Ze wzgl─Ödu na charakter, jakby┼Ťmy m├│wili sami do siebie. Wypada┼éoby to przebudowa─ç bardziej, ale to ju┼╝, gdy b─Öd─Ö pracowa┼é nad system s┼éownika.
W ka┼╝dym razie, je┼Ťli przeciwnik natknie si─Ö na nas, a dystans mi─Ödzy nami wyniesie 1 (w przypadku walki bezpo┼Ťrednie) ÔÇŽ to w├│wczas przyst─Öpuje do ataku na nas.

 
 if (Distance==1)
    GameManager.Instance.FightSystem.AttackPlayer(EnemyCharacter);

Update UI

Dodatkowo doda┼éem par─Ö zmian do Interfejsu U┼╝ytkownika. Czyli jaki┼Ť pocz─ůtkowy UI do naszych statystyk, p├│ki co HP i imi─Ö, wkr├│tce do┼Ťwiadczenie i poziom r├│wnie┼╝ znajd─ů swoje miejsce.

LifeLike
Nowy panel w lewym G├│rnym rogu

Podsumowanie

To tyle na dzisiaj! My atakujemy przeciwnika, on atakuje nas.
Linki jak zwykle na githubie : https://github.com/aluspl/RogueLikeDSP
Nowy Player pod : https://aluspl.github.io/RogueLikeDSP/Versions/version5contrattack/