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)
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
zarządzanie profilem
edycja avataru
edycja nazwy gracza
…
frameworku udostępnianego developerom
serwis www (nie wchodzący w skład projektu z ZTB)
udostępnienie podstawowych informacji o platformie
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
przeglądanie treści systemu
scenariusze dla zarejestrowanych gracza
dostęp do systemu
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
scenariusze dla developera
dostęp do serwisu:
przeglądanie treści systemu
zarządzanie kontem
dodawanie informacji do systemu
edycja danych w systemie
Identyfikacja funkcji
Analiza hierarchii funkcji projektowanej aplikacji
FHD - Functional Hierarchy Diagram
Budowa i analiza diagramu przepływu danych
Diagram kontekstowy
DFD - level 0
Wybór encji (obiektów) i ich atrybutów oraz ich powiązania (relacje)
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.
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