System dnia i nocy

System dnia i nocy

Istnieje pewien kanon skryptów, które były uważane przez lata za wyznacznik dobrej, solidnej produkcji. Należą do niego oczywiście autorskie systemy menu i walki, ale też sklep lub mini-gry. Regularnie pojawiającym się rozwiązaniem jest również system dnia i nocy, który jednak rzadko bywał zrobiony z głową. Dziś zaproponuję minimalistyczną, ale jednak rozsądną wersję tego rozwiązania.

Założenia

Podstawowe założenie naszego skryptu jest takie – chcemy, żeby po upływie pewnego okresu czasu w świecie gry zapadała noc, a po kolejnym okresie – powracał dzień. Oczywiście można też zrobić pory pośrednie – po opanowaniu tego skryptu będzie to bardzo proste. Nie będę jednak tutaj gmatwał sprawy i zostaniemy przy prostym podziale na dzień i noc.

Po drugie, musimy zastanowić się, po co w ogóle wprowadzać ten skrypt? Można go oczywiście wprowadzić tylko po to, by zmienić odcień ekranu, ale to gra nie warta świeczki. Skoro wprowadzamy porę nocną do gry (zakładając, że defaultowo jest dzień), warto byłoby postarać się, żeby noc oferowała coś więcej niż dzień. Dlatego zakładamy, że w nocy część NPC-ów będzie znikać, a pojawią się inni. Także środowisko gry będzie dostosowywać się do pory dnia.

I teraz najważniejsze założenie – jak zrobić, by zmiana pór dnia następowała naturalnie? Jeśli noc zastanie bohatera na jakiejś mapce, możemy automatycznie przyciemnić ekran, ale co z eventami? Usuwać je od razu, czy jednak robić jakieś ścieżki ruchu, np. do domu albo poza mapę? To ogrom skryptowania narażonego na błędy, jeśli tworzycie przynajmniej średniej wielkości grę.

Moja propozycja (jedna z wielu możliwych) jest następująca:

  1. skrypt odlicza jakiś czas, w trakcie którego trwa dana pora dnia (w naszym przypadku to 1 minuta);
  2. po upływie tego okresu liczenie czasu zostaje wyłączone i aktywowany jest przełącznik odpowiedzialny za poinformowanie programu, że czas dobiegł końca;
  3. do momentu przejścia gracza na inną mapę nic się nie zmienia – eventy pozostają na swoich miejscach, a barwa ekrany wciąż jest taka sama;
  4. przy przejściu na nową mapę skrypt sprawdza, czy nastąpiła zmiana pory dnia, a jeśli tak – dostosowuje ją do nowych okoliczności;
  5. jeśli przy teleporcie na nową mapę nastąpiła zmiana dnia, liczenie czasu zaczyna się od nowa.

Takie skonstruowanie skryptu pozwala nam osiągnąć założone cele:

  1. zmiana pory dnia następuje tylko przy przejściu pomiędzy mapami, więc nie musimy bawić się w odchodzenie eventów za mapę i unikamy kłopotliwego znikania ich w jednym momencie;
  2. nowa pora dnia na nowo rozpoczyna licznik, więc unikamy sytuacji, w której gracz przebywając na jednej mapie przegapi kilka pór dnia z rzędu.

Pamiętajmy także, że proste ściemnienie ekranu nie zawsze załatwia sprawę. Musimy np. sprawić, by wewnątrz domów zawsze było jasno.

Sprawdzamy porę dnia

Nasz skrypt zaczynamy od stworzenia systemu liczenia czasu w grze, który omawiałem już w tym artykule. Musimy go jednak nieco zmodyfikować.

Przede wszystkim cały skrypt pakujemy do warunku sprawdzającego, czy przełącznik 0002:Czas stop jest wyłączony. Dzięki temu po upływie ustalonego czasu, liczenie nie będzie dalej wykonywane. Kolejna modyfikacja znajduje się w ostatnim warunku sprawdzającym, czy liczba minut równa się 1. Zamiast zwiększać liczbę godzin, co jest nam tutaj niepotrzebne, włączamy po prostu wspomniany przełącznik. Całość może spokojnie działać w tle.

Potrzebujemy jeszcze drugiego common eventa, który będzie wywoływany tylko ręcznie.

dzien i noc 2

W nim też tkwi moc proponowanego przeze mnie rozwiązania. Event ten będzie wywoływany wyłącznie podczas przechodzenia między mapami. Jeśli przełącznik CZAS STOP jest wyłączony, nic się nie stanie. Jeśli natomiast wymagany czas upłynął, ten common event zmieni porę dnia (zmieniając przełącznik NOC, który za nią odpowiada) oraz ponownie uruchomi odliczanie. W ten sposób stworzyliśmy bebechy naszego systemu!

Wykorzystanie systemu w praktyce

Czas teraz sprawdzić, jak nasze rozwiązanie będzie funkcjonowało w świecie gry.

Na początek coś prostego. Tworzymy eventa, którego grafiką na pierwszej stronie będzie otwarte okno, a na drugiej – aktywowanej przełącznikiem NOC – okno zamknięte.

Na analogicznej zasadzie tworzymy NPC-a, który znika, gdy nastanie noc:

Jeśli chcemy stworzyć postać, która pojawia się tylko w nocy, wystarczy event z jedną stroną:

Przejście na inną mapę

Spójrzmy teraz na event przenoszący gracza na inną mapę:

W wejściu przez drzwi ściemniamy ekran i wywołujemy common event Czas stop. Dzięki temu, jeśli upłynął czas zmiany pory dnia, dojdzie do takiej zmiany właśnie teraz. Następnie teleportujemy gracza na wskazane miejsce. Teraz, w zależności od tego, jaka jest pora dnia, ustawiamy odpowiednio kolor ekranu. Drugi warunek w powyższym skrypcie jest dobrowolny i wynika z faktu, że chipset Deathwinga zawiera takie kafelki, które można podmienić. Jedne wyglądają jak oświetlone przez słońce, a drugie – przez światło księżyca. Komenda Change Tile przy omawianym systemie może się przydać wiele razy, dlatego warto pomyśleć nad odpowiednim dopasowaniem chipsetów. Na koniec pokazujemy ekran gry.

Powyższym event zawiera także drugą stronę, która różni się tylko grafiką zamkniętych drzwi (wiecie, bo noc).

Event powrotny z domu na dwór będzie bardzo podobny:

Różnica polega tylko na dostosowaniu barwy ekranu (noc na dworze jest ciemniejsza). Oczywiście moglibyśmy zmiany barwy ekranu wrzucić do common eventa, ale różne lokacje mogą mieć różną barwę przy zmianie pór dnia, dlatego przy mniejszych projektach proponuję to po prostu robić ręcznie.

Efekty

Oto efekt naszej pracy. Mapki za dnia:

I w nocy:

Michał „Michu” Wysocki

– Download przykładowego projektu –

2 thoughts on “System dnia i nocy

  1. Wszystko fajnie, ale wrzucanie kodu zmieniającego odcień ekranu bezpośrednio do eventu z teleportem to proszenie się o kłopoty, bo jak uznasz, że dobrane kolory są złe i trzeba je zmodyfikować to nagle musisz poprawiać wiele eventów. Lepiej wrzucić to do common eventu i wywoływać przy każdym teleporcie.

    1. Zgadzam się z Gameboyem. Przy poprawkach trzeba będzie pamiętać o każdym evencie teleportu, co nawet przy mniejszych lokalizacjach może dodać pracy niż jej odjąć.
      Oprócz wywołania skryptu zmiany, operowałabym dodatkowo przełącznikiem Dom? operować w zdarzeniu teleportu, czy bohater przechodzi do pomieszczenia czy na zewnątrz. Wchodzisz do domu – włącz przełącznik i wywołaj event Zmiana kolorów. Wychodzisz z domu – wyłącz przełącznik.
      Wtedy, o ile za dnia ten przełącznik nie zrobi dużej różnicy, gdy warunek NOC ON jest spełniony, dodajemy nowy warunek dla przełączniku DOM?
      Dom? OFF – ekran przyciemniony.
      Dom? ON – ekran jest jasny jak za dnia, ewentualnie delikatnie zażółcony od lamp znajdujących się w pomieszczeniu.
      Zmiany wprowadzamy wtedy tylko w common evencie bez potrzeby przeklikowania teleportów.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.