====== iPoints - Platforma społecznościowa dla graczy na platformie iPhone/iPod Touch/iPad ====== [[corhydron@gmail.com|Bartłomiej Trzciński]] ==== Streszczenie ==== Projekt stanowi część kompletnej platformy społecznościowej dla graczy platformy iPhone OS. (baza danych, natywna aplikacja iPoints na platformę iPhone OS oraz framework udostępniany developerom) ==== Sformułowanie zadania projektowego ==== Pierwszym i za razem najwazniejszym celem projektu jest ułatwienie developerom dodawania tablic wyników online do tworzonych przez nich gier, tak by umożliwić potencjalnym graczom porównywanie między sobą wyników, a wszystko to przy jak najmniejszym nakładzie pracy ze strony developerow gier, tak by mogli skupić się na tworzeniu i dopracowywaniu samych gier. Udostępniając jednak ten sam system różnym developerom pojawia się szansa na skupienie wszystkich graczy w jednym miejscu i zaoferowaniu im dodatkowych funkcjonalności zwiększających tym samym grywalność gier wykorzystujących ten system jak: pojedynki pomiędzy graczami, czy część społecznościowa - wyszukiwanie i dodawanie znajomych tak by w łatwy sposób śledzić ich poczynania. Kolejną korzyścią już dla samych developerów jest możliwość popularyzowania swoich gier wśród najbardziej zainteresowanych - tj graczy platformy na którą ich gry są tworzone. Jeśli chodzi o sam system to składa się on z trzech komponentów: natywnej aplikacji do pobrania z App Store przeznaczonej dla graczy, frameworku udostępnianego developerom, który łatwo mogą zintegrować ze swoją grą oraz serwis www dostępny z poziomu przeglądarki przeznaczony na razie głownie dla developerów oraz osób chcących dowiedzieć się czegoś o samym systemie. ==== Analiza stanu wyjściowego ==== Na rynku znajduje się już kilka tego typu rozwiązań jak : scoreloop, agon-online, openfeint oraz zaprezentowany ostatnio przez Apple - Game Center. Jednak jeśli spojrzymy na potencjalny rynek odbiorców konkurencja wydaje się bardzo mała: Obecnie sprzedanych zostało już ponad 85mln urządzeń z systemem iPhone OS, samych developerów jest już ponad 31 tys, którzy stworzyli łączenie blisko 51 tys samych gier. Dodatkowo, oferowany przez większość istniejących rozwiązań model biznesowy zrzuca opłaty na odbiorców końcowych tj. graczy - z czym nie do końca się zgadzam, znając niechęć do płacenia czegokolwiek po zakupieniu konkretnego tytułu. ==== Analiza wymagań użytkownika ==== System będzie działał na zasadzie kont graczy tworzonych na podstawie unikalnego numeru urządzenia. Gry do stsyemu dodawane będą przez zarejestrowanych w nim deweloperów, którzy wykorzystują udostępniony framework w swoich grach. === Funkcjonalności poszczególnych komponentow === - **natywnej aplikacji iPoints przeznaczonej dla graczy** * przeglądanie listy gier, w które gra dany gracz, zawierającymi również informacje o obecnie zajmowanej przez niego lokacie w każdej z gier listowanej wraz z jej ikoną * przeglądanie szczegółowej listy wynikow dla każdej z gier * obsługa części społecznościowej platformy * przeglądanie listy znajomych * przeglądanie listy zaproszeń znajomości * wyszukiwanie znajomych * przeglądanie profili swoich znajomych, śledzenie ich postępów * wyzywanie znajomych na pojedynki * przeglądanie pojedynków * aktualnie trwających * oczekujących na akceptacje jednej ze stron * archiwum pojedynków * zarządzanie profilem * edycja avataru * edycja nazwy gracza * ... - **frameworku udostępnianego developerom** * wyświetlenie tablicy wyników online wewnątrz gry * konfiguracja wyglądu tablicy wyników * kolorystyka * tło * całkowita modyfikacja, jeśli zajdzie taka potrzeba * API udostępnione developerom: * szybka rejestracja nowych graczy * szybka edycja gracza (zmiana nazwy) * wysyłanie rezultatów do serwera * ... - **serwis www (nie wchodzący w skład projektu z ZTB)** * udostępnienie podstawowych informacji o platformie * przegląd funkcjonalności * kontakt z autorem przy pomocy formularza * dodawanie nowych gier do systemu (dla developerów) * zarządzanie wcześniej dodanymi grami (dla developerów) * promowanie gier * przeglądanie tablic wyników wszystkich dostępnych gier * ... ==== Określenie scenariuszy użycia ==== - scenariusze dla gościa - dostęp do systemu * rejestracja w systemie - przeglądanie treści systemu * przeglądanie serwisu www * przeglądanie funkcjonalności * przeglądanie tablic wyników gier * kontakt z autorem * przegladanie treści w aplikacji * przeglądanie tablic wyników w grze - scenariusze dla zarejestrowanych gracza - dostęp do systemu * uruchomienie aplikacji iPoints * korzystanie z gier z wbudowanym systemem - zarządzanie kontem * zmiana nazwy gracza * zmiana avataru - przeglądanie treści systemu * przeglądanie listy gier z szybkim podglądem zajmowanej lokaty * przeglądanie szczegółowych tablic wyników * przeglądanie listy znajomych * wyszukiwanie znajomych * przeglądanie pojedynków - dodawanie informacji do systemu * wysyłanie osiągniętych rezultatów w grach * tworzenie pojedynków - scenariusze dla developera - dostęp do serwisu: * zalogowanie do systemu * przypomnienie hasła użytkownika - przeglądanie treści systemu * przeglądanie dodanych gier - zarządzanie kontem * zmiana hasła - dodawanie informacji do systemu * dodawanie nowych gier do serwisu * promowanie gier - edycja danych w systemie * modyfikacja informacji dodanych gier ==== Identyfikacja funkcji ==== ==== Analiza hierarchii funkcji projektowanej aplikacji ==== === FHD - Functional Hierarchy Diagram === {{:pl:dydaktyka:ztb:2010:projekty:ipoints:ipoints_fhd.png|}} ==== Budowa i analiza diagramu przepływu danych ==== === Diagram kontekstowy === {{:pl:dydaktyka:ztb:2010:projekty:ipoints:ipoints_kontekstowy.png|}} === DFD - level 0 === {{:pl:dydaktyka:ztb:2010:projekty:ipoints:ipoints_dfd_0.png|}} ==== Wybór encji (obiektów) i ich atrybutów oraz ich powiązania (relacje) ==== {{:pl:dydaktyka:ztb:2010:projekty:ipoints:ipoints_erd.png}} ==== Projekt diagramów STD ==== Dzięki mechanizmowi TabBarControllera można przemieszczać sie swobodnie pomiędzy czterema głównymi widokami (lista gier, znajomi(część społecznościowa), pojedynki i profil) nie koniecznie miedzy ich początkowymi oknami - położenie w każdym widoku zostaje zapamiętane. Jedyny sposób opuszczenia aplikacji jest naciśnięcie przycisku Home na urządzeniu. {{:pl:dydaktyka:ztb:2010:projekty:ipoints:ipoints_std.png}} ==== Projektowanie tabel, kluczy, kluczy obcych, powiązań między tabelami, indeksów, etc. w oparciu o zdefiniowany diagram ERD ==== CREATE TABLE `ip_challenges` ( `challengeID` int(11) NOT NULL auto_increment, `projectID` varchar(15) NOT NULL default '', `goal` int(11) NOT NULL default '0', `active` int(11) NOT NULL default '0', `days` int(11) NOT NULL default '0', `finishDate` datetime NOT NULL default '0000-00-00 00:00:00', `friendshipID` int(11) NOT NULL default '0', `creator` varchar(40) NOT NULL default '', PRIMARY KEY (`challengeID`), KEY `projectID` (`projectID`), KEY `friendshipID` (`friendshipID`), KEY `creator` (`creator`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=97 ; CREATE TABLE `ip_developers` ( `developerID` int(4) NOT NULL auto_increment, `firstName` varchar(65) NOT NULL default '', `lastName` varchar(65) NOT NULL default '', `email` varchar(65) NOT NULL default '', `password` varchar(65) NOT NULL default '', `companyName` varchar(65) default NULL, PRIMARY KEY (`developerID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=14 ; CREATE TABLE `ip_friends` ( `friendshipID` int(11) NOT NULL auto_increment, `player1ID` varchar(40) NOT NULL default '', `player2ID` varchar(40) NOT NULL default '', `type` int(11) NOT NULL default '1', PRIMARY KEY (`friendshipID`), KEY `player1ID` (`player1ID`), KEY `player2ID` (`player2ID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=40 ; CREATE TABLE `ip_projects` ( `projectID` varchar(15) NOT NULL default '', `projectName` varchar(20) NOT NULL default '', `iconURL` varchar(70) NOT NULL default '', `scoreType` int(11) NOT NULL default '0', `description` text NOT NULL, `developerID` int(4) NOT NULL default '0', `promoted` int(2) NOT NULL default '0', `graphicURL` text NOT NULL, `genere` varchar(20) NOT NULL default '', `price` int(11) NOT NULL default '0', PRIMARY KEY (`projectID`), KEY `developerID` (`developerID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `ip_results` ( `resultID` int(11) NOT NULL auto_increment, `createdAt` timestamp NOT NULL default CURRENT_TIMESTAMP, `playerID` varchar(40) NOT NULL default '', `projectID` varchar(15) NOT NULL default '', `score` int(11) NOT NULL default '0', PRIMARY KEY (`resultID`), KEY `projectID` (`projectID`), KEY `playerID` (`playerID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1299 ; CREATE TABLE `ip_users` ( `playerID` varchar(40) NOT NULL default '', `playerName` varchar(20) NOT NULL default '', `createdAt` datetime NOT NULL default '0000-00-00 00:00:00', `updatedAt` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `avatarURL` varchar(100) NOT NULL default '', `email` varchar(30) NOT NULL default '', `pass` varchar(20) NOT NULL default '', `link` varchar(50) NOT NULL default '', PRIMARY KEY (`playerID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Constraints for table `ip_challenges` -- ALTER TABLE `ip_challenges` ADD CONSTRAINT `ip_challenges_ibfk_1` FOREIGN KEY (`projectID`) REFERENCES `ip_projects` (`projectID`), ALTER TABLE `ip_challenges` ADD CONSTRAINT `ip_challenges_ibfk_1` FOREIGN KEY (`projectID`) REFERENCES `ip_projects` (`projectID`), ADD CONSTRAINT `ip_challenges_ibfk_2` FOREIGN KEY (`friendshipID`) REFERENCES `ip_friends` (`friendshipID`), ALTER TABLE `ip_challenges` ADD CONSTRAINT `ip_challenges_ibfk_1` FOREIGN KEY (`projectID`) REFERENCES `ip_projects` (`projectID`), ADD CONSTRAINT `ip_challenges_ibfk_2` FOREIGN KEY (`friendshipID`) REFERENCES `ip_friends` (`friendshipID`), ADD CONSTRAINT `ip_challenges_ibfk_3` FOREIGN KEY (`creator`) REFERENCES `ip_users` (`playerID`); -- -- Constraints for table `ip_friends` -- ALTER TABLE `ip_friends` ADD CONSTRAINT `ip_friends_ibfk_1` FOREIGN KEY (`player1ID`) REFERENCES `ip_users` (`playerID`), ALTER TABLE `ip_friends` ADD CONSTRAINT `ip_friends_ibfk_1` FOREIGN KEY (`player1ID`) REFERENCES `ip_users` (`playerID`), ADD CONSTRAINT `ip_friends_ibfk_2` FOREIGN KEY (`player2ID`) REFERENCES `ip_users` (`playerID`); -- -- Constraints for table `ip_projects` -- ALTER TABLE `ip_projects` ADD CONSTRAINT `ip_projects_ibfk_1` FOREIGN KEY (`developerID`) REFERENCES `ip_developers` (`developerID`); -- -- Constraints for table `ip_results` -- ALTER TABLE `ip_results` ADD CONSTRAINT `ip_results_ibfk_1` FOREIGN KEY (`playerID`) REFERENCES `ip_users` (`playerID`), ALTER TABLE `ip_results` ADD CONSTRAINT `ip_results_ibfk_1` FOREIGN KEY (`playerID`) REFERENCES `ip_users` (`playerID`), ADD CONSTRAINT `ip_results_ibfk_2` FOREIGN KEY (`projectID`) REFERENCES `ip_projects` (`projectID`); ==== Denormalizacja struktury tabel ==== Tabela została zdenormalizowana w celu wygodniejszej pracy na zawartych w niej danych. Anomalie, które przez to mogą się pojawić zabezpieczone są przez interfejs umożliwiający dodawanie pewnych danych (np nowych pojedynków pomiędzy graczami) tylko w pewnych określonych warunkach tak by uniknąć wystąpienia anomalii. ==== Projektowanie operacji na danych ==== Do komunikacji z bazą aplikacja używa skryptów php znajdujących sie na serwerze, te po wywołaniu generują odpowiedź w postaci danych w formacie XML lub przy pomocy statusu protokołu http przykłady kwarend: $query = 'SELECT * FROM (SELECT playerName, avatarURL FROM ip_users WHERE playerID IN (SELECT player2ID FROM ip_friends WHERE player1ID = "'. $udid .'" AND type = 2) UNION SELECT playerName, avatarURL FROM ip_users WHERE playerID IN (SELECT player1ID FROM ip_friends WHERE player2ID = "'. $udid .'" AND type = 2)) as friends ORDER BY playerName'; $query = 'INSERT INTO ip_users (playerID, playerName, createdAt) VALUES ("'. $udid.'","'.$name . '",now())'; $my_friends = 'SELECT * FROM (SELECT playerName FROM ip_users WHERE playerID IN (SELECT player2ID FROM ip_friends WHERE player1ID = "'. $udid .'" AND type = 2) UNION SELECT playerName FROM ip_users WHERE playerID IN (SELECT player1ID FROM ip_friends WHERE player2ID = "'. $udid .'" AND type = 2)) as friends ORDER BY playerName'; $invit_recived = 'SELECT playerName FROM ip_users WHERE playerID IN (SELECT player1ID FROM ip_friends WHERE player2ID = "'. $udid .'" AND (type = 1 OR type =3)) ORDER BY playerName'; $invit_sent = 'SELECT playerName FROM ip_users WHERE playerID IN (SELECT player2ID FROM ip_friends WHERE player1ID = "'. $udid .'" AND type = 1) ORDER BY playerName'; $query = 'UPDATE ip_friends SET type = 3 WHERE player1ID = (SELECT playerID FROM ip_users WHERE playerName = "'. $name .'") AND player2ID = "'. $udid .'" AND type = 1'; ==== Interfejs użytkownika ==== Zrzuty ekranu symulatora (natywna aplikacja iPoints) {{:pl:dydaktyka:ztb:2010:projekty:ipoints:screen_shot_2010-06-16_at_11.13.48_pm.png|}}{{:pl:dydaktyka:ztb:2010:projekty:ipoints:screen_shot_2010-06-16_at_11.14.28_pm.png}}|{{:pl:dydaktyka:ztb:2010:projekty:ipoints:screen_shot_2010-06-16_at_11.14.37_pm.png}}|{{:pl:dydaktyka:ztb:2010:projekty:ipoints:screen_shot_2010-06-16_at_11.14.45_pm.png|}}