{"id":9146,"date":"2012-06-29T14:30:50","date_gmt":"2012-06-29T12:30:50","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=9146"},"modified":"2016-06-07T15:30:54","modified_gmt":"2016-06-07T13:30:54","slug":"01-introduzione-a-cocos2d-installazione-e-primo-progetto","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/01-introduzione-a-cocos2d-installazione-e-primo-progetto\/","title":{"rendered":"01. Introduzione a cocos2d, installazione e primo progetto"},"content":{"rendered":"<p>Avete quindi deciso di imparare a creare giochi per iPhone e iPad, bene! Vi attende un po&#8217; di studio, ma anche tanto tanto divertimento.<\/p>\n<p>Lo sviluppo di un videogioco richiede tante competenze diverse: servono dei disegnatori, degli esperti di audio e dei creatori di contenuti; oltre che, ovviamente, dei bravi programmatori. Al programmatore sono richieste competenze non indifferenti perch\u00e9 se si vuol realizzare un videogioco da zero bisogna muoversi agevolmente con OpenGL ES e con tutti i framework di basso livello relativi al multimedia come OpenAL. Lavorare con queste tecnologie non \u00e8 semplicissimo, ma <em>fortunatamente<\/em> (il corsivo \u00e8 d&#8217;obbligo perch\u00e9 non si tratta di fortuna, il tutto \u00e8 reso possibile da gente che ci lavora tutti i giorni) esistono alcuni framework che fanno per noi il lavoro pi\u00f9 duro e ci permettono di creare videogiochi con semplicit\u00e0 e senza necessariamente conoscere OpenGL ES o avere a che fare con complicati calcoli di fisica.<!--more--><\/p>\n<p>In queste lezioni tratteremo Cocos2d, pi\u00f9 precisamente la sua versione per il sistema operativo iOS che si chiama <strong>cocos2d for iPhone<\/strong>. Si tratta di un <strong>framework open source per la creazione di videogiochi<\/strong> che comprende una lunga serie di strumenti che vanno dalla gestione delle scene, dei men\u00f9, delle transazioni, la gestione dell&#8217;audio e molto altro ancora.<\/p>\n<p>Il progetto non \u00e8 nato per\u00f2 per questa piattaforma, nasce infatti per python, ma ha conosciuto il successo proprio grazie alla diffuzione dei device Apple.<\/p>\n<p>Attualmente esistono porting di cocos2d anche per atri linguaggi come Ruby e Java (Android).<br \/>\nTra i numerosi vantaggi presenti nell&#8217;utilizzare un framework come cocos2d va sottolineato che il suo sorgente, lavorando con OpenGL ES, viene eseguito dalla GPU e questo \u00e8 molto importante perch\u00e9 lascia la CPU libera di fare altro mentre tutto il carico di lavoro derivante dalle animazioni viene asseganto alla scheda grafica.<\/p>\n<p>Il progetto ha il suo sito ufficiale: <a href=\"http:\/\/www.cocos2d-iphone.org\/\" target=\"_blank\">http:\/\/www.cocos2d-iphone.org\/<\/a> dove potete trovare una folta community di sviluppatori, tante guide <a href=\"http:\/\/www.cocos2d-iphone.org\/wiki\/doku.php\/\" target=\"_blank\">http:\/\/www.cocos2d-iphone.org\/wiki\/doku.php\/<\/a> e un&#8217;elenco delle applicazioni realizzate con questo framework <a href=\"http:\/\/www.cocos2d-iphone.org\/games\" target=\"_blank\">http:\/\/www.cocos2d-iphone.org\/games<\/a>.<\/p>\n<p>Alcuni giochi elencati, diciamolo francamente, farebbero venire voglia di abbandonare lo studio, ma ci sono anche tanti capolavori come il recente &#8220;The Numberlys&#8221; (<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&amp;a=1735897&amp;g=0&amp;url=http:\/\/itunes.apple.com\/it\/app\/numberlys\/id491546935?mt=8&amp;partnerId=2003\" target=\"_blank\">App Store<\/a>) oppure Zombie Smash (<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&amp;a=1735897&amp;g=0&amp;url=http:\/\/itunes.apple.com\/it\/app\/zombiesmash\/id349095099?mt=8&amp;partnerId=2003\" target=\"_blank\">App Store<\/a>) che sono state rispettivamente &#8220;app of the week&#8221; e &#8220;top paid app&#8221;.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&amp;a=1735897&amp;g=0&amp;url=http:\/\/itunes.apple.com\/it\/app\/numberlys\/id491546935?mt=8&amp;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9157\" title=\"01-introduzione-cocos2d-installazione-primo-progetto-01\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-01.jpg\" alt=\"01-introduzione-cocos2d-installazione-primo-progetto-01\" width=\"440\" height=\"440\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-01.jpg 440w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-01-150x150.jpg 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-01-300x300.jpg 300w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/a><\/center><center><br \/>\n<a href=\"http:\/\/clk.tradedoubler.com\/click?p=24373&amp;a=1735897&amp;g=0&amp;url=http:\/\/itunes.apple.com\/it\/app\/zombiesmash\/id349095099?mt=8&amp;partnerId=2003\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9158\" title=\"01-introduzione-cocos2d-installazione-primo-progetto-02\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-02.jpg\" alt=\"01-introduzione-cocos2d-installazione-primo-progetto-02\" width=\"550\" height=\"367\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-02.jpg 642w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-02-300x200.jpg 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/center><\/p>\n<h4>Installazione<\/h4>\n<p>Potete trovare l&#8217;ultima release del framework sul sito ufficiale del progetto <a href=\"http:\/\/www.cocos2d-iphone.org\/\" target=\"_blank\">http:\/\/www.cocos2d-iphone.org\/<\/a> nella sezione relativa ai Download. Il consiglio \u00e8 come sempre quello di utlizzare la versoine definita &#8220;stable&#8221; lasciando le versioni unstable solo agli utenti pi\u00f9 esperti che hanno voglia di provare delle nuove caratteristiche.<\/p>\n<p>Al momento in cui scrivo la release stabile \u00e8 la 1.0.1. Scarichiamo il file <a href=\"http:\/\/cocos2d-iphone.googlecode.com\/files\/cocos2d-iphone-1.0.1.tar.gz\" target=\"_blank\">cocos2d-iphone-1.0.1.tar.gz<\/a> in una cartella del nostro sistema operativo e scopattiamolo con un semplice doppio click, verr\u00e0 creata la cartella cocos2d-iphone-1.0.1<\/p>\n<p>Se avete voglia di vedere come pu\u00f2 essere gestito un progetto complesso come cocos2d aprite il file cocos2d.xcworkspace, ma attenti a non modificare nulla! Il progetto Cocos2d-ios ha ben 67 targets, molti dei quali sono test (ricordate il nostro articolo su <a href=\"http:\/\/www.devapp.it\/wordpress\/uno-sguardo-a-unit-test-impariamo-a-prevenire-ore-e-ore-di-debug-durante-lo-sviluppo-di-applicazioni-ios.html\" target=\"_blank\">Unit-test<\/a>, vero?). Assicuratevi di non aver modificato nulla e chiudete il progetto, passeremo adesso all&#8217;installazione.<\/p>\n<p>Molti framework vengono distribuiti semplicemente come un insieme di file .h e .m da trascinare all&#8217;interno dei nostri progetti, ma vista la particolarit\u00e0 di questo framework viene fornito un programma che permette di aggiungere tre nuovi template ad XCode.<br \/>\nIl programma si chiama install-templates.sh ed \u00e8 uno script bash. Per eseguirlo non dovete cliccarci sopra, ma bisogna eseguirlo da riga di comando.<\/p>\n<p>Mi auguro che tutti i lettori di questo corso sappiano che cosa sia la riga di comando, perch\u00e9 non si pu\u00f2 realmente dire di conoscere un sistema operativo se non si \u00e8 in grado di usarlo esclusivamente attraverso questo sistema. Estremismi a parte avviamo l&#8217;applicazione &#8220;terminale&#8221; e spostiamoci all&#8217;interno della cartella cocos2d-iphone-1.0.1. Per verificare in quale cartella ci si trova basta digitare il comando &#8220;pwd&#8221;, mentre per spostarsi nella cartella &#8220;prova&#8221; il comando da digitare \u00e8 &#8220;cd prova&#8221;.<br \/>\nQuando siamo all&#8217;interno della cartella giusta assicuriamoci che xcode non sia aperto e digitiamo<\/p>\n<pre>sudo .\/install-templates.sh\r\n<\/pre>\n<p>(occhio al punto prima dello slash)<\/p>\n<p>Quando la procedura sar\u00e0 terminata possiamo aprire XCode e, se tutto \u00e8 andato a buon fine, vedremo una nuova sezione con tre nuovi template:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-03.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9159\" title=\"01-introduzione-cocos2d-installazione-primo-progetto-03\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-03.png\" alt=\"01-introduzione-cocos2d-installazione-primo-progetto-03\" width=\"550\" height=\"371\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-03.png 730w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-03-300x202.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/center>Il primo ci permetter\u00e0 di creare un progetto base che utilizza cocos2d, il secondo oltre ad usare cocos utilizza anche il <strong>motore di simulazione fisica box2d<\/strong>. Il terzo \u00e8 simile al secondo, ma al posto di utilizzare box2d utilizza <strong>chipmunk<\/strong>. Vedremo qualche differenza sui due framework pi\u00f9 avanti nel corso.<\/p>\n<h4>Hello world<\/h4>\n<p>Creiamo adesso il primo progetto con cocos2d: il classico &#8220;hello world&#8221;.<br \/>\nAvviamo XCode, scegliamo di creare un nuovo progetto e selezioniamo la categoria &#8220;cocos2d&#8221;. In questo momento non ci servir\u00e0 nessun motore fisico quindi scegliamo il template &#8220;cocos2d&#8221;.<br \/>\nDiamo un nome al progetto e salviamolo in una cartella sul nostro disco.<br \/>\nLa creazione del progetto termina qui, infatti possiamo gi\u00e0 eseguire il progetto sul simulatore<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-04.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9160\" title=\"01-introduzione-cocos2d-installazione-primo-progetto-04\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-04.png\" alt=\"01-introduzione-cocos2d-installazione-primo-progetto-04\" width=\"543\" height=\"110\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-04.png 543w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-04-300x60.png 300w\" sizes=\"auto, (max-width: 543px) 100vw, 543px\" \/><\/a><\/center>per verificare che tutto funzioni.<br \/>\nUna volta in esecuzione il progetto mostra questa interfaccia:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-05.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9161\" title=\"01-introduzione-cocos2d-installazione-primo-progetto-05\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-05.png\" alt=\"01-introduzione-cocos2d-installazione-primo-progetto-05\" width=\"550\" height=\"293\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-05.png 744w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/01-introduzione-cocos2d-installazione-primo-progetto-05-300x159.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/center>Il numero visibile nell&#8217;angolo in basso a sinistra indica il framerate corrente, cio\u00e8 il numero di frame visibili in un secondo. Chiaramente i frame non sono divisibili quindi quel valore non deve essere considerato come &#8220;59 frame e 7 decimi di frame&#8221; ma piuttosto &#8220;il frame \u00e8 rimasto visibile per 1 \/ 59.7 secondi&#8221;.<\/p>\n<p>Ci si potrebbe chiedere come mai il framerate non sia stabile su 60 considerata la semplicit\u00e0 dell&#8217;interfaccia del &#8220;gioco&#8221;; una risposta esaustiva richiederebbe un&#8217;approfondimento non banale sui sistemi operativi, qui possiamo dire che il framerate oscilla perch\u00e9 il sistema operativo iOS non \u00e8 un sistema operativo realtime e l&#8217;esecuzione dei processi \u00e8 demandata ad un componente chiamato &#8220;schedulatore&#8221;. Lo schedulatore interrompe ciclicamente l&#8217;esecuzione del nostro processo per eseguire tutti gli altri processi del sistema operativo e queste interruzioni durano per un tempo brevissimo ma non prevedibile. Per questo motivo alcuni frame possono impiegare pi\u00f9 tempo di altri ad essere aggiornati portando il framerate ad un valore leggermente pi\u00f9 basso di quanto fissato. Ma non vi illudete, se nel vostro gioco il framerate scende a 15 fps non date la colpa allo schedulatore \ud83d\ude09 quella \u00e8 solo colpa della complessit\u00e0 del vostro gioco!<\/p>\n<p>Non impostate mai valori pi\u00f9 alti di 60 perch\u00e9 sarebbe inutile, lo schermo dell&#8217;iphone ha una frequenza di aggiornamento fissata a 60Hz quindi non sarebbero visibili aggiornamenti con una maggiore frequenza. Inoltre in alcuni casi pu\u00f2 essere pi\u00f9 utile mantenere un framerate pi\u00f9 basso, ma costante, piuttosto che uno altalenante.<\/p>\n<h4>Hello world in dettaglio<\/h4>\n<p>Non possiamo per\u00f2 concludere in questo modo il nostro approccio con il primo progetto cocos2d, vogliamo infatti vedere nel dettaglio com&#8217;\u00e8 fatto questo template e come funziona.<br \/>\nSe diamo un&#8217;occhiata all&#8217;elenco delle risorse che sono state create vediamo davvero un gran numero di framework e di librerie importate, \u00e8 stato proprio un bene avere un template, non credete?<\/p>\n<p>Lasciamo l\u00ec le librerie e diamo uno sguardo all&#8217;elenco dei file:<\/p>\n<ul>\n<li><strong>AppDelegate.h \/.m<\/strong> Questo \u00e8 l&#8217;app delegate dell&#8217;applicazione, non dimentichiamo che anche se stiamo usando cocos2d un&#8217;applicazione iPhone \u00e8 sempre un&#8217;applicazione iPhone quindi necessita dell&#8217;AppDelegate. I metodi di questa classe sono gli stessi delle applicazioni standard, ma la loro implementazione \u00e8 particolare quindi la vedremo in dettaglio.<\/li>\n<li><strong>RootViewController.h \/.m<\/strong> Questo \u00e8 il principale (nonch\u00e9 unico) viewcontroller presente in tutta l&#8217;applicazione. Le diverse schermate del gioco non vengono gestite con pi\u00f9 viewcontrollers ma con le scene quindi anche in progetti pi\u00f9 grossi non sar\u00e0 necessario avere altri viewcontrollers. In questo viewcontroller \u00e8 stato fatto l&#8217;override dei metodi che si occupano della rotazione dello schermo. La rotazione dello schermo \u00e8 un processo piuttosto oneroso in termini di risorse quindi sono state pensate pi\u00f9 possibilit\u00e0: nessuna rotazione per i device vecchi, rotazione gestita dal viewcontroller e rotazione gestita dal Director (ancora non sappiamo cos&#8217;\u00e8). Di default troverete le impostazioni per far eseguire la rotazione al viewcontroller, che \u00e8 un&#8217;ottima impostazione per device di ultima generazione. Suggerisco di lasciare questa impostazione per il momento.<\/li>\n<li><strong>HelloWorldLayer.h \/.m<\/strong> Il primo layer del nostro gioco. Parleremo pi\u00f9 avanti dei layer e della loro creazione, ma potete immaginarli come i livelli di photoshop, sono delle aree trasparendi su cui disegnare gli elementi del nostro gioco. Una volta sovrapposti visualizzeranno il gioco nella sua interezza.<\/li>\n<li><strong>GameConfig.h<\/strong> si tratta di un file di intestazione (non \u00e8 presente il .m) dove sono dichiarate molte costanti per la configurazione del gioco.<\/li>\n<\/ul>\n<h4>Il ciclo di vita<\/h4>\n<p>Esaminando il progetto d&#8217;esempio possiamo notare che per quando riguarda il file main.m non ci sono modifiche rispetto ad un&#8217;applicazione standard. Possiamo per\u00f2 notare che non \u00e8 presente il supporto ARC.<br \/>\nLa &#8220;magia&#8221; avviene invece all&#8217;interno del metodo dell&#8217;AppDelegate applicationDidFinishLaunching:<br \/>\nguardiamolo quindi in dettaglio:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">- (void) applicationDidFinishLaunching:(UIApplication*)application\r\n{\r\nwindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; \/\/1\r\n        \r\nif( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] ) \/\/2\r\n                [CCDirector setDirectorType:kCCDirectorTypeDefault];\r\nCCDirector *director = [CCDirector sharedDirector]; \/\/3\r\nviewController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; \/\/4\r\nviewController.wantsFullScreenLayout = YES;\r\n        \r\nEAGLView *glView = [EAGLView viewWithFrame:[window bounds]  \r\npixelFormat:kEAGLColorFormatRGB565\r\ndepthFormat:0\r\n];  \/\/5\r\n        \r\n[director setOpenGLView:glView]; \/\/6\r\n        \r\n[director setDeviceOrientation:kCCDeviceOrientationPortrait]; \/\/7\r\n[director setAnimationInterval:1.0\/60]; \/\/8\r\n[director setDisplayFPS:YES]; \/\/9\r\n        \r\n        \r\n[viewController setView:glView]; \/\/10\r\n        \r\n[window addSubview: viewController.view]; \/\/11\r\n        \r\n[window makeKeyAndVisible]; \/\/12\r\n        \r\n[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888]; \/\/13\r\n[self removeStartupFlicker]; \/\/14\r\n[[CCDirector sharedDirector] runWithScene: [HelloWorldLayer scene]]; \/\/15\r\n}\r\n<\/pre>\n<p># 1 Il metodo inizia come di consueto allocando un oggetto UIWindow che costituir\u00e0 la window principale dell&#8217;applicazione.<br \/>\n# 2 Verifica se \u00e8 possibile utilizzare le API CADDisplayLink (<a href=\"http:\/\/developer.apple.com\/library\/ios\/#documentation\/QuartzCore\/Reference\/CADisplayLink_ClassRef\/Reference\/Reference.html\" target=\"_blank\">Apple CADisplayLink Class Reference<\/a>) disponibile solo da iOS 3.1 in poi.<br \/>\n# 3 Instanzia un oggetto singleton della classe CCDirector. Questa classe, come un vero e proprio regista si occupa di gestire il passaggio tra le varie scene del gioco.<br \/>\n# 4 Inizializza il viewcontroller principale.<br \/>\n# 5 Crea una EAGLView: un oggetto utilizzato da cocos2d per visualizzare oggetti OpenGL.<br \/>\n# 6 Comunica al director qual \u00e8 la EAGLView da utilizzare.<br \/>\n# 7 Qui ho rimosso la parte di codice che non verrebbe compilata con le opzioni di default, comunichiamo al director l&#8217;orientamento del device.<br \/>\n# 8 Impostiamo il framerate desiderato.<br \/>\n# 9 Scegliamo di visualizzare il valore corrente dell&#8217;FPS, utilissimo in fase di testing mostra infatti il numero in basso a sinistra che abbiamo visto nella foto precedente.<br \/>\n# 10 &#8211; 11 &#8211; 12 Operazioni comuni con la window e con il viewcontroller.<br \/>\n# 13 Settiamo il valore delle texture da utilizzare.<br \/>\n# 14 Elimina il flick se l&#8217;applicazione deve avviarsi solo in landscape. Viceversa avremmo inizialmente una visione in portait che viene subito cambiata da una in landscape.<br \/>\n# 15 Comunichiamo al director di visualizzare la scena della classe HelloWorldLayer, scena che viene richiamata tramite il metodo di classe scene.<\/p>\n<h4>Conclusioni<\/h4>\n<p>In questa lezione abbiamo imparato dove ottenere l&#8217;utlima versione di cocos2d e dove ricevere supporto. Abbiamo visto qualche esempio di applicazione realizzata con questo framework e infine abbiamo creato il primo progetto &#8220;hello world&#8221; analizzandolo in dettaglio.<br \/>\nVedremo nella prossima lezione come apportare le prime modifiche al progetto per visualizzare ed animare i primi oggetti del gioco.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Avete quindi deciso di imparare a creare giochi per iPhone e iPad, bene! Vi attende un po&#8217;&#8230;<\/p>\n","protected":false},"author":53,"featured_media":9150,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1119],"tags":[1131,1130,1132,1121,1135,1133,1134,1136],"class_list":["post-9146","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-corso-programmazione-videogiochi","tag-box2d","tag-chipmunk","tag-cocos2s","tag-corso-cocos2d","tag-installare-cocos2d","tag-programmare-videogiochi","tag-programmazione-videogame","tag-usare-cocos2d"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=9146"}],"version-history":[{"count":19,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9146\/revisions"}],"predecessor-version":[{"id":12122,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9146\/revisions\/12122"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/9150"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=9146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=9146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=9146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}