
PRISMATIX
Holograficzna, pastelowo-neonowa gra eksploracyjno-zręcznościowa 3D w Ruście.
Proceduralny labirynt pomieszczeń, diamenty, fotonowy laser, dezintegracja mebli do cząstek, stworzenia sterowane AI, artefakty, radar i mapa. Napisana w Ruście na silniku Bevy, z renderowaniem przez Vulkan lub DX12.
Wiązka wychodzi z broni, trafia w mebel i uruchamia łańcuch: raycast wyznacza punkt trafienia, bryła zamienia się w chmurę cząstek, a spod niej wypada przedmiot. Licznik trafień i pasek energii po prawej pokazują, że każdy strzał kosztuje — dezintegracja nie jest darmowa, więc gracz musi wybierać cele. Zniszczenie przyjaznego zwierzęcia odejmuje tysiąc punktów.
PROBLEM
Projekt zaczął się jako ćwiczenie z Rusta i systemów ECS, ale szybko zderzył się z realnym problemem: proceduralnie generowany poziom musi być jednocześnie losowy i powtarzalny, bo inaczej nie da się go testować ani zgłosić w nim błędu.
POMYSŁ
Labirynt generowany z ziarna — ten sam seed daje ten sam poziom. Do tego zestaw trybów deweloperskich sterowanych zmiennymi środowiskowymi, dzięki którym grę da się uruchomić w trybie testowym bez człowieka przy klawiaturze.
PROJEKT
Gra buduje pomieszczenia proceduralnie, rozstawia diamenty, meble i stworzenia, a potem prowadzi klasyczną pętlę: wejście gracza, fizyka, laser, dezintegracja obiektów do cząstek, AI przeciwników. Meble kryją kapsułki zdrowia, mapę i artefakty — niszczenie ich jest mechaniką, nie ozdobą.
Architektura opiera się na systemie encji i komponentów, który Bevy narzuca. Dla gry proceduralnej jest to wygodne: generator poziomu tworzy encje z komponentami, a systemy ruchu, kolizji i renderowania nie muszą wiedzieć, skąd te encje pochodzą — z pliku, z generatora czy z zapisu stanu.
Trzy tryby kamery (FPP, TPP, diorama), radar i mapa dostępne dopiero po znalezieniu odpowiedniego przedmiotu.
Dezintegracja mebli do cząstek jest jednocześnie efektem i mechaniką: zniszczony obiekt zostawia kapsułkę zdrowia, chip mapy albo artefakt, więc niszczenie ma sens ekonomiczny. Równocześnie punktacja karze za zniszczenie przyjaznych zwierząt (−1000 punktów), co wymusza rozróżnianie celów zamiast strzelania we wszystko.
REALIZACJA
Tryby deweloperskie okazały się najbardziej użyteczną częścią projektu: PRISMATIX_AUTOSTART pomija menu i startuje poziom z zadanym ziarnem, PRISMATIX_AUTOPILOT uruchamia test QA (chód, sprint, teleport, ostrzał), PRISMATIX_SMOKE_SECS zamyka grę po zadanym czasie, a PRISMATIX_SHOT_SECS zapisuje zrzut swapchaina do pliku.
Dzięki temu zestawowi zrzuty ekranu w tym opisie powstały automatycznie, a nie przez granie.
Preset graficzny też jest zmienną środowiskową (PRISMATIX_GFX od LOW do ULTRA), co pozwala sprawdzić wydajność na czterech poziomach bez wchodzenia w menu. W połączeniu z autopilotem daje to powtarzalny benchmark: to samo ziarno, ta sama trasa, ten sam czas.
EFEKT
Gra działa, ma cel (zebrać 20 diamentów, aktywować portal), przeciwników, artefakty i system punktacji z karą za niszczenie przyjaznych zwierząt. Pierwsza kompilacja pobiera i buduje Bevy przez około 15 minut; kolejne schodzą poniżej minuty.
GALERIA
07 ZDJĘĆPRISMATIX — proceduralny korytarz, oświetlenie neonowe · zrzut z projektu
PRISMATIX — proceduralnie wygenerowany poziom, widok ogólny · zrzut z projektu
PRISMATIX — oświetlenie neonowe i mgła wolumetryczna · zrzut z projektu
PRISMATIX — labirynt pomieszczeń widziany z korytarza · zrzut z projektu
PRISMATIX — wnętrze pomieszczenia z meblami do dezintegracji · zrzut z projektu
PRISMATIX — obiekty z katalogu armatury wczytane do sceny gry · zrzut z projektu
PRISMATIX — panel debugowy i statystyki poziomu · zrzut z projektu
WNIOSKI
Automatyzacja testów w grze zwróciła się szybciej niż jakakolwiek optymalizacja. Możliwość uruchomienia poziomu z konkretnym ziarnem, przejechania go autopilotem i zapisania zrzutu zamieniła zgłaszanie błędów z opowiadania w powtarzalną procedurę.
Rust okazał się dobrym wyborem do gry proceduralnej z innego powodu, niż zakładałem. Nie chodziło o wydajność — te sceny nie są wymagające — tylko o to, że kompilator nie przepuszcza całej klasy błędów w kodzie zarządzającym stanem świata, a przy generowaniu proceduralnym stan świata jest najbardziej podatnym miejscem.


