M.aniserowicz Pdi
M.aniserowicz Pdi
Michał Aniserowicz
Ocena: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.....................................
Podpis Przewodniczącego Komisji
Egzaminu Dyplomowego
Kierunek: Informatyka
Specjalność: Inżynieria Systemów Informatycznych
Data urodzenia: 1990.02.14
Data rozpoczęcia studiów: 2009.10.01
Życiorys
...........................
Podpis studenta
Egzamin dyplomowy:
Złożył egzamin dyplomowy w dniu: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
z wynikiem: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Ogólny wynik studiów: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dodatkowe uwagi i wnioski Komisji: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.......................................................................................
Streszczenie
Summary
The goal of this thesis is to create a framework supporting the development of multiu-
ser applications for Android system. The framework should consist of a client-server bus,
as well as several Augmented Reality components. An additional goal is to explore the
possibility of adapting commonly used programming practises dedicated to large projects
during Andorid applications development. All the goals have been fully accoplished - the
output is the implementation of the client-server bus as well as AR components allowing
to track the device’s geographic coordinates and to render a stable three-dimensional gra-
phics on the display of the device. In order to demonstrate the features of the framework,
a sample multiplayer game has been created. The thesis includes a description of the
created components’ design process, as well as their functionality and structure.
Spis treści
1 Wstęp 5
1.1 Zakres pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Zawartość pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2 Podłoże pracy 7
2.1 Rola smartfonów w życiu codziennym . . . . . . . . . . . . . . . . . . . . . 7
2.2 Augmented Reality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Platforma Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Gry przeznaczone na platformy mobilne . . . . . . . . . . . . . . . . . . . 9
2.5 Uzasadnienie wyboru tematu pracy . . . . . . . . . . . . . . . . . . . . . . 9
3 Struktura platformy 11
3.1 Wewnętrzna organizacja komponentów . . . . . . . . . . . . . . . . . . . . 12
3.2 Warianty wdrożenia aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3
SPIS TREŚCI 4
8 Praktyki programistyczne 48
8.1 Zapewnienie elastycznej implementacji . . . . . . . . . . . . . . . . . . . . 48
8.2 Zasada jednej odpowiedzialności a system Android . . . . . . . . . . . . . . 51
8.3 Wzorce projektowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8.4 Test-Driven Development (TDD) . . . . . . . . . . . . . . . . . . . . . . . 56
8.5 Zarządzanie projektem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
9 Podsumowanie 60
9.1 Ocena jakości platformy i perspektywy rozwoju . . . . . . . . . . . . . . . 61
9.2 Wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Rozdział 1
Wstęp
5
ROZDZIAŁ 1. WSTĘP 6
Podłoże pracy
7
ROZDZIAŁ 2. PODŁOŻE PRACY 8
grafikę na obrazie świata rzeczywistego [2]. Urządzenia zdolne używać aplikacji tego typu
nie były jednak wtedy szeroko dostępne - dopiero pojawienie się smartfonów umożliwiło
rozpowszechnienie koncepcji AR.
Rzeczywistość rozszerzona jest koncepcją zbliżoną do rzeczywistości wirtulanej (ang.
Virtual Reality, VR [3]). Wspólną cechą obu rodzajów systemów jest to, że wszelkie
przetwarzanie w nich zachodzące odbywa się w czasie rzeczywistym. Tym, co odróżnia
Augmented Reality od rzeczywistości wirtualnej jest źródło przetwarzanych informacji -
AR bazuje na świecie rzeczywistym, podczas gdy w przypadku Virtual Reality jest to
jedynie wygenerowana przez system symulacja tego świata.
Przykładem wykorzystania rzeczywistości rozszerzonej może być przytoczona już apli-
kacja wyświetlająca informacje o danym zabytku po wskazaniu go obiektywem aparatu
telefonu. Inne obszary jej zastosowania, to między innymi [4]:
• kod źródłowy Android jest publicznie dostępny2 , czego wynikiem jest powstanie
wielu niekomercyjnych wersji systemu,
• aplikacje firm trzecich przed publicznym udostępnieniem nie muszą przechodzić eta-
pu certyfikacji, który jest konieczny na takich platformach jak iOS czy Windows
Phone,
1
Open Handset Alliance - konsorcjum rozwijające otwarte standardy dla urządzeń mobilnych, w skład
którego wchodzą firmy takie jak Google, HTC, Motorola i T-mobile. Strona domowa Open Handset Al-
liance dostępna jest pod adresem: http://www.openhandsetalliance.com/. Rozwojem platformy Android
zajmuje się głównie firma Google.
2
Źródła systemu Android dostępne są pod adresem: http://source.android.com/.
ROZDZIAŁ 2. PODŁOŻE PRACY 9
• platforma Android w chwili obecnej posiada ponad 70% rynku urządzeń mobil-
nych [5],
Reality jest obszarem jeszcze niezbadanym, jednakże w bardzo szybkim tempie zyskują-
cym popularność - wydaje się, że jest to najlepszy moment na wzięcie udziału w procesie
rozwoju i popularyzacji tej idei. Dodatkową motywacją jest fakt, że na chwilę obecną
wybór platform wspomagających wykorzystanie AR jest bardzo ograniczony.
Wybór architektury klient-serwer jako domyślnego przeznaczenia platformy jest po-
dyktowany chęcią zbadania potencjału wykorzystania obliczeń rozproszonych w aplika-
cjach mobilnych. Dodatkowo, architektura ta pozwala na tworzenie aplikacji i gier wielo-
osobwych, co rozszerza pole zastosowania stworzonego narzędzia.
Należy również wspomnieć o czysto programistycznym aspekcie pracy. Obaj autorzy
traktują praktyki programistyczne nie tylko jako przedmiot edukacji, ale i zaintereso-
wań. Z tego względu, podjęcie się pracy nad rozbudowaną platformą w dwuosobowym
zespole jest nie tylko sprawdzianem umiejętności nabytych w toku studiów, ale i oka-
zją do poszerzenia wiedzy i zyskania cennego doświadczenia w tej dziedzinie. Aby z tej
okazji skorzystać, autorzy postanowili zbadać możliwość zastosowania w platformie An-
droid popularnych praktyk programistycznych stosowanych podczas tworzenia aplikacji
przeznaczonych na komputery osobiste.
Rozdział 3
Struktura platformy
11
ROZDZIAŁ 3. STRUKTURA PLATFORMY 12
Client
fARmework
PositionTracking.Data PositionTracking.Android
TrackTracker.Client
Server
fARmework
PositionTracking.Data PositionTracking.Java
TrackTracker.Sever
fARmework
Utils.Client PositionTracking.Data
PositionTracking.Android PositionTracking.Java
TrackTracker
Jak wyjaśniono w sekcji 3.2, platforma fARmework została przygotowana zarówno dla sa-
modzielnych aplikacji przeznaczonych na system Android, jak również dla aplikacji klient-
serwer. Niniejszy rozdział poświęcony jest komponentowi Core, który umożliwia tworzenie
aplikacji drugiego z wymienionych typów.
Oparta na platformie aplikacja kliencka może w łatwy sposób wymieniać wiadomości
z serwerem, o ile obie strony znają klasy przesyłanych wiadomości. Komponent Core
realizuje zarówno wysyłanie i odbieranie danych, jak i walidację poprawności ich klas. Za
zestawienie połączenia pomiędzy klientem a serwerem odpowiada zewnętrzna biblioteka
netty [7]. Komponent Core przesyła za jej pomocą dane zserializowane do formatu JSON.
Serializację i deserializację realizuje zewnętrzna biblioteka, google-gson [8].
– zestawienie połączenia,
16
ROZDZIAŁ 4. REALIZACJA SZYNY KOMUNIKACYJNEJ 17
– zakończenie połączenia,
– nadejście wiadomości,
– wystąpienie sytuacji wyjątkowej.
DataService DataObject
DataRegistry Message
2. Format XML [10]. Jest to uniwersalny format zapisu danych wspierany przez wiele
platform. Nie nakłada wymagań co do budowy serializowanych obiektów, ani ich
implementacji. Jego wadą jest jednak nieoptymalny rozmiar zserializowanego obiek-
tu.
3. Format JSON. Posiada wszystkie zalety języka XML przy jednoczesnym zapewnie-
niu bardziej wydajnej serializacji.
{
"type": "com.fARmework.HareAndHounds.Data.GameStartInfo",
"data": "{ "DemandedPositionUpdateInterval": 20 }"
}
Biblioteka google-gson wybrana została z tego względu, że nie narzuca żadnych wy-
magań i ograniczeń co do obiektów, które serializuje i deserializuje. Oznacza to, że seria-
lizowane obiekty nie muszą mieć określonej klasy bazowej, a pola ich klas nie muszą być
oznaczone adnotacjami określającymi sposób serializacji - w takim przypadku mówi się,
że biblioteka współpracuje z obiektami POJO (Plain Old Java Object).
Sposób serializacji danych jest znany jedynie klasie DataService. Format serializacji
można więc wymienić w całkowicie transparentny dla systemu sposób, dostarczając alter-
natywnej implementacji tej klasy.
Message
deserialize()
deserialized
data
handleData()
handle()
deserialize()
fromJson()
deserialized
message
getDataClass()
data class
fromJson()
deserialized
deserialized data
data
• Jako że wysłanie danych odbywa się na żądanie aplikacji a nie w wyniku zdarzenia,
ChannelHandler nie bierze w nim udziału.
Send
serialize()
getDataType()
data type
toJson()
serialized data
toJson()
serialized message
serialized
message
write()
23
ROZDZIAŁ 5. ODCZYTYWANIE POZYCJI TELEFONU 24
5.1.1 GPS
Odczyt bezpośrednio z odbiornika GPS zamontowanego w urządzeniu. Jest to najdokład-
niejszy sposób określania pozycji telefonu - jego dokładność wynosi od kilku do kilkunastu
metrów. Ma jednak znaczące ograniczenia:
• przed uzyskaniem pierwszego odczytu musi nawiązać kontakt z kilkoma (ok. 7) sa-
telitami GPS, co może potrwać nawet do kilku minut,
Wyboru źródła odczytu dokonuje programista, poprzez jawne wskazanie, którego do-
stawcy lokalizacji (ang. LocationProvider ) chce użyć. Może również zdać się na system,
formułując jedynie kryteria wyboru, takie jak wymagana dokładność odczytu, możliwość
uzyskania informacji o prędkości poruszania się urządzenia i kierunku jego ruchu, czy
zezwolenie na użycie metody, która wiąże się z naliczeniem opłat przez operatora sieci.
PositionTracking używa domyślnego sposobu odczytu, podając domyślne kryteria wy-
boru. Pozwala to systemowi wybrać najdokładniejszy w danych warunkach bezpłatny
LocationProvider.
Użytkownik komponentu może zlecić pojedynczy odczyt lub odczyt cykliczny z zada-
nym interwałem czasowym. W przypadku wyboru drugiej możliwości, powinien pamiętać
o jawnym zakończeniu odczytu, gdy przestanie go potrzebować.
1
Firma Google, podobnie jak inne firmy działające w sektorze mobilnym, zbiera i przechowuje infor-
macje o lokalizacji sieci bezprzewodowych [14].
ROZDZIAŁ 5. ODCZYTYWANIE POZYCJI TELEFONU 25
5.2.1 Przykład
W danym momencie policjant znajduje się w okolicach wydziału Elektroniki i Technik In-
formacyjnych (punkt A(52,219505° N, 21,012028° E)), a złodziej - na ulicy Lwowskiej (w
punkcie B(52,220458° N, 21,012281° E)). Odległość między punktami wynosi 103 m, a azy-
mut - 9,24°. Następują odczyty pozycji policjanta i złodzieja, oba z niedokładnością około
dziesięciu metrów. Według odczytów, policjant znajduje się w punkcie A’(52,219518° N,
21,011892° E), a złodziej w punkcie B’(52,220466° N, 21,012431° E).
Obliczenia dla tych punktów wskazują, że policjant powinien przebyć 115,3 m w kie-
runku 19,2°. Niedokładność wskazań jest na tyle duża, że może zmylić policjanta - zamiast
na ulicę Lwowską, prawdopodobnie pobiegnie on w kierunku ulicy Śniadeckich (sytuację
obrazuje Rysunek 5.1).
Jak widać, dokładność jest istotna nawet w sytuacjach, w których odległość pomiędzy
telefonami wynosi ponad sto metrów. W przypadku metod odczytu udostępnianych przez
system Android nie jest możliwe całkowite usunięcie błędu odczytu - wynika on z jakości
odbiorników GPS montowanych w smartfonach. Można jednakże próbować go zmniej-
szyć poprzez rozszerzenie istniejących metod o operacje korygujące takie jak filtrowanie
lub uśrednianie kolejnych odczytów. Alternatywnym podejściem jest zaimplementowanie
nowej metody dającej w określonych warunkach lepsze wyniki niż metody podstawowe.
To właśnie podejście zastosowano po stworzeniu podstawowej wersji komponentu, czego
wynikiem było opracowanie i zaimplementowanie dodatkowej metody odczytu pozycji.
Rysunek 5.1: Pesymistyczny przykład konsekwencji błędu odczytu pozycji. Linią prze-
rywaną zaznaczono wynik dokonanego odczytu, a linią ciagłą - to, jak wynik zostanie
zinterpretowany przez użytkownika. [Źródło mapy: https://maps.google.pl/]
Tabela 5.1: Zależność procentowej siły sygnału sieci WiFi docierającego do telefonu od
odległości pomiędzy telefonem a ruterem. Wartość 0 oznacza brak widoczności sieci.
100
80
signal strength (%)
60
40
20
−5 0 5 10 15 20 25 30 35 40 45 50 55
distance (m)
Rysunek 5.2: Wykres zależności średniej procentowej wartości siły sygnału sieci WiFi
docierającego do telefonu od odległości pomiędzy telefonem a ruterem.
ROZDZIAŁ 5. ODCZYTYWANIE POZYCJI TELEFONU 30
Jak widać, dla przedziału 5−40 metrów siła odbieranego sygnału maleje w przybliżeniu
liniowo. W przedziale 0−10 metrów zależność ta nie występuje prawdopodobnie z powodu
braku zakłóceń w bezpośrednim sąsiedztwie źródła sygnału - w odległości kilku metrów
od punktu dostępowego siła sygnału maleje więc wolniej. W przedziale 40 − 50 metrów
sygnał powoli zanika - jest on widoczny dla telefonu, ale ze względu na jego niską moc,
system nie jest w stanie poprawnie wyznaczyć jego wskaźnika RSSI.
W celu sformułowania wzoru określającego odległość od punktu dostępowego na pod-
stawie siły sygnału, przyjęto następujące założenia:
• użytkownik aplikacji korzystającej z PositionTracking.WiFi bardzo rzadko znajdo-
wał się będzie w bezpośrednim sąsiedztwie punktu dostępowego,
• punkty dostępowe rozlokowane będą na tyle gęsto, że telefon użytkownika zawsze
będzie odbierał przynajmniej trzy sygnały o sile powyżej 15%.
Spełnienie tych założeń gwarantuje, że urządzenie w zdecydowanej większości przy-
padków znajdować się będzie w przedziale odległości, dla których siła sygnału maleje
w przybliżeniu liniowo. Pozwala to przyjąć liniową zależność pomiędzy siłą sygnału a od-
ległością od punktu dostępowego. Wzór wyrażający tę zalezność jest następujący:
distance = (1 − strength) ∗ range,
gdzie:
• strength - procentowa siła sygnału pochodzącego od punktu dostępowego - wartość
z zakresu [0, 1],
• range - zasięg sieci udostępnianej przez punkt dostępowy - wyrażony w metrach8 .
Rysunek 5.3: Przykładowy teoretyczny problem trilateracji pozycji urządzenia (D) przy
znajomości pozycji punktów dostępowych (A1 , A2 , A3 ) i odległości dzielącej urządzenie
od tych punktów (d1 , d2 , d3 ).
gdzie:
• xi - szerokość geograficzna punktu Ai ,
• yi - długość geograficzna punktu Ai ,
• (x, y) - współrzędne punktu zwracanego przez algorytm.
Tabela 5.2: Opracowanie wyników pomiarów dokładności metod odczytu pozycji telefonu
wewnątrz budynku.
gdzie:
gdzie:
• ∆y = y2 − y1 ,
• gry, takie jak wymienione wcześniej podchody, “policjanci i złodzieje”, czy paintball,
35
ROZDZIAŁ 6. WYŚWIETLANIE STABILIZOWANEJ GRAFIKI 36
jest montowany głównie w urządzeniach z najwyższej półki, takich jak Samsung Galaxy
SIII, czy Sony Xperia GO1 . W przypadku budynku, niedokładny odczyt wysokości mógł-
by powodować wyświetlenie grafiki na niewłaściwym piętrze, co byłoby niedopuszczalne
w wielu typach aplikacji (np. wspomniana juz gra podchody).
Sensory służące do lokalizacji telefonu są więc zbyt niedokładne lub zbyt rzadko stoso-
wane, by móc oprzeć na nich algorytm określania położenia wirtualnej grafiki. Potencjal-
nym usprawnieniem może być posiłkowanie się technikami rozpoznawania obrazu w celu
znalezienia tła, na którym umieszczona została grafika. Przybliżona pozycja urządzenia
byłaby odczytywana za pomocą GPS, a dokładne miejsce, w którym należy wyświetlić
obiekt, byłoby wyznaczane na podstawie analizy obrazu z kamery telefonu. Ta możliwość
została jednak odrzucona ze względu na jego potencjalną zawodność - precyzyjne umiesz-
czenie grafiki w budynku o jednolitych ścianach w dalszym ciągu nie byłoby możliwe -
przy wysokiej trudności wykonania (należałoby wykorzystać do sześciu sensorów telefonu2
i zaimplementować uniwersalny algorytm rozpoznawania tła).
W dalszych rozważaniach wzięto pod uwagę metodę, która korzysta z relatywnie pro-
stej techniki rozpoznawania obrazu, a zarazem jest odporna na problem jednolitego tła.
Mowa o Wykrywaniu Znaczników (ang. Marker Detection) - jest to technika polegająca
na umieszczeniu w rzeczywistym świecie znacznika, który zostanie łatwo rozpoznany przez
telefon[21]. Przykłady znaczników używanych przy implementacji Wykrywania Znaczni-
ków zawiera Rysunek 6.1
• o ile w przypadku tablicy ogłoszeń znacznik może być umieszczony na stałe, o tyle w
przypadku gier, po zakończeniu rozgrywki należałoby usunąć umieszczone znaczniki,
• znaczniki są widoczne nie tylko dla urządzenia, ale również dla użytkownika aplika-
cji - w grze podchody, goniący szukałby nie wirtualnych strzałek, a rzeczywistych
znaczników.
• OpenGL ES 1.x - wykorzystuje potok ustalony (ang. fixed pipeline). Oznacza to,
że transformacje oraz obliczenia koloru wierzchołków wykonywane w celu imitacji
cieniowania i oświetlenia wykonywane są przez kartę graficzną w sposób narzuco-
ny z góry. Utrudnia to lub uniemożliwia uzyskanie wielu zaawansowanych efektów
graficznych, takich jak mapowanie wypukłości3 , płaszczyzny refleksji4 [23] czy ren-
derowanie z użyciem szerokiego zakresu dynamicznego5 [24].
sceny wymaga podania kodu źródłowego tych operacji jako wartości zmiennych na-
pisowych (String) - poprawność tego kodu nie jest sprawdzana przez kompilator, co
znacznie utrudnia wykrycie ewentualnego błędu.
Nx = Uy Vz − Uz Vy (6.1)
Ny = Uy Vz − Uz Vy (6.2)
Nz = Uy Vz − Uz Vy (6.3)
Akcelerometr
Dostarcza informacji o przyśpieszeniach działających na telefon. Przykładowo jeśli telefon
trzymany jest pionowo w miejscu, to działa na niego jedynie siła grawitacji, dając odczyt
wynoszący około 9, 81 sm2 na osi y. Zorientowanie osi obrazuje Rysunek 6.3.
Na podstawie informacji o tym, na jakie osie i w jakim stopniu działa siła grawitacji,
można wnioskować o nachyleniu telefonu. Jako że akcelerometr mierzy przyśpieszenie
wypadkowe, podczas ruchu urządzenia wnioskowanie to jest obarczone dużym błędem.
Aby zminimalizować błąd, w systemie Android zastosowano filtr dolnoprzepustowy, który
częściowo odcina wpływ poruszania na dokładność odczytów.
Magnetometr
Odczytuje wartości pola magnetycznego otaczającego urządzenie. Na podstawie tych war-
tości można określić, w którą stronę świata zwrócony jest telefon. Sensor podaje odczyty
dla wszystkich trzech osi - orientacja urządzenia nie jest więc przeszkodą. Należy jednak
zwrócić uwagę na to, że odczyty nie mają szansy być bardzo dokładne - magnetometr
mierzy nie tylko pole magnetyczne Ziemi, ale także pola generowane przez inne podze-
społy telefonu, na przykład głośnika.
• portrait mode (tryb portretu, domyślny) - tryb używany, gdy telefon znajduje się
pozycji pionowej,
(a) (b)
(c) (d)
Rysunek 6.5: Przykłady obróconego modelu strzałki: (a) telefon trzymany pionowo, skie-
rowany na północ; (b) telefon leżący poziomo, skierowany na północ; (c) telefon trzymany
pionowo, skierowany na zachód; (d) telefon skierowany lekko w dół i na prawo od północy.
Model strzałki domyślnie wskazuje północ. Wskazywany kierunek można jednak do-
wolnie zmieniać - obrotem modelu może sterować komponent zewnętrzny.
ROZDZIAŁ 6. WYŚWIETLANIE STABILIZOWANEJ GRAFIKI 43
@Override
protected float[] generateVertices() {
reutrn new float[] {
0.0f * _width, 0.5f * _length, 0.5f * _height,
0.5f * _width, 0.1f * _length, 0.5f * _height,
// other vertices...
};
}
@Override
protected float[] generateColors() {
return new float[] {
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
// other vertices...
};
}
}
SpaceGraphics może znaleźć zastosowanie w wielu aplikacjach wykorzystujących rze-
czywistość rozszerzoną lub rzeczywistość wirtualną. Przykłady:
• Wspomniana wcześniej strzałka w grze “podchody”.
• Trójwymiarowy model kuli ziemskiej, który można oglądać z różnych stron, odpo-
wiednio obracając telefon.
• Gra polegająca na eksploracji wirtualnych pomieszczeń. Wykorzystanie SpaceGra-
phics polegałoby na stworzeniu dużego modelu pomieszczenia, w środku którego
“znajdowałby się” gracz. Obracanie telefonu ukazywałoby kolejne ściany pomiesz-
czenia.
Rozdział 7
Gra Hare and Hounds jest przeniesieniem tradycyjnej gry podchody w świat rzeczywisto-
ści rozszerzonej. Gracze używają swoich telefonów w celu połączenia się, a także zosta-
wiania i poszukiwania śladów.
• Goniący wygrywa, gdy dotrze do śladu, który nie prowadzi do kolejnego śladu, tzn.
gdy złapie uciekającego zanim ten pozostawi 30 śladów.
44
ROZDZIAŁ 7. HARE AND HOUNDS - PRZYKŁADOWA GRA 45
widzieć strzałkę, itd.) są przechowywane na serwerze w pliku XML1 i mogą zostać zmie-
nione w dowolnym momencie jego działania.
• Ekran startowy - pozwala na połączenie z serwerem jako gospodarz gry lub jej gość;
umożliwia dostęp do ekranu opcji.
• Ekran opcji - zawiera ustawienia aplikacji takie jak adres serwera czy nazwa gracza.
NewGameRequest
NewGameResponse
GameListRequest
GameListResponse
JoinGameRequest
JoinGameRequest
JoinGameResponse
JoinGameResponse
GameStartInfo
GameStartInfo
Game Loop
PositionData
PositionData
CheckpointEnteredInfo
Checkpoint Loop
PositionData
CheckpointUpdateInfo
CheckpointLeftInfo
GameEndInfo
GameEndInfo
Rysunek 7.1: Wymiana wiadomości w grze Hare and Hounds. Host - osoba uciekająca,
Guest - osoba goniąca.
ROZDZIAŁ 7. HARE AND HOUNDS - PRZYKŁADOWA GRA 47
• Ekran listy gier - wyświetla listę dostępnych gier, umożliwia dołączenie do jednej
z nich.
• Ekran śladu - pojawia się na urządzeniu osoby goniącej, gdy ta zbliży się do śladu
pozostawionego przez osobę uciekającą. Wyświetlna strzałkę wskazującą kierunek
ruchu.
Praktyki programistyczne
zastosowane w projekcie
Ważnym celem powstania fARmework było poszerzenie wiedzy programistycznej jego au-
torów. O ile informacje na temat specyficznych funkcji systemu Android i działaniu senso-
rów są przydatne tylko podczas implementacji aplikacji należących do relatywnie wąskie-
go spektrum, o tyle znajomość uniwersalnych wzorców i technik programowania znajduje
zastosowanie w każdym projekcie. Z tego powodu plaforma tworzona była z dbałością
o poprawne stosowanie dobrych praktyk programistycznych.
Dodatkową motywacją do takiego podejścia był fakt, że autorzy przed rozpoczęciem
prac nad plaformą mieli jedynie powierzchowny kontakt z systemem Android i specyfi-
ką programowania aplikacji mobilnych - nie posiadali więc wiedzy na temat możliwości
wykorzystania w tym środowisku praktyk właściwych dużym projektom informatycznym.
Projektowanie fARmework zyskało dzięki temu charakter badawczy.
Spośród trendów popularnych obecnie wśród programistów wybrane zostały zarówno
praktyki o globalnym zasięgu - dotyczące architektury projektu i sposobu zarządzania
nim - jak i pomniejsze wzorce pomocne w realizacji pojedynczych funkcjonalności.
48
ROZDZIAŁ 8. PRAKTYKI PROGRAMISTYCZNE 49
• obiekt zajmujący się rysowaniem obrazu przy pomocy funkcji OpenGL - GLHandler,
GraphicsRenderer
@Inject
public GraphicsRenderer(IGLHandler glHandler,
IOrientationProvider orientationProvider,
IDirectionProvider directionProvider) {
// inicjalizacja pól prywatnych
}
• Stworzyć tzw. moduł Dependency Injection, tzn. klasę przypisującą interfejsom od-
powiednie implementacje:
bind(IDirectionProvider.class)
.to(DefaultDirectionProvider.class);
}
}
<resources>
<string-array name="roboguice_modules">
<item>[nazwa pakietu].SpaceGraphicsModule</item>
<!-- inne moduły -->
</string-array>
</resources>
• tworzy na ekranie okno (wypełniające cały dostepny obszar lub tylko jego część),
w którym wyświetla elementy interfejsu użytkownika (metoda onCreate) i wypełnia
je danymi,
• zarządza używanymi przez siebie zasobami, takimi jak kamera telefonu czy odbiornik
GPS, jak również udostępnia je innym obiektom,
• zanim zostanie przesłonięta przez inną aktywność, zapisuje swój stan (metoda on-
Pause) i przywraca go, zanim powróci na ekran urządzenia (metoda onResume).
Takie rozwiązanie jest poniekąd wygodne (cała implementacja prostej aplikacji może
znaleźć się w pojedynczej klasie Activity), jednak stanowi naruszenie najważniejszej zasa-
dy programowania obiektowego: zasady jednej odpowiedzialności (ang. Single Responsibi-
lity Principle, SRP [34]). Z punktu widzenia architektury Model-View-Controller (MVC),
aktywność pełni rolę kontrolera, jak również częściowo realizuje rolę widoku. Aby obiekty
Activity nie stały się “przeładowane” funkcjonalnością, należy tę odpowiedzialność roz-
dysponować pomiędzy inne obiekty. W tym celu część kliencka komponentu Utils zawiera
klasy wspomagające implementację wzorca architektonicznego Model-View-ViewModel.
8.2.1 Model-View-ViewModel
Wzorzec Model-View-ViewModel (MVVM) jest oparty na wzorcu MVC, wprowadzającym
podział aplikacji na trzy warstwy:
2
System Android domyślnie nie udostępnia takiej operacji.
ROZDZIAŁ 8. PRAKTYKI PROGRAMISTYCZNE 55
CheckpointEnteredInfoHandler
HoundsViewModel
handle()
CheckpointEnteredInfo
1. Red:
2. Green:
4
Tortoise* - popularna rodzina klientów systemów kontroli wersji, do której należą m.in. TortoiseHG,
TortoiseSVN (system Subversion), TortoiseGit (system Git).
ROZDZIAŁ 8. PRAKTYKI PROGRAMISTYCZNE 59
Rysunek 8.6: Zrzut ekranu aplikacji TortoiseHG pokazujący odgałęzienia projektu: De-
velop - gałąź główna; 263#screen gesture-segments - gałąź zadania nr 263; 264#indo-
or positioning test - gałąź zadania nr 264. Kolejne wiersze oznaczają kolejne porcje kodu
dodawane do projektu.
Rozdział 9
Podsumowanie
60
ROZDZIAŁ 9. PODSUMOWANIE 61
9.2 Wnioski
Przebieg i ekekt pracy nad fARmework prowadzi do wniosku mówiącego, że dokładność
sensorów - szczególnie odbiornika GPS - nie jest jeszcze na tyle duża, aby na podstawie
ich odczytów możliwe było tworzenie aplikacji działających w konkretnych miejscach,
w bardzo małym promieniu wokół użytkownika. Dopiero połączone działanie sensorów
takich jak żyroskop, akcelerometr, magnetometr, obiornik GPS i barometr może dawać
możliwość dokładnego zlokalizowania telefonu w przestrzeni. Niestety, na chwilę obecną,
w pełen zestaw sensorów wyposażone są jedynie nieliczne urządzenia z najwyższej półki.
Z drugiej strony, procesowi projektowania i powstawania fARmework nieustannie to-
warzyszyło poczucie ogromnych możliwości, jakie niesie ze sobą wykorzystanie pełne-
go potencjału smartfonów. Wykorzystanie zaawansowanych technologicznie sensorów jest
w zasięgu możliwości każdego programisty. Śledzenie pozycji użytkownika, wyświetlanie
informacji w zależności od jego otoczenia, odczytywanie jego gestów lub obrazu z kamery
telefonu nie jest karkołomnym zadaniem wymagającym głębokiej wiedzy i znajomości za-
awansownych algorytmów. Aby podjąć się stworzenia aplikacji realizującej którąś z tych
funkcjonalności, wystarczy poświęcić kilka godzin na przestudiowanie artykułów na jej
temat i zapoznać się z gotowymi przykładami zamieszonymi w dokumentacji systemu
Android.
Tworzenie kolejnych kompomentów fARmework przebiegało w takim właśnie trybie.
Ich opracowanie było źródłem cennej wiedzy zarówno programistycznej, jak i dotyczącej
innych dziedzin, takich jak działanie poszczególnych sensorów czy podstawy geolokalizacji.
Bibliografia
[1] 7 things you should know about Augmented Reality. EduCause. dostęp: styczeń 2013.
w: http://net.educause.edu/ir/library/pdf/ELI7007.pdf
[2] What is Augmented Reality (AR): Augmented Reality Defined, iPhone Augmented
Reality Apps and Games and More. Digital Trends. dostęp: styczeń 2013. w:
http://www.digitaltrends.com/mobile/what-is-augmented-reality-iphone-apps-games-
flash-yelp-android-ar-software-and-more/
[4] 40 Best Augmented Reality iPhone Apps. iPhoneNess. dostęp: styczeń 2013. w:
http://www.iphoneness.com/iphone-apps/best-augmented-reality-iphone-
applications/
[5] Gartner Says Worldwide Sales of Mobile Phones Declined 3 Percent in Third Quarter
of 2012; Smartphone Sales Increased 47 Percent. Gartner. dostęp: styczeń 2013. w:
http://www.gartner.com/it/page.jsp?id=2237315
[12] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (2010). Wzorce projektowe. Elementy
oprogramowania obiektowego wielokrotnego użytku. Wydawnictwo HELION. ISBN 978-
83-246-2662-5. 321-333
62
BIBLIOGRAFIA 63
[13] Cejas, Fernando. (28.10.2010). Android Location Providers - gps, network, passive.
dostęp: styczeń 2013. w:
http://www.android10.org/index.php/articleslocationmaps/226-android-location-
providers-gps-network-passive/
[14] Vaughan-Nichol, Steven J. How Google–and everyone else–gets Wi-Fi location data.
dostęp: styczeń 2013. w:
http://www.zdnet.com/blog/networking/how-google-and-everyone-else-gets-wi-fi-
location-data/1664/
[21] Hirzer, Martin. (2008). Marker Detection for Augmented Reality Applications. 1-3
[22] OpenGL ES - The Standard for Embedded Accelerated 3D Graphics. dostęp: styczeń
2013. w: http://www.khronos.org/opengles/
[24] Green S., Cebenoyan C. High Dynamic Range Rendering on the GeForce 6800. do-
stęp: styczeń 2013. w: http://download.nvidia.com/developer/presentations/2004/
6800 Leagues/6800 Leagues HDR.pdf
[29] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (2010). Wzorce projektowe. Elementy
oprogramowania obiektowego wielokrotnego użytku. Wydawnictwo HELION. ISBN 978-
83-246-2662-5. 31
[30] Inversion of Control: Overview with Examples. CodeProject. dostęp: styczeń 2013.
w: http://www.codeproject.com/Articles/380748/Inversion-of-Control-Overview-with-
Examples
[34] Martin, Robert C. (2002). Agile Software Development, Principles, Patterns, and
Practices. Prentice Hall. ISBN 0-13-597444-5.
[37] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (2010). Wzorce projektowe. Elementy
oprogramowania obiektowego wielokrotnego użytku. Wydawnictwo HELION. ISBN 978-
83-246-2662-5. 181-190
[38] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (2010). Wzorce projektowe. Elementy
oprogramowania obiektowego wielokrotnego użytku. Wydawnictwo HELION. ISBN 978-
83-246-2662-5. 101-109
[39] Gamma, E., Helm, R., Johnson, R., Vlissides, J. (2010). Wzorce projektowe. Elementy
oprogramowania obiektowego wielokrotnego użytku. Wydawnictwo HELION. ISBN 978-
83-246-2662-5. 264-268
...........................
Michał Aniserowicz