Strona główna

poniedziałek, 22 sierpnia 2011

Robimy "OdionoidO" - devlog #1

Tak, jak się odgrażałem tutaj, zabieram się za "OdionoidO".
Technologia: Python + Pyglet.

Podjąłem kilka decyzji odnośnie plansz. Będą one miały powierzchnię "budowlaną" w rozmiarze 13x13 cegiełek (do jednego z tych wymiarów dojdzie jeszcze trochę marginesu, ale będzie to przestrzeń pusta, w której nie będą już znajdować się żadne przeszkody).

Każda z plansz będzie zapisana w oddzielnym pliku csv, znajdującym się w katalogu "plansze". Nazwą pliku będzie dwucyfrowy numer planszy. W środku każdego pliku będzie trzynaście wierszy, z których każdy będzie reprezentował jedną linię cegiełek w postaci: 0,0,0,1,1,1,0,0,0,1,1,1,2, gdzie zero oznacza pustą przestrzeń a większa liczba cegłę i jej rodzaj (o ile będą rodzaje).

Takie rozwiązanie pozwala bardzo wygodnie tworzyć i edytować plansze za pomocą szablonu stworzonego w arkuszu kalkulacyjnym, z użyciem formatowania warunkowego, uzależniając kolor tła komórki od wpisanej cyfry.

Napisałem funkcję, która wczytuje plik podany w argumencie a zwraca - używając pythonowej nomenklatury - listę list reprezentujących kolejne wiersze:

import csv
def wczytajjednaplansze(adrespliku):
    plikcsv = csv.reader(open(adrespliku), delimiter=",")
    lista = [line for line in plikcsv]
    return lista


Nie wiem, jak wam, ale mnie się podoba. :)

EDIT: Zmodyfikowałem nieco powyższą funkcję tak, aby parametrem był po prostu numer żądanej planszy. Oto efekt:

import csv
def wczytajplansze(numerplanszy):
    plikcsv = csv.reader(open("./plansze/" + "%02d" % numerplanszy + ".csv"), delimiter=",")
    lista = [line for line in plikcsv]
    return lista

piątek, 19 sierpnia 2011

Jeszcze jeden klon "Arukanoido", czyli robimy grę komputerową

Na forach poświęconych programowaniu i/lub grom komputerowym często-gęsto pojawiają się wątki typu "chcę zrobić grę w stylu GTA, tylko lepszą", albo "szukam teamu do zrobienia gry MMORPG". Zwykle autorami takich wpisów są ludzie, którzy nie mają zielonego pojęcia, jak niezwykle złożonym przedsięwzięciem jest produkcja dużej gry komputerowej - zarówno od strony czysto developerskiej (dziesiątki, setki tysięcy linii kodu), poprzez zorganizowanie niezbędnych zasobów (np. modeli, tekstur, dźwięków), na zbalansowaniu mechaniki (testy, testy, testy) kończąc (albo i nawet nie kończąc, bo tak naprawdę zasygnalizowałem tylko najbardziej podstawowe sprawy). W sumie ja też nie mam tego pojęcia nazbyt dużego, ale jednak.

Tymczasem tak się składa, że w ramach poznawania Pythona mam zamiar napisać... klon Arkanoida. Stopniem złożoności ten projekt ustępuje o kilka rzędów wielkości wspomnianym produkcjom typu AAA, a mimo to nadal trzeba wiele rzeczy przemyśleć, podjąć niejedną decyzję, zadbać o odpowiednie zasoby, etc. Nawiasem mówiąc podejrzewam, że większość entuzjastów gier-w-stylu-X-tylko-lepszych odbiłoby się nawet od tak małego projektu, jak od ściany. A żeby pomóc sobie samemu ogarnąć temat, postanowiłem przed rozpoczęciem właściwej pracy "głośno pomyśleć" i wespół w zespół razem z Wami zastanowić się nad kształtem gry.

Grafika

Nie ma co się oszukiwać, jesteśmy wzrokowcami. Słowo "widzisz" bywa często używane jako synonim "rozumiesz", nawet jeśli akurat nie ma czego oglądać. Z tego powodu kwestie związane z grafiką budzą zwykle duże emocje. Niestety tak się składa, że absolutnie nie mam zmysłu artystycznego, więc podchodzę do tematu od strony czysto utylitarnej. Zatem jedno jest pewne: podobnie, jak  oryginał, gra nie będzie emulowała środowiska trójwymiarowego (skąd wziąć modele? jak je obsługiwać?), pozostaniemy przy 2D.
I dalej, chciałbym, żeby działała w trybie pełnego ekranu, co wiąże się z problemem podejścia do skalowania. W przypadku gry w oknie możemy ustalić stałą rozdzielczość, np. 600x400 i wszystko do tego dostosować - obszar gry, rozmiar menu, wielkość klocków, etc. Przy pełnym ekranie sprawa jest znacznie bardziej skomplikowana. Wszak rozdzielczości monitorów bywają bardzo różne. Pół biedy, jakby proporcja krawędzi dłuższej do krótszej była stała - wówczas obraz wystarczyłoby odpowiednio rozciągać lub zwężać. Ale tak nie jest i automatyczne skalowanie często-gęsto prowadzi do deformacji obrazu. Rozwiązaniem może być np. stosowanie czarnych pasów przy krawędziach ekranu, tworzących taki margines, jaki akurat jest potrzebny do utrzymania stałych proporcji ekranu gry. Albo pogodzenie się z ewentualną deformacją. W tym przypadku wymyślna szata graficzna odpada, bo zmiana proporcji na inną od projektowanej, będzie od razu rzucać się w oczy.
Niemniej jednak, jak już wspomniałem, artysta ze mnie żaden, więc możliwe że gra będzie zbudowana wyłącznie z podstawowych figur geometrycznych i to renderowanych przez bibliotekę graficzną, nie zaś reprezentowanych przez sprite'y. W takim przypadku deformacja mogłaby być akceptowalna. Zobaczymy.

Udźwiękowienie

Jakieś plumkanie by się przydało. Dźwięki odbicia piłeczki wydają się absolutnym minimum. Dodatkowo fajnie, jakby były różne w zależności od powierzchni, od której się odbije piłeczka (o ile będą różne powierzchnie). Ponadto dobrze dobrana muzyczka przygrywająca w tle znacząco umila rozgrywkę. Trudno jednak, żeby była wciąż taka sama: wypada zróżnicować przynajmniej na poziomie menu-rozgrywka-highscore. Ideałem byłaby muzyka dobrana do konkretnej planszy, lub jej klimatu, ale to nie wchodzi w grę. Dźwięki spróbuję znaleźć na jednym z kilku portali oferujących darmowe SFXy. Muzykę pewnie na Jamendo. Mam nadzieję, że konwersja z MP3 na jakiś niekomercyjny format nie przysporzy trudności.

Menu, stany gry

Czy chcemy mieć rozbudowane menu? Chodzi mi teraz głównie o opcje konfiguracji: dźwięku czy grafiki. Raczej bym sobie odpuścił takie szczegóły, bo dopisywanie obsługi każdej pierdoły tego typu zajmie trochę czasu, a korzyść z tego dla grywalności żadna. A jak powinna wyglądać pętla główna gry? Czy wystarczy możliwość pauzowania, czy też chcemy móc modyfikować również inne ustawienia w trakcie toczonej rozgrywki (np. zmieniamy rozdzielczość i kontynuujemy grę, jak gdyby nigdy nic)? Konsekwentnie tutaj chyba również nie ma sensu się rozdrabniać. Zdaje się, że pozostaniemy przy minimalnej ilości opcji i brakiem możliwości zmiany ustawień podczas gry (tylko pauza).

Gameplay

Standardem arukanoidów są plansze o ustalonym porządku cegiełek. Może od tego odejść? Może wymyślić algorytm losujący sensowną, grywalną planszę? Z jednej strony odpadłby problem projektowania poziomów, z drugiej wymyślenie wspomnianego algorytmu nie jest trywialnym zadaniem. Ponadto przy losowych planszach lista najlepszych wyników byłaby trochę bez sensu. Może zastosować oba rozwiązania i zrobić dwa tryby rozgrywki: fixed i random?
Jakie powinno być ustawienie planszy względem paletki? Naturalne, ze względu na skojarzenia z grawitacją i opadaniem piłki, któremu zapobiegamy, wydaje się ustawienie paletki wzdłuż dolnej krawędzi ekranu. Jednak w Krakout 2 na C64, moim ulubionym klonie, paletka chodziła po prawej krawędzi.
Czy trzymać się schematu, że trzy strony są zamknięte, a paletka chodzi po czwartej? A gdyby tak paletki były dwie - na górze i dole lub z prawej i lewej strony? Innymi słowy plansza byłaby "na przestrzał". Czy w takim przypadku lepiej będzie, żeby poruszały się równocześnie w tym samym kierunku, czy zrobić oddzielne sterowanie dla każdej?
Przeszkadzajki. Zwykle po pewnym czasie na planszy zaczynają pojawiać się przeszkadzajki - stworki poruszające się w mniej lub bardziej losowych kierunkach i utrudniające de facto zbijanie cegiełek. Raczej na pewno z tego zrezygnuję - stworki musiałyby mieć swoją grafikę, logikę pojawiania się i poruszania, przy trafieniu kulką przeszkadzajki powinien dobywać się inny dźwięk niż przy trafieniu cegiełki. Jednym słowem kupa dodatkowej roboty.
Podobne ze spadającymi witaminami (chociaż mogłyby być też ukryte pod cegiełkami, co by niwelowało problem poruszania). Znowu problemy grafiki, dźwięków. Również trzeba by przemyśleć częstotliwość pojawiania się: losowa, stała? Oprogramować efekty: powiększanie statku, multiplikacja piłek, działko, etc. Raczej się w to nie będę pakował.
Czy piłka powinna mieć stałą prędkość, czy też w miarę upływu czasu powinna przyspieszać? Czy cegiełki powinny być zawsze zrobione z takiego samego materiału, czy różnych (np. wymagających dwukrotnego trafienia do zniszczenia, znowu problem dźwięku)? Czy powinny być tradycyjnie prostokątne, czy może zastosować jakieś inne struktury, np. koła, trójkąty? Wówczas niestety fizyka odbić by się mocno skomplikowała. Czy cegły powinny być zawsze jednej i tej samej wielkości? Można by tu odejść od schematu, ale czy to byłoby grywalne?

Konfiguracja

Co powinno być konfigurowalne? Życia (początkowe, częstotliwość zdobywania życia podczas gry?), prędkość piłki (startowa, przyrost), trudność (w jaki sposób to oddać? przez dwa poprzednie parametry?), sterowanie, grafika (np. rozdzielczość, schemat kolorów), dźwięk (np. głośność)? Jak modyfikacje parametrów wpływających na trudność rozgrywki przełożyć na highscore?

Zapamiętywanie stanu

Niby zawsze fajnie jest móc zapisać stan gry i nawet nie byłoby to jakoś ekstremalnie trudne do zaimplementowania. Pytanie tylko, czy warto. W końcu ile może trwać jedna gra? Dziesięć minut? W takiej sytuacji można się chyba obejść bez mechanizmów odczytu i zapisu. Poza tym, jeśli wprowadzimy jakieś "highscore", to taka opcja fałszowałaby wyniki (chyba że jej użycie automatycznie wykluczałoby możliwość wpisu na tablicę wyników po zakończeniu danej rozgrywki). Z drugiej strony zrzucanie stanu programu do plików i odtwarzanie go jest samo w sobie mechanizmem, który często przydaje się podczas programowania i w związku z tym warto go opanować. Nie podjąłem jeszcze ostatecznej decyzji.

Multiplayer

Raczej będziemy rozważać wyłącznie rozwiązania na jednym komputerze. Jaki model - rywalizacja, kooperacja? Gra jednoczesna, na zmianę? Jeśli jednoczesna, to na podzielonym ekranie, czy jednocześnie na tej samej planszy? A jeśli tak, to jakie umiejscowienie paletek: w jednej linii przenikalne lub nie, jak w deblu tenisowym czy naprzeciwlegle?

Na tym kończę zarys problemów i dylematów. Zapraszam do wyrażania własnych preferencji, co do poszczególnych wyborów oraz zgłaszania nowych pomysłów (najlepiej niezbyt kosztownych w implementacji). Cenne będą też fachowe sugestie osób bardziej doświadczonych w produkcji gier - może czegoś ważnego nie wziąłem pod uwagę, albo upatruję jakiś problem tam, gdzie go nie ma (bo np. biblioteka graficzna zrobi to za mnie).

poniedziałek, 8 sierpnia 2011

Składowe sukcesu gry futurystycznej - elementy drugorzędne

Poniżej opisuję krótko te aspekty futurystycznych strzelanek, które - jak się zdaje – nie mają istotnego wpływu na komercyjny sukces. Przyznam szczerze, że obecność wielu z nich w tym zestawieniu jest dla mnie samego zaskoczeniem. Gdybym miał powiedzieć, czego oczekuję od gier komputerowych, to wiele z poniższych elementów stałoby się kluczowymi.

Fabuła

Koncept fabularny największych hitów bywa czasem oryginalny (mniej lub bardziej), a czasem zgoła sztampowy. Niezmiennie jednak sama fabuła zazwyczaj kuleje, a w najlepszym razie jest tylko dobra. Nawet stosunkowo pozytywnie wyróżniający się pod tym względem BioShock, po tym jak opadł już pierwszy zachwyt, był punktowany za niewykorzystany potencjał.

Świat przedstawiony

Konwencja może być zupełnie dowolna – od niedalekiej przyszłości, poprzez loty międzygwiezdne, aż po wariacje w zaawansowanej technologicznie przeszłości. Nie ma to większego wpływu.

Sztuczna inteligencja

Lepiej, żeby nie była żenująco słaba, jednak nie stanowi kluczowego czynnika. Kilka niewyszukanych, lecz dobrze przemyślanych skryptów powinno wystarczyć.

Oprawa dźwiękowa

Fajnie jak jest genialnym dopełnieniem, ale nie szkodzi, gdy jest przeciętna. Nikt nie wybiera gry ze względu na udźwiękowienie. Zresztą ten element chyba trudno całkiem zepsuć.

Multiplayer

Jest jasne, że dobry tryb multiplayer może bardzo podnieść sprzedaż i przedłużyć żywotność gry. Niemniej jednak można się bez niego obejść, tyle że wtedy gra musi nadrobić dobrze zrealizowanymi elementami z grupy kluczowych.

Przeciwnicy

Fajnie jak są różnorodni i mają jakieś ciekawe cechy, ale najważniejsze jest, żeby ich nie brakowało (dynamika).

Interaktywne otoczenie

Im bardziej interaktywne otoczenie (tzn. chodzi zasadniczo o to, że można je niszczyć, przesuwać, itp. - coś, co nieco na wyrost nazywane jest fizyką), tym krytycy będą się bardziej nad tym rozpływali w pochwałach. Jednak to nie to decyduje o sprzedaży.

Podsumowanie

I to tyle, jeśli chodzi o cykl "Składowych sukcesu gry futurystycznej". Jeśli komuś by na tym bardzo zależało, to mogę podesłać oryginalny, pełny materiał, jaki wysłałem w ramach aplikacji na stanowisko analityka rynku gier (bogatszy o źródła, listę gier objętych badaniem wraz z informacjami dotyczącymi sprzedaży oraz wyróżnikami futurystycznymi, wnioski i kwestię przygodówek TPP). Tymczasem jeszcze raz zachęcam do dyskusji.

Zastrzeżenie: przypominam, że analiza odnosi się to roku 2007. Wprowadzenie do tematu znajdziesz tutaj, zaś opis kluczowych czynników sukcesu tutaj.

czwartek, 4 sierpnia 2011

Skąd się biorą zwierzoludzie?

Zawsze miałem ciągoty, żeby wszędzie dopatrywać się logiki - również tam, gdzie najpewniej jej nie ma. Przykładowo jednym z nurtujących mnie zjawisk w Starym Świecie było istnienie zwierzoludzi. Skąd się biorą, czy i jak się rozmnażają? Jakie tworzą społeczności? Poniższa scenka pokazuje moje wyobrażenie na temat pochodzenia tych istot.
Wiocha zabita dechami. Krowa żująca trawę na łące, z przejmującym rykiem pada na trawę i zaczyna się cielić. Niektórzy spośród świadków zdarzenia biegną po właściciela krowy, głośno wołając. Inni biegną pomóc zwierzęciu (tudzież pogapić się), w tym wioskowy głupek. Krowa rodzi w wielkich bólach i przypłaca to życiem. Na świat przychodzi istota przypominająca człowieka z głową zbliżoną do byka (posiadającą jednak wiele ludzkich cech). Niczym cielak chybotliwie wstaje i rusza w kierunku wioskowego głupka niemowy, potykając się przy tym o własne nogi. Wieśniacy oniemali rostępują się odruchowo aż stanie się jasne do kogo chce podejść potwór, który skrzeczącym głosem wychrypie coś, jak "tata". W tym momencie jeden z wieśniaków się otrząśnie i da sygnał do zaciukania potwora widłami. Jeśli do tego dojdzie (możliwe, że bohaterowie coś przedsięwezmą) wieśniacy będą chcieli spalić truchło. Nie przywiązują żadnej uwagi do zasygnalizowanego wątku ojcowstwa - po prostu uważają, że to demon jest winien czy inna siła nieczysta.
Otóż w moim Starym Świecie zwierzoludzie rodzą się ze związków mutantów ze zwierzętami, co można zasugerować graczom, jeśli ich postacie będą świadkami podobnej sceny. Do ustalenia, czy w tym przypadku głupek faktycznie jest ojcem potwora i czy ma jakieś dostrzegalne stygmaty chaosu.

Jeśli macie inną wizję, to chętnie poznam Wasze zdanie na ten temat. A może są jakieś oficjalne informacje odkrywające sekrety zwierzoludzi, do których nie dotarłem?

wtorek, 2 sierpnia 2011

Składowe sukcesu gry futurystycznej - warunki "sine qua non"

Przyglądając się tym spośród gier, które odniosły największy sukces rynkowy w 2007 roku i które jednocześnie zawierają elementy futurystyczne, daje się zauważyć pewne istotne cechy wspólne. Są wśród nich zarówno elementy dopracowane, chwalone przez recenzentów, po prostu zalety, jak i elementy, których przygotowaniu nie poświęcono dostatecznie dużo uwagi, czyli wady. Na podstawie tego można domniemywać, jakich aspektów absolutnie nie należy zaniedbywać podczas produkcji gry tego typu, a które można sobie nieco „odpuścić” (zakładam, że zgodnie z zasadą Pareto 20% aspektów zapewnia 80% sukcesu - kwestia doboru tych właściwych). W tej notce omówię pierwsze z nich, czyli elementy składowe sukcesu produkcji z gatunku strzelanin TPP i FPP.

Doskonale (wiarygodnie) zaprojektowane poziomy

To stwierdzenie powtarza się niczym mantra. Szczególnie podkreślana jest autentyczność, wiarygodność poziomów. Nie tyle chodzi tutaj o jakąś szczególną fantazję projektantów, co o logikę. Zdaje się, że bardzo ważne jest, by układ poziomu nie sprawiał wrażenia podporządkowania grze, tylko tworzył spójną, (a w przypadku budowli, czy statków również funkcjonalną) całość.

Zróżnicowany arsenał broni

Broni musi być dużo i musi być różnorodna – nie ma zmiłuj. Wszak broń, jak żaden inny element, może czerpać garściami z konwencji futurystycznej – jedynym ograniczeniem jest tutaj wyobraźnia i fizyka świata przedstawionego. Opcjonalnie rodzajów broni może być mniej, ale za to z alternatywnymi trybami użycia, albo np. więcej niż jednym rodzajem amunicji. Konwencja realistyczna, znana z gier osadzonych w realiach II wojny światowej (i pochodnych) w przypadku gier futurystycznych nie wchodzi w rachubę.

Supergadżet

Z powyższym akapitem wiąże się poniekąd jeszcze jeden element, który z braku innego pomysłu nazwałem supergadżetem. Chodzi mianowicie o jakiś wytwór nowoczesnej technologii dający nieoczekiwane pole manewru i powodujący, że rozgrywka przestaje być zwyczajna, sztampowa, lecz stawia nowe wyzwania, jednocześnie poszerzając wachlarz możliwości działania. Przykładem tego są takie rzeczy, jak np.:
  • ADAM w BioShock,
  • automatyczny osprzęt typu działko gatlina w Halo3 i innych,
  • pistolet grawitacyjny w Half-Life2,
  • Grappling Beam - promień działający bardzo podobnie do linki - w Metroid Prime 3,
  • Nectar w Haze,
  • nanokostium w Crysis,
  • zdalnie sterowany robot zwiadowczy w Frontlines: Fuel of War, czy w Tom Clancy's Ghost Recon: Advanced Warfighter 2,
  • i wiele innych.
Każdy hit miał przynajmniej jeden taki futurystyczny supergadżet.

Dynamika

Rozgrywkę prawdziwych hitów tego gatunku cechuje przede wszystkim dynamika. Nie ma tu miejsca na powolne rozkręcanie się akcji. Jeden częściowy wyjątek pod tym względem to Half-Life 2: Episode Two, który został ostro skrytykowany za to, że pierwsza godzina gry jest ślamazarna. Przezwyciężyła to jednak magia (i specyfika) tytułu z było nie było znakomitą tradycją. W każdym razie akcja to jest to, czego oczekują fani tego gatunku. Musi się dziać.

Logiczne zagwozdki i środowiskowe łamigłówki

Bardzo mile widziane (jak najbardziej w zgodzie z powyższym akapitem) są logiczne zagwozdki i środowiskowe łamigłówki. Okazuje się, że gracze lubią czasem dla odprężenia pomyśleć. Bywa, że tego rodzaju smaczki są nieobowiązkowe do pchnięcia fabuły do przodu – jak komuś się chce, to się głowi, a jak nie, to dalej hajda na wroga.

Kierowanie pojazdami (lub warianty)

Standardem już jest możliwość sterowania pojazdami, czasem nawet jednostkami latającymi, albo mechami. Praktycznie w każdej grze (no chyba że specyfika całkiem to wyklucza) pojawia się ten element – mniej lub bardziej eksponowany.

Last but not least: grafika

Niestety poniżej pewnego poziomu nie wypada schodzić (inaczej w przygodówkach, gdzie to jeszcze czasem ujdzie). Nie koniecznie musi to wiązać się z użyciem super zaawansowanego silnika graficznego. Czasem wystarczy podrasować wygląd poprzez dobrze zrobione rozbryzgi krwi, chmury dymu, czy odłamków ścian, ruchy roślinności na wietrze, ładne wybuchy czy efekty świetlne. Innym razem wystarczy, że grafika będzie dopieszczona i klimatyczna.

Kontekst niniejszej notki znajdziesz w pierwszym wpisie cyklu. A tutaj ciąg dalszy, czyli elementy drugorzędne.