Progetto su iPhone     Reti Wireless     Silvio Daminato    28 febbraio 2011
Progetto: Simon says the color• Gioco     su iPhone: strega comanda colore  • iPhone    chiede un colore  • il   giocatore...
Single player• Tre   modalità di gioco  • Practice  • Time   attack  • Best   out of 5• Colore   scelto casualmente tra un...
Multiplayer• Un   giocatore fa la Strega  • Sceglie   il colore dalla palette  • Imposta    la difficoltà del gioco (timeou...
Sviluppare su iPhone• http://developer.apple.com/  • Registrazione come sviluppatore  • Download dei tools di sviluppo e d...
Tools• Xcode• Interface   Builder• iOS   simulator• Instruments• ...
Objective C• Object   oriented• C-based• Smalltalk   style                C++                         Obj-CA* a = new A;  ...
Delegazione• Usata   in maniera massiccia in Cocoa Touch• Un oggetto è delegato dall’applicazione a gestire un certo tipo ...
Delegazione - esempio    @interface MyViewController : UIViewController <UITableViewDelegate> {    < dichiarazioni dei cam...
Usare la fotocamera• Classe   UIImagePickerController  • Sorgente    UIImagePickerControllerSourceTypeCamera• Protocollo  ...
Realtà aumentata• Creare un oggetto di tipo UIView oppure creare una classe che eredita da UIView e creare un oggetto• Ass...
Realtà aumentata• Creare un oggetto di tipo UIView oppure creare una classe che eredita da UIView e creare un oggetto• Ass...
Fotocamera e realtà aumentata:           esempioUIImagePickerController *ipc = [[UIImagePickerController alloc] init];ipc....
Fotocamera e realtà aumentata:           esempioUIImagePickerController *ipc = [[UIImagePickerController alloc] init];ipc....
Salvataggio su file (testo)• Formato     .plist  • XML     con uno schema preciso  • Gestito    facilmente da codice• Prepa...
Salvataggio su file: esempioNSString *firstString = @"Voglio salvare questa stringa";NSString *secondString = @"Voglio salva...
Peer-to-peer su Bluetooth• Permette     di scambiare informazioni tra due o più devices• Rete    ad-hoc creata tra i peers...
Peers• Peers   identificati da peerID• Ogni    peer in un certo istante ha uno stato •   GKPeerStateAvailable •   GKPeerSta...
Trovare altri peers• Ogni   sessione implementa uno specifico servizio• Ricerca    di altri peers sulla base della propria ...
Implementazione di un Server• Inizializzazione   della sessione:  initWithSessionID:displayName:sessionMode:• Tipo    di s...
Implementazione di un Server:             esempio- (void) initSession {     GKSession *session = [[GKSession alloc] initWi...
Implementazione di un Server:             esempio- (void) session:(GKSession *)session peer:(NSString *)peerID didChangeSt...
Connessione ad un servizio• Inizializzazione   della sessione: initWithSessionID:displayName:sessionMode:• Tipo   di sessi...
Connessione ad un servizio:               esempio- (GKSession *) initSession {    GKSession *session = [[GKSession alloc] ...
Scambio di dati• Peers    connessi possono scambiarsi dati•    sendDataToAllPeers:WithDataMode:error:   invia a tutti i pe...
Scambio di dati - 2• Due    dataMode alternativi:  •   GKSendDataReliable      • Datiritrasmessi se non arrivano a destina...
Scambio di dati: esempioNSString *chosenColor = @"yellow";NSString *level = @"Easy";NSMutableDictionary *dict = [[NSMutabl...
Disconnessione dei peers• Terminare   la propria sessione: disconnectFromAllPeers• Disconnettere    un altro peer: disconn...
Peer picker•È   possibile creare la propria interfaccia grafica• L’oggetto                   fornisce l’interfaccia per pot...
Dove trovare aiuto• Barra   dei menu Xcode ➙ Help ➙ Developer documentation• http://developer.apple.com/library/ios/naviga...
Riferimenti• “Simon says the color”, S. Daminato, A. Giavatto, Progetto di Reti Wireless 2009/2010• http://developer.apple...
Upcoming SlideShare
Loading in …5
×

Progetto su iPhone - Seminario di Reti Wireless

875 views
825 views

Published on

"Simon says the color" è un'applicazione per iPhone sviluppata da Silvio Daminato e Andrea Giavatto per il progetto di Reti Wireless nell'anno accademico 2009/2010. È un gioco in cui un giocatore deve scattare una fotografia con un certo colore al centro dello schermo.
Le caratteristiche principali di questa applicazione sono descritte e viene dato qualche esempio di codice.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
875
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Progetto su iPhone - Seminario di Reti Wireless

    1. 1. Progetto su iPhone Reti Wireless Silvio Daminato 28 febbraio 2011
    2. 2. Progetto: Simon says the color• Gioco su iPhone: strega comanda colore • iPhone chiede un colore • il giocatore scatta una foto con quel colore al centro• Semplice realtà aumentata• Salvataggio su file• Bluetooth• Upload dei top scores
    3. 3. Single player• Tre modalità di gioco • Practice • Time attack • Best out of 5• Colore scelto casualmente tra una palette• Timeout entro il quale il giocatore deve fotografare il colore
    4. 4. Multiplayer• Un giocatore fa la Strega • Sceglie il colore dalla palette • Imposta la difficoltà del gioco (timeout)• Fino a sei giocatori• Comunicazione su bluetooth• Architettura Client-Server
    5. 5. Sviluppare su iPhone• http://developer.apple.com/ • Registrazione come sviluppatore • Download dei tools di sviluppo e debugging • Gestione di profili, certificati, devices• http://developer.apple.com/programs/ios/university/ • Permette di sviluppare e testare su device
    6. 6. Tools• Xcode• Interface Builder• iOS simulator• Instruments• ...
    7. 7. Objective C• Object oriented• C-based• Smalltalk style C++ Obj-CA* a = new A; A* a = [[A alloc] init];a -> doSomething(argument); [a doSomething: argument];delete a; [a release];
    8. 8. Delegazione• Usata in maniera massiccia in Cocoa Touch• Un oggetto è delegato dall’applicazione a gestire un certo tipo di eventi• Esempi: UITableViewDelegate, UIAlertViewDelegate• Unoggetto delegato deve implementare determinati metodi con determinate signature
    9. 9. Delegazione - esempio @interface MyViewController : UIViewController <UITableViewDelegate> { < dichiarazioni dei campi di MyViewController >}@implementation ServerController...- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ < ritorna il numero di righe nella sezione >}- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ < configura e ritorna la cella >}...@end
    10. 10. Usare la fotocamera• Classe UIImagePickerController • Sorgente UIImagePickerControllerSourceTypeCamera• Protocollo delegato UIImagePickerControllerDelegate • Metodo imagePickerController:didFinishPickingMediaWithInfo: restituisce l’immagine • Metodo imagePickerControllerDidCancel: invocato quando si annulla
    11. 11. Realtà aumentata• Creare un oggetto di tipo UIView oppure creare una classe che eredita da UIView e creare un oggetto• Assegnare alla proprietà cameraOverlayView un puntatore a quell’oggetto
    12. 12. Realtà aumentata• Creare un oggetto di tipo UIView oppure creare una classe che eredita da UIView e creare un oggetto• Assegnare alla proprietà cameraOverlayView un puntatore a quell’oggetto È così semplice.
    13. 13. Fotocamera e realtà aumentata: esempioUIImagePickerController *ipc = [[UIImagePickerController alloc] init];ipc.delegate = self;ipc.sourceType = UIImagePickerControllerSourceTypeCamera;ipc.showsCameraControls = NO;ipc.navigationBarHidden = YES;ipc.wantsFullScreenLayout = YES;OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];ipc.cameraOverlayView = overlay;[self presentModalViewController:ipc animated:YES];
    14. 14. Fotocamera e realtà aumentata: esempioUIImagePickerController *ipc = [[UIImagePickerController alloc] init];ipc.delegate = self;ipc.sourceType = UIImagePickerControllerSourceTypeCamera;ipc.showsCameraControls = NO;ipc.navigationBarHidden = YES;ipc.wantsFullScreenLayout = YES;OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];ipc.cameraOverlayView = overlay;[self presentModalViewController:ipc animated:YES];
    15. 15. Salvataggio su file (testo)• Formato .plist • XML con uno schema preciso • Gestito facilmente da codice• Preparazione dei dati, generazione del path del file, salvataggio• Generazione del path, lettura del file• Dati come NSDictionary, NSArray, NSString, ...
    16. 16. Salvataggio su file: esempioNSString *firstString = @"Voglio salvare questa stringa";NSString *secondString = @"Voglio salvare anche questa!";NSMutableArray *plistFileContent = [[NSMutableArray alloc] initWithObjects:firstString, secondString, nil];NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentsDirectory = [paths objectAtIndex:0];NSString *myfile = [documentsDirectory stringByAppendingPathComponent:@"myfile.plist"];[plistFileContent writeToFile:myfile atomically:YES];NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *documentsDirectory = [paths objectAtIndex:0];NSString *myfile = [documentsDirectory stringByAppendingPathComponent:@"myfile.plist"];NSArray *plistFileContent = [[NSArray alloc] initWithContentsOfFile:myfile];
    17. 17. Peer-to-peer su Bluetooth• Permette di scambiare informazioni tra due o più devices• Rete ad-hoc creata tra i peers• La comunicazione avviene tramite sessioni (oggetti che gestiscono gli eventi legati ad essa)• Protocollo delegato GKSessionDelegate• Il formato dei dati trasmessi è libero
    18. 18. Peers• Peers identificati da peerID• Ogni peer in un certo istante ha uno stato • GKPeerStateAvailable • GKPeerStateUnavailable • GKPeerStateConnected • GKPeerStateDisconnected • GKPeerStateConnecting• Metodo session:peer:didChangeState: invocato quando un peer cambia stato
    19. 19. Trovare altri peers• Ogni sessione implementa uno specifico servizio• Ricerca di altri peers sulla base della propria Session Mode • Server • Client • Peer• Perstabilire una connessione devono esserci almeno un server che pubblicizza un servizio ed un client che lo cerchi
    20. 20. Implementazione di un Server• Inizializzazione della sessione: initWithSessionID:displayName:sessionMode:• Tipo di sessione GKSessionModeServer o GKSessionModePeer• Proprietà available settata a YES per pubblicizzare il proprio servizio• Il servizio pubblicizzato ha un proprio Id• Notifica di una richiesta di connessione: session:didReceiveConnectionRequestFromPeer:• Il server decide se accettare o rifiutare la connessione•A sessione creata è invocato session:peer:didChangeState:
    21. 21. Implementazione di un Server: esempio- (void) initSession { GKSession *session = [[GKSession alloc] initWithSessionID:@"Servizio" displayName:@"Server" sessionMode:GKSessionModeServer]; session.delegate = self; [session setDataReceiveHandler: self withContext:nil]; session.available = YES;}- (void)session:(GKSession *)session didReceiveConnectionRequestFromPeer:(NSString *)peerID { if (![session isAvailable]) { [session denyConnectionFromPeer:peerID]; } else { session.available = NO; if (connections_count == max_connections) { [session denyConnectionFromPeer: peerID]; } else { [session acceptConnectionFromPeer: peerID]; connections_count ++; } session.available = YES; }}
    22. 22. Implementazione di un Server: esempio- (void) session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { switch (state) { case GKPeerStateConnected: NSLog(@"Peer %@ connected!", peerID); connections_count ++; break; case GKPeerStateDisconnected: NSLog(@"Peer %@ disconnected!", peerID); connections_count --; break; }}
    23. 23. Connessione ad un servizio• Inizializzazione della sessione: initWithSessionID:displayName:sessionMode:• Tipo di sessione GKSessionModeClient o GKSessionModePeer• Proprietà available settata a YES per cercare il servizio• Vengono trovati solo servizi con sessionID uguali• Metodo session:peer:didChangeState: quando si trova un server• Metodo connectToPeer:withTimeout: per connettersi•A sessione creata è invocato session:peer:didChangeState:
    24. 24. Connessione ad un servizio: esempio- (GKSession *) initSession { GKSession *session = [[GKSession alloc] initWithSessionID:@"Servizio" displayName:@"Client" sessionMode:GKSessionModeClient]; session.delegate = self; [session setDataReceiveHandler: self withContext:nil]; session.available = YES; return session;}- (void) session:(GKSession *)session peer:(NSString *)peerID didChangeState:(GKPeerConnectionState)state { switch (state) { case GKPeerStateAvailable: NSLog(@"Trovato servizio!"); [session connectToPeer:peerID withTimeout:5.0]; break; case GKPeerStateConnected: NSLog(@"Connessione avvenuta!"); session.available = NO; break; case GKPeerStateDisconnected: NSLog(@"Disconnesso"); break;}
    25. 25. Scambio di dati• Peers connessi possono scambiarsi dati• sendDataToAllPeers:WithDataMode:error: invia a tutti i peers• sendData:toPeers:WithDataMode:error: invia ad alcuni peers•I dati possono avere qualsiasi formato, purché siano incapsulati in un oggetto NSData
    26. 26. Scambio di dati - 2• Due dataMode alternativi: • GKSendDataReliable • Datiritrasmessi se non arrivano a destinazione • Ordine di arrivo garantito • GKSendDataUnreliable • Dati trasmessi una volta• Per ricevere i dati: receiveData:fromPeer:inSession:context:• Oggetto che riceve i dati: setDataReceiveHandler:withContext:
    27. 27. Scambio di dati: esempioNSString *chosenColor = @"yellow";NSString *level = @"Easy";NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys: chosenColor, @"Color", level, @"Level", nil]; NSMutableData *data = [[NSMutableData alloc] init];NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];[archiver encodeObject:dict forKey:@"Dictionary"];[archiver finishEncoding];[session sendDataToAllPeers:data withDataMode:GKSendDataReliable error:nil];- (void) receiveData:(NSData *)data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void*)context { NSDictionary *gameInfo; NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; gameInfo = [unarchiver decodeObjectForKey:@"Dictionary"]; [unarchiver finishDecoding]; NSString * response = [gameInfo objectForKey:@"Response"]; [self checkResponse:response peerID:peer];}
    28. 28. Disconnessione dei peers• Terminare la propria sessione: disconnectFromAllPeers• Disconnettere un altro peer: disconnectPeerFromAllPeers:• Se un peer non risponde per un certo timeout (disconnectionTimeout) viene disconnesso automaticamente• Quando un peer si disconnette viene invocato session:peer:didChangeState:
    29. 29. Peer picker•È possibile creare la propria interfaccia grafica• L’oggetto fornisce l’interfaccia per poter GKPeerPickerController stabilire una connessione tra diversi peers• Protocollo delegato GKPeerPickerControllerDelegate
    30. 30. Dove trovare aiuto• Barra dei menu Xcode ➙ Help ➙ Developer documentation• http://developer.apple.com/library/ios/navigation/• http://www.google.com/ • http://stackoverflow.com/ • http://www.iphonedevsdk.com/forum/
    31. 31. Riferimenti• “Simon says the color”, S. Daminato, A. Giavatto, Progetto di Reti Wireless 2009/2010• http://developer.apple.com/library/ios/navigation/• “Game Kit Programming Guide”, Apple Inc.

    ×