Archivio mensile:Luglio 2011

Valerio e Lorenzo VS Martelli da Guerra – Capitolo 1 – I Personaggi

Ebbene si, è giunto il momento di inziare i miei bimbi all’antica e folle arte dei giochi di ruolo.. Cosi armati di matite, schede, dadi da 4,6,8,10,12,20 e 100 facce, delle miniature (tante) , un manuale (Martelli da Guerra) e tanta pazienza, creiamo i personaggi per Valerio (6 anni) e Lorenzo (13 anni).. io faccio il Master..

Martelli da GuerraMartelli da Guerra (edizione italiana di WarHammer fantasy RolePlay game, della Games Workshop), è un gioco di ruolo basato su un sistema a carriere (rispetto ai classici livelli di Dungeons & Dragons) e con un’ambientazione piu oscura, ambientata in un ipotetico impero, molto simile alla germania medievale.. I personaggi crescono pian piano , iniziando a fare lavori umili fino a diventare dei veri e propri eroi.. Il sistema è basato su una serie di caratteristiche numeriche principali, e delle abilità, che vengono di volta in volta acquisiti dalle carriere che i personaggi si ritrovano ad intraprendere..

 

 

 

 

Ho pensato possa essere divertente tenere traccia dei loro progressi in quella che è una storia del tutto improvvisata di sera in sera da me sulla base dei loro comportamenti..

L’inizio e’ abbastanza devastante.. i due giocatori rimangono allibiti al pensiero che si possa giocare con solo dadi e parole, senza una plancia, senza qualcosa di prestabilito..Ma sono affascinati dall’enorme libro delle regole, e dal mio continuo tirare i dadi per la scelta del tutto randomica del loro 2 personaggi..

Gotrek LorenzoLorenzo decide di farsi un nano, Gotrek (nome scelto randomicamente), alto 1.45m per un peso di 86 kg (un barattolo di carne), molto forte ma abbastanza sempliciotto e poco simpatico (per ora)..

Fa il Guerriero dei Tunnel, è stato addestrato al combattimento sottoterra nei labirinti e nei tunnels, odia i Goblin, ed e’ un bravo minatore e fabbro, dalla forza e la resistenza notevole. Segni particolari, una voce molto chiara e udito acuto.

 

 

 

 

 

 

elfo ValerioValerio decide di farsi un elfo, Ioalion, (nome scelto randomicamente), alto 1.80m per un peso di 60kg circa (un fuscello), con una vista eccellente, e la passione per il canto, abile nell’ambiente rurale, fa il GuardaCaccia, e’ un tiratore scelto, e capace di piazzare e scovare trappole.

Segni particolari un neo sul viso, e’ molto simpatico e intelligente anche se piu gracile rispetto al suo amico nano..

 

 

 

 

 

 

Nonostante le incompatibilità razziali, si incontrano durante una campagna di guerra in una piccola compagnia di mercenari che li arruola per la difesa di alcuni villaggi ai confini con le montagne grigie.. Finito il contratto, la compagnia viene sciolta e loro due decidono di mettersi in cammino verso Altdorf, la capitale dell’impero , alla ricerca di un buon lavoro..

Con pochi soldi in tasca, qualche coperta, delle armature molto leggere, e poche armi, i due si mettono in cammino nel lungo percorso che li porterà alla capitale.. o alla morte..

 

 

Scheda Valerio        

NSXmlParser il default XmlParser di iOS

Per chi lavora da molto con la programmazione, sia Java che .Net, avere a disposizione un Dom per la lettura dei files xml tramite un documento a grafo e magari espressioni xpath, è oramai legge.

Eppure per lavorare su IPhone tramite iOS e in generale su Mac OSX, di default troviamo solo ed esclusivamente un SaxParser, l’NSXmlParser..

Superato l’impatto delle Sax (da sempre ostiche ma sicuramente molto performanti), facciamo un velocissimo esempio di come usarle in una nostra classe, per leggere velocemente dei dati da un file xml.

Innanzitutto aggiungiamo l’interfaccia  NSXMLParserDelegate alla classe che riceverà gli eventi Sax, perche le Sax lavorano completamente ad eventi. Quando verrà lanciato il parser, scatteranno eventi ogni volta che si verificherà una condizione (aperto nodo, presenza testo, chiuso nodo, etc etc etc )

1
@interface MiaClasse : NSObject <NSXMLParserDelegate>

 

in questa classe (che può essere una qualsiasi classe del nostro progetto, dichiariamo l’xml parser nell’header , l’elemento che conterrà l’array di dati che andiamo ad estrarre, i puntatori per i singoli valori (on the fly come variabili secche, ma in genere meglio definire un oggetto Item che esponga tutti gli attributi), il puntatore all’elemento xml corrente che il parser sta analizzando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@interface MiaClasse : NSObject <NSXMLParserDelegate>

//parser

NSXMLParser *xmlParser;

//array che conterrà i dati

NSMutableArray *elencoItems;

//variabile temporanea per ogni elemento

NSMutableDictionary *item;// nome del nodo corrente che il sax parser sta analizzando

NSString *currentElement;

//elementi che leggeremo e poi memorizzeremo

NSMutableString *nome, *cognome, *indirizzo;

ora che abbiamo definito l’header, passiamo all’implementazione.

Inizializziamo il parser e l’array di dati nel metodo in cui lo andiamo ad usare, nel costruttore o dove vogliamo.

In questo caso andiamo a leggere il file xml da risorsa locale, ma possiamo accedere tranquillamente ad un file remoto .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)applicationDidFinishLaunching:(UIApplication *)application {

elencoItems= [[NSMutableArray alloc] init];

xmlParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.xml"]  ]];

//definiamo il delegato che riceverà gli eventi (in questo caso la classe stessa

[xmlParser setDelegate:self];

//saltiamo i problemi di namespace

[xmlParser setShouldProcessNamespaces:NO];

[xmlParser setShouldReportNamespacePrefixes:NO];

[xmlParser setShouldResolveExternalEntities:NO];

// avviamo il parsing XML

[xmlParser parse];

}

 

ora definiamo i metodi essenziali per soddisfare l’interfaccia NSXMLParserDelegate:

didStartElement , che viene eseguito ad ogni inizio di elemento xml trovato

didEndElement, che viene eseguito quando viene analizzata la chiusura di un tag xml

foundCharacters, che viene eseguito quando si analizza il contenuto di tipo “text” di un elemento

parserDidEndDocument, che scatta quando si raggiunge la fine del documento xml.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

currentElement = [elementName copy];

//qui mettiamo tutte le regole di match del nostro xml, ad esempio cosa fare quando

// si incontra un nodo denominato "persona"

if ([elementName isEqualToString:@"persona"]) {

// inizializza tutti gli elementi che conterranno i dati. memorizzeremo ogni item come tabella per praticità

item = [[NSMutableDictionary alloc] init];

nome = [[NSMutableString alloc] init];

cognome = [[NSMutableString alloc] init];

indirizzo = [[NSMutableString alloc] init];

}

}

 

Nel metodo didEndElement andremo fisicamente a prendere i dati letti e a memorizzarli in una struttura (il nostro array)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

if ([elementName isEqualToString:@"persona"]) {

[item setObject:nome forKey:@"nome"];

[item setObject:cognome forKey:@"cognome"];

[item setObject:indirizzo forKey:@"indirizzo"];

[elencoItems addObject:[item copy]];

}

}

 

Ed ora il metodo che fisicamente legge i dati dai nodi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if ([currentElement isEqualToString:@"nome"]){

[nome appendString:string];

} else if ([currentElement isEqualToString:@"cognome"]) {

[cognome appendString:string];

} else if ([currentElement isEqualToString:@"indirizzo"]) {

[indirizzo appendString:string];

} }

 

Infine se a termine del traversing del grafo xml dobbiamo effettuare delle operazioni, come prendere il risultato e passarlo ad altri oggetti, utilizziamo il parserDidEndDocument:

1
2
3
4
5
6
7
- (void)parserDidEndDocument:(NSXMLParser *)parser {

[mioOggetti setData:elencoItems];

[elencoItems release];

}

In linea di massima e’ molto semplice utilizzare XmlParser.

Come tutti i framework e metodologie su iOS si fa un grande uso dei delegati.

Spero di esservi stato di aiuto.