Jakiś czas temu przy okazji tworzenia jednej z aplikacji na Windows Phone (w sumie to mogę nawet podać na nią namiary: CatchEggs – do pobrania na Marketplace) zacząłem się zastanawiać nad przygotowaniem statystyk globalnych dla gry. Wiadomo – każdy lubi pograć samemu w grę, ale jeżeli uda mu się zdobyć ciekawy wynik zawsze jest chęć podzielenia się nim z innymi… Warto o tym pamiętać i dodać taką opcję w swojej aplikacji. Jak to osiągnąć?

Sposób 1 – Facebook

Jak wiadomo na platformie Windows Phone mamy dostęp do bardzo wygodnej integracji z Facebookiem. W tym celu wystarczy stworzyć launcher ShareStatusTask lub też ShareLinkTask. Pierwszy z nich pozwala jedynie na wysłanie jakiejś wiadomości, natomiast drugi jest moim zdaniem dużo ciekawszy. Zamiast jedynie dzielić się wiadomością można wykorzystać go jako dodatkowe źródło promowania aplikacji zwyczajnie dodając do niej link w formacie http://www.windowsphone.com/s?appid={0} gdzie zamiast {0} należy wstawić ID aplikacji. To jednak nie jest najlepszy sposób, aczkolwiek jest on bardzo przydatny z marketingowego punktu widzenia…

Sposób 2 – WP7 Game Services

Ciekawszym moim zdaniem sposobem jest przygotowanie usługi, która będzie odpowiedzialna za zbieranie i udostępnianie statystyk dla gry, którą właśnie tworzymy lub też rozwijamy. Z racji na fakt, że wiele osób tworzy lub też planuje stworzyć grę z publicznymi statystykami postanowiłem podzielić się swoim kodem i udostępnić całość w ramach Codeplex pod nazwą WP7 Game Services.

Całość składa się z trzech projektów i bazy danych.

MaciejGrabek.WP7.Services jest projektem opartym o ASP.NET MVC 4.0 WebAPI (aktualnie w wersji beta do pobrania z tego miejsca). Aby uniknąć konieczności wystawiania wielu serwisów dla wielu gier postanowiłem dodatkowo dorzucić do obiekt logiczny gry, dzięki czemu jedna instancja usług wystarczy na potrzeby różnych gier :)

MaciejGrabek.WP7.Services.Phone jest biblioteką, którą każdy może dołączyć do swojej aplikacji działającej na WP7. Najważniejszym jej elementem jest GameServicesCaller, który jest odpowiedzialny za komunikację z usługą.

MaciejGrabek.WP7.Services.Phone.Demo zawiera przykładowe użycie wspomnianego GameServicesCaller’a. Z racji na fakt, że przez przykład ludzie najszybciej się uczą moim zdaniem nie mogło zabraknąć takiego właśnie projektu :)

Bezpieczeństwo

Z racji na to, że nie chcemy aby ktoś w łatwy sposób podszył się pod naszą aplikację GameServicesCaller używa do komunikacji jeszcze jednej ważnej rzeczy, a mianowicie hasha gry. Jest on niezbędny przy dodawaniu jakiegokolwiek wpisu do bazy.

Dodatkowo każdy wpis jest identyfikowany ID urządzenia, przez co jeżeli ktoś poprawi swój wynik, to w bazie przechowujemy tylko jeden wpis – drugi zwyczajnie nie jest potrzebny, a dodatkowo zmniejsza to prawdopodobieństwo “przepełnienia” bazy.

Pobranie wyników jest natomiast niezmiernie proste, bo wystarczy wywołać api podając znormalizowaną nazwę gry np tak: http://mydomain/api/gameresults/catcheggs, dzięki czemu możemy stworzyć nie tylko klienta WP7, ale również dowolnego innego. Oczywiście dla wygody cała komunikacja odbywa się przy wykorzystaniu REST i JSON, co otwiera to rozwiązanie również na inne platformy :)

P.S.

Kiedy w grze będą statystyki online? Aktualnie czekam na uruchomienie ASP.NET MVC 4 na hostingu (mam nadzieję, że się uda) i po paru dniach uaktualnienie będzie gotowe do pobrania z Marketplace :)