Spis treści

iPoints - Platforma społecznościowa dla graczy na platformie iPhone/iPod Touch/iPad

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

  1. natywnej aplikacji iPoints przeznaczonej dla graczy
  1. frameworku udostępnianego developerom
  1. serwis www (nie wchodzący w skład projektu z ZTB)

Określenie scenariuszy użycia

  1. scenariusze dla gościa
    1. dostęp do systemu
      • rejestracja w systemie
    2. 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
  1. scenariusze dla zarejestrowanych gracza
    1. dostęp do systemu
      • uruchomienie aplikacji iPoints
      • korzystanie z gier z wbudowanym systemem
    2. zarządzanie kontem
      • zmiana nazwy gracza
      • zmiana avataru
    3. 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
    4. dodawanie informacji do systemu
      • wysyłanie osiągniętych rezultatów w grach
      • tworzenie pojedynków
  1. scenariusze dla developera
  2. dostęp do serwisu:
  1. przeglądanie treści systemu
  1. zarządzanie kontem
  1. dodawanie informacji do systemu
  1. 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

Zrzuty ekranu symulatora (natywna aplikacja iPoints)

||