2011-07-05 6 views
1

Je crée un jeu simple (application iPhone) et je veux que les utilisateurs aient un classement basé sur des points. Quel serait le meilleur moyen de stocker tous les points utilisateurs et d'attribuer un rang à un utilisateur lors du premier lancement de l'application? J'ai un serveur (un site web), donc je peux utiliser SQL si nécessaire. Des idées?Meilleure façon de stocker le «rang» d'un utilisateur - iPhone App

Répondre

1

vous pouvez utiliser un NSMutableURLRequest pour accéder à une page php qui lit le classement (s) à partir d'une base de données mySQL. Avoir le php de sortie XML et analyser le résultat. Le code suivant envoie une requête à une page php, puis analyse le fichier XML renvoyé par cette page. (Vous pouvez également publier des données sur une page php différente pour mettre à jour les entrées de la base de données, etc.).

//IN THE .h class (of a viewController) 
... : UIViewController { 

    //I use a label to display the data 
    IBOutlet UILabel *label1; 
    //Create global variable 
    NSString *tempString; 
    //Dataset for response from HTTP Request 
    NSMutableData *receivedData; 
    NSXMLParser *xmlParser; 

} 

-(void) initiateAPIConnection; 

@property (nonatomic, retain) NSString *tempString; 

@property (nonatomic, retain) UILabel *label1; 

@end 
//IN THE .h class 


//IN THE .m class 
//... 
@synthesize label1, tempString; 
//... 

-(void)initiateAPIConnection{ 

    NSString *post = [NSString stringWithFormat:@"user=Chris"]; 
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; 

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
    [request setURL:[NSURL URLWithString:@"http://www.yourDomain.com/yourPhpPage.php"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setTimeoutInterval:10.0]; //fail after 10 seconds with no response 
    [request setHTTPBody:postData]; 

    NSURLConnection *conn=[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease]; 
    if (conn){ 
    NSLog(@"In if conn"); 
    receivedData = [[NSMutableData data] retain]; 
    NSLog(@"End of if conn"); 
    } 
    else{ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Conn error" message:@"No Server" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
    } 

}//initiateAPIConnection 

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Connection error" message:[error localizedDescription] delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil]; 
    [alert show]; 
    [alert release]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ 
    NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response; 
    NSLog(@"%i",[urlResponse statusCode]); 
    [receivedData setLength:0]; 
} 

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ 
    [receivedData appendData:data]; 
} 

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ 
    xmlParser = [[NSXMLParser alloc]initWithData:receivedData]; 
    [xmlParser setDelegate:self]; 

    //you may want to enable these features of NSXMLParser. 
    [xmlParser setShouldProcessNamespaces:NO]; 
    [xmlParser setShouldReportNamespacePrefixes:NO]; 
    [xmlParser setShouldResolveExternalEntities:NO]; 
    [xmlParser parse]; 
} 


//XMLdeligate methods 
-(void)parserDidStartDocument:(NSXMLParser *)parser{ 
    NSLog(@"Started Parsing"); 
} 

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{ 
    NSLog(@"Started Element name: %@", elementName); 
} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    NSLog(@"Found characters: %@", string); 
    tempString = string; 
} 

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
    NSLog(@"Finished Element name: %@", elementName); 

    //my outputted xml would have <ranking>...ValueFromDb...</ranking> in it's response 
    if([elementName isEqualToString:@"ranking"]){ 
    //display result in a label (you could save it to a local variable instead) 
    label1.text = tempString; 
    } 

} 

-(void)parserDidEndDocument:(NSXMLParser *)parser{ 
    NSLog(@"Finished Parsing"); 
} 


//... 


//Don't forget to dealloc 
-(void)dealloc { 
    //... 
    [label1 release]; 
    [tempString release]; 
    [xmlParser release]; 
    [receivedData release]; 
    //... 
    [super dealloc]; 
} 
//IN THE .m class 

Vous devrez définir la logique requise pour rechercher la base de données pour l'utilisateur dans les questions de classement. Vous pouvez transmettre les informations de connexion en annexant (par exemple)? User = NomUtilisateur & passe = MOT DE PASSE à la fin du fichier .php ... à savoir ...

[request setURL:[NSURL URLWithString:@"http://www.yourDomain.com/yourPhpPage.php?user=USERNAME&pass=PASSWORD"]]; 

nomUtilisateur et motDePasse serait valeurs lues à partir du bac à sable etc ... vous devez formater le URLWithString (comme vous le faites avec stringWithFormat)

-Chris Allinson

3

Je vous suggère de jeter un oeil à Apple Game Center. Il contient (presque) des classements préconstruits.

+0

Bien sûr, cela ne fonctionne qu'avec des appareils 4.1 ou plus. Pour les aînés les plus âgés, décidez si cela vaut la peine de les soutenir. Si c'est le cas, affichez des scores élevés dans le serveur SQL. Triez-les et recherchez l'identifiant de l'utilisateur avec lequel vous avez enregistré le score. Puis retournez le rang correspondant. S'il y a plusieurs scores, vous pouvez simplement ajouter les rangs, les mettre dans une autre liste triée et obtenir le rang à partir de là. – FeifanZ

+0

Eh bien, vous n'avez rien mentionné concernant les limitations dans les versions iOS. Vous devez décider si cela vaut la peine de supporter les anciennes versions - en particulier avec iOS 5 juste au coin de la rue. –

-1

ouais c'est la meilleure option à mon avis, que pour utiliser la fonction de rang dans cet écran où vous récupérez ou l'affichage des informations des utilisateurs ..

vous pouvez utiliser différentes fonctions pour cet écran où vous devez sélectionner triée utilisateur par là score de decremently, vous n'avez pas par ce genre de programmation pour faire du travail supplémentaire ay

Questions connexes