To powiedziawszy, trzeba przyznać, że naszej metodzie przechodzenia z jednej generacji do następnej brakowało pewnego dopracowania. Wszystko, co zrobiliśmy, aby wyświetlić każde nowe pokolenie, to wyłączenie wszystkich umierających komórek (czarne) i włączenie wszystkich żywych komórek (zielone). W rezultacie nasze przejścia międzypokoleniowe były nieco szarpane. (Możesz przypomnieć sobie, jak to wyglądało w rzeczywistości, przeglądając i dumając nad filmem dołączonym do zeszłomiesięcznego wydania – https://bit.ly/3bMZbGQ).
Slip slidin’ away
Pewnej nocy, gdy pisałem te słowa, czytałem interesujący artykuł o tym, co w zasadzie stało się trwającą całe życie waśnią między Paulem Simonem i Artem Garfunkelem. Nie zdawałem sobie sprawy, że poznali się w 1953 roku jako 11-letni uczniowie Parsons High School w Queens, która jest najbardziej wysuniętą na wschód i największą pod względem powierzchni z pięciu dzielnic Nowego Jorku. Swój pierwszy singiel Hey Schoolgirl nagrali pod mało inspirującym pseudonimem Tom & Jerry 16 października 1957 roku, czyli trzy dni przed szesnastymi urodzinami Simona, pięć miesięcy po moim debiucie na tej planecie i zaledwie kilka miesięcy przed tym, jak wszystko zaczęło się między nimi psuć.
To smutne, że wszystko skończyło się tak, jak się skończyło, ponieważ – chociaż Simon jest niezwykle utalentowanym muzykiem, piosenkarzem, autorem tekstów i aktorem – combo Simon-Garfunkel tworzyło muzyczną magię, którą rzadko się widuje (lub słyszy).
Jedynym powodem, dla którego o tym wspominam, jest to, że myśl o naszej drugiej inkarnacji GOL płynnie przechodzącej („ślizgającej się”) z jednego pokolenia do następnego sprawiła, że piosenka Simona z 1977 roku Slip Slidin’ Away zaczęła grzechotać w mojej biednej, starej głowie.
Sposób, w jaki zrealizowałem tę nową implementację, polegał na utrzymywaniu martwych komórek w kolorze czarnym, a żywych komórek w kolorze zielonym; a także na stopniowym blaknięciu umierających komórek z zielonego na czarny, przy jednoczesnym rozświetlaniu się komórek, które ożywają, z czarnego na zielony.
Po raz pierwszy zaimplementowaliśmy efekt zanikania tego typu, gdy eksperymentowaliśmy z wirtualnymi kroplami deszczu (EdW 5/2024; możesz zobaczyć ten szkic, pobierając plik CB-Oct20-01.txt, który jest dostępny na stronie PE z października 2020 r.). Należy pamiętać, że nasze kolory są reprezentowane jako wartości 32-bitowe, które zawierają 8-bitowe kanały koloru czerwonego, zielonego i niebieskiego (czyli 3×8=24 bity, pozostawiając 8 bitów w zapasie). Aby zaimplementować efekt zanikania, musimy wykonać zanikanie na każdym z kanałów kolorów indywidualnie. W związku z tym utworzyliśmy trzy funkcje niskiego poziomu o nazwach GetRed(), GetGreen() i GetBlue(), z których każda akceptuje 32-bitową wartość koloru i zwraca powiązany z nią 8-bitowy kanał koloru. Stworzyliśmy również funkcję BuildColor(), która akceptuje trzy 8-bitowe kanały kolorów i zwraca 32-bitowy kolor.
Następnie zaimplementowano funkcję CrossFadeColor(), która przyjmuje cztery argumenty: 32-bitowy kolor początkowy, 32-bitowy kolor końcowy, całkowitą liczbę kroków zanikania i bieżący krok zanikania. Warto zauważyć, że kolory początkowy i końcowy mogą mieć dowolny kolor, w tym czarny. W razie potrzeby może to być nawet ten sam kolor, chociaż zanikanie z koloru do tego samego koloru będzie postrzegane jako brak zanikania. Wszystkie te funkcje pojawią się w naszym nowym szkicu.
Chodzi o to, że kiedy stworzyliśmy efekt kropli deszczu, zdecydowaliśmy się wykonać zanikanie na zasadzie per-piksel (piłeczka pingpongowa). Wynikało to z faktu, że nasze wirtualne krople deszczu pojawiały się w losowych momentach, co oznaczało, że musieliśmy traktować je jako pojedyncze jednostki. Dla porównania, w przypadku tej implementacji naszego GOL, tak naprawdę mamy tylko dwa przenikania kolorów, o które musimy się martwić: przenikanie związane z umieraniem żywej komórki oraz przenikanie związane z ożywianiem martwej komórki. Zacznijmy od umierającej komórki. Zamiast wykonywać wygaszanie w kółko dla każdej umierającej komórki z osobna, jeśli obliczymy bieżący odcień związany z konkretnym krokiem wygaszania, możemy zastosować ten odcień do wszystkich umierających komórek. Podobna sytuacja dotyczy wszystkich komórek, które ożywają.
Zamierzamy więc wykorzystać nasz szkic GOL z pierwszego przejścia z zeszłego miesiąca i zmodyfikować go, aby wykonać wymagane zaniki (możesz śledzić zmiany, pobierając plik CB-Jun21-01.txt, który jest dostępny na stronie PE z czerwca 2021 r.).