Prima demo di Save the Astronaut

Questo è il mio primo “vero” videogioco. Ne ho già fatti altri in realtà, Slidespace e HolyTrivia, ma questo è molto più strutturato e più complesso.

Poi è realizzato con cocos2d e questo mi ha permesso di concentrarmi sul gioco vero e proprio.

Di lavoro ce né ancora tantissimo, ma già mi reputo soddisfatto ad essere riuscito a fare tutto questo.
Per la precisione devo realizzare tutti i livelli (e inventarmi un po’ di dinamiche differenti), creare le animazioni di morte, vincita e quanto altro, aggiungere suoni e musica e aggiungere la leaderboard. Insomma, tanto da fare.

Godetevi il video e ditemi cosa ne pensate.

Presto nuovi aggiornamenti.

Sviluppare un ponte in un videogioco

Come sapete, mi sono buttato nel mondo dei videogames, dello sviluppo di videogames. Per adesso sto studiando molto e provando molte cose. Mi sono iscritto al corso di MakeGameWithUs (make school) ed ho imparato ancora di più ad usare Cocos2D e SpriteBuilder.

Ma di strada c’è né ancora tanta.

Ho messo in pausa lo sviluppo del primo gioco che volevo studiare per dedicarmi a qualcosa di più semplice e per imparare più cose grazie a questo corso. Quindi ho iniziato a sviluppare Save the Astronaut! un semplicissimo gioco dove il giocatore deve portare in salvo un astronauta percorrendo un percorso pieno di ostacoli e piccoli indovinelli logici (ma proprio semplicissimi).

Una delle cose che mi piaceva introdurre era la possibilità di avere dei “ponti” che l’utente deve sorpassare, quindi degli incroci dove la strada è una sopra l’altra ed ovviamente i bordi sono confinanti. Senza un sistema ben studiato, il giocatore si ritroverebbe davanti un quadrato di pareti che non può sorpassare, oppure un incrocio di strade con la libertà di andare ovunque. (spero di essermi spiegato)

Quindi ho creato un sistema di semafori dove l’utente, in base alla strada che sta facendo, apre o chiude i ponti che permettono di passare o meno da una strada.

Per far capire meglio ho fatto un video, buona visione! :)

Ed ecco il tutto finito :)

CocosViewController – How to use Storyboards and Cocos2d V3+

I will write this tutorial in English, so, sorry for the language errors ;)

Some weeks ago I wrote a simple class for Cocos2D v3+ to use Cocos2D and Storyboards called CocosViewController.

CocosViewController is a UIViewController subclass that create CCDirector and put it in the controller view.

So, with this class we can have a Cocos2D view controller inside a Storyboard environment but we can also add UIKit elements above the Cocos2D view.

So, start this little tutorial.

How to use CocosViewController.

Create a new project (or use an existing one, but I recommend you to start with a new one to become familiar with the class) with SpriteBuilder, you can use the latest 1.2 version with Cocos2D v3.2.

cvc_1

Remove AppDelegate class and replace with the one in the CocosViewController project. Then copy CocosViewController.h/mm files in your project directory and add it in the xcode project.


cvc_2

cvc_3

Now locate the file named main.mm and rename the @”AppController” string with @”AppDelegate”.
Note: you can also rename the AppDelegate class, but for this tutorial this is the fast way.

cvc_4

Now add a new Storyboard to the project, disable Autolayout and update the project to use iOS 6.0+ and the storyboards.

cvc_5 cvc_6

At this point you can create a new Class called SceneViewController as subclass of CocosViewController.
Add the following lines to the controller class.

@interface SceneViewController() <CocosViewControllerDelegate>
@end

@implementation SceneViewController

– (void)viewDidLoad
{
[super viewDidLoad];

self.delegate = self;
}

– (IBAction)dismiss:(id)sender
{
[self removeDirector];

[self.navigationController popViewControllerAnimated:YES];
}

#pragma mark CocosViewControllerDelegate

– (CCScene *)cocosViewControllerSceneToRun:(CocosViewController *)cocosViewController
{
return [CCBReader loadAsScene:@”MainScene”];
}

@end

You can watch at the screenshot.

cvc_7

Now go to the storyboard. Add a navigation controller, a menu view controller with a button and add the SceneViewController.
Link the navigation controller to the menu controller and the menu button to the SceneViewController with a push segue.
Now you only need to create an exit button in the SceneViewController and link to the -dismiss: method of the same controller.

cvc_8

Build and Run. If you followed all the steps you have now Cocos2D inside of a Storyboard app.

I hope you enjoy it and if you have some problems you can write here in the comments or in the Cocos2D forum post.

XCode e le traduzioni

In questi giorni ho avuto l’opportunità di lavorare con XCode 5 e mi sono accorto che ha una nuova gestione delle Storyboards e in particolare divide in automatico il file per essere tradotto.

Quindi crea una versione “Base” e poi lo sviluppatore può decidere se e come tradurlo.
In particolare si può decidere se utilizzare, per le traduzioni, un file Storyboard o un file Strings.
L’unico neo è che quando si modifica il file “Base”, gli altri file non vengono aggiornati. Una grande scocciatura se dobbiamo fare delle modifiche.

Cercando in giro ho trovato uno sviluppatore che ha creato uno script Python che si occupa di ricreare i file Storyboards aggiornati. Qui potete vedere un video di spiegazione. Mentre qui invece potete scaricare lo script.

Ora, il problema è che su XCode 5 non sembra funzionare in modo corretto. In particolare non si aggiornano i file Storyboards ma solo i file Strings.

Se qualcuno trova una soluzione, fatemi sapere!

Cocoa Tip & Tricks – Memory Management e Notifications

Mi piacerebbe fare una sezione sui trucchetti e i migliori modi di scrivere il codice ma so già che non ce la farò.. però.. intanto inizio!

Memory Management

Ogni volta che si alloca un’istanza di un oggetto si deve rilasciare. Sempre. Ad esempio:

UIView* aView = [[UIView alloc] initWithFrame:CGRectZero];
[self.view addSubview:aView];

dopo è necessario rilasciarlo:

[aView release];
aView = nil;

Ma è importante anche assegnare il puntatore a ‘nil‘, altrimenti c’è la probabilità che punti ad una zona errata della memoria causando dei crash.

Notifications

Le notifiche sono davvero una manna e NSNotificationCenter è davvero ottimo, però bisogna ricordarsi di cancellarsi dalle notifiche, altrimenti si rischia di incappare in crash.

Quando ci registriamo quindi ad una notifica, ad esempio:

[[NSNotificationCenter defaultCenter] addObserver:observer selector:@selector(selectorDidHandle:) name:kNotificationKey object:self];

ricordiamoci anche di rimuoverci da tale notifica. In primis, quando non ci serve più, quindi ad esempio all’interno del metodo di handle:

- (void)selectorDidHandle:(NSNotification*)notification
{
   if (notification)
   {
      [[NSNotificationCenter defaultCenter] removeObserver:self name:notification.name object:notification.object];
   }
}

mi raccomando di controllare se ‘notification‘ esiste, perché se fosse ‘nil‘ allora vi rimuovereste da qualsiasi notifica perché inviereste tutti i messaggi ‘nil’ al metodo -removeObserver:name:object: e non è questo che vogliamo.

Come seconda cosa, quando si dealloca l’oggetto che si è registrato ad una qualche notifica, ricordatevi di cancellarvici.

- (void)dealloc
{
   [[NSNotificationCenter defaultCenter] removeObserver:self];

   [super dealloc];
}

Ecco, questi sono i primi tricks che ho voluto condividere con voi.. spero di avere tempo e voglia per dirvene altri..

Buona programmazione!