{"id":9070,"date":"2012-06-22T12:06:36","date_gmt":"2012-06-22T10:06:36","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=9070"},"modified":"2012-06-26T11:25:28","modified_gmt":"2012-06-26T09:25:28","slug":"00-introduzione-corso-di-programmazione-videogame-con-cocos2d","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/00-introduzione-corso-di-programmazione-videogame-con-cocos2d\/","title":{"rendered":"00. Introduzione | Corso di programmazione videogame con cocos2d"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione.jpg\" alt=\"corso-programmazione-videogame-cocos2d-00-introduzione\" title=\"corso-programmazione-videogame-cocos2d-00-introduzione\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-9078\" \/><\/a> Squillino le trombe e rullino i tamburi! Mettete da parte i social network, dite addio a tumblr e 9gag perch\u00e9 sta per iniziare, qui su devAPP in esclusiva solo per voi un <strong>corso sulla realizzazione di videogiochi per iPhone e iPad<\/strong>.<\/p>\n<p>Su questa board abbiamo pubblicato centinaia di tutorial, di guide e di articoli tecnici, ma per questo argomento abbiamo pensato che non fosse di il caso di dare un semplice &#8220;assaggio&#8221; ma di seguire la strada gi\u00e0 percorsa con il corso di programmazione C e fornire un vero  e proprio corso completo, articolato in &#8220;diverse&#8221; lezioni (il numero reale \u00e8 attualmente sconosciuto persino all&#8217;autore) che partano dalle basi e vi guidino fino alla creazine del vostro videogioco di successo da vendere sull&#8217;App store.<!--more--><\/p>\n<h4>Prerequisiti<\/h4>\n<p>Quali saranno i prerequisiti di questo corso? Pochi: non dovrete essere dei guru su iOS, basta che abbiate per\u00f2 familiarit\u00e0 con il linguaggio Objective-C, perch\u00e9 lo useremo parecchio! Vi aiuter\u00e0 inoltre avere delle competenze in ambito di OOP (Object Oriented Programming) perch\u00e9 ormai, come avrete intuito, competenze simili oggi servono anche per andare dal panettiere&#8230; e poi cos&#8217;altro? Ah, certo! Vi servir\u00e0 voglia di giocare con i videogiochi, perch\u00e9 dovrete pur testare il vostro lavoro, no? Cos\u00ec se vostra moglie o vostra madre vi rimprovera di passare troppo tempo davanti ai videogiochi, potrete sempre risponderle che state studiando! \ud83d\ude42<\/p>\n<h4>Introduzione al corso<\/h4>\n<p>Anche se questo corso sar\u00e0 incentrato su <strong>Cocos2d<\/strong> vorrei fare un passo indietro e parlare, oggi, di che cosa significa programmare un videogioco e quali sono le differenze rispetto alla programmazione di un&#8217;applicazione classica.<\/p>\n<p>Tutti conosciamo la struttura di un&#8217;applicazione classica dotata di interfaccia grafica, l&#8217;applicazione si avvia ed entra in quello che viene chiamato in gergo &#8220;main loop&#8221; cio\u00e8 un ciclo in cui l&#8217;applicazione verifica se ci sono stati input da parte dell&#8217;utente ed in tal caso esegue il codice relativo ed aggiorna l&#8217;interfaccia grafica:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione-01.png\" alt=\"corso-programmazione-videogame-cocos2d-00-introduzione-01\" title=\"corso-programmazione-videogame-cocos2d-00-introduzione-01\" width=\"317\" height=\"230\" class=\"aligncenter size-full wp-image-9081\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione-01.png 317w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/06\/corso-programmazione-videogame-cocos2d-00-introduzione-01-300x217.png 300w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Un videogioco non \u00e8 diverso da questo punto di vista, c&#8217;\u00e8 per\u00f2 una piccola ma significativa differenza: <\/p>\n<p>nelle applicazioni standard la fase di rendering non avviene se non c&#8217;\u00e8 stato un evento, mentre nella programmazione dei videogiochi il rendering \u00e8 fissato con un certo intervallo di tempo ed avviene comunque: indipendentemente dagli eventi ricevuti. <\/p>\n<p>Pu\u00f2 accadere che una fase di update piuttosto lunga rallenti la frequenza di rendering e questo \u00e8 quello che succede quando in molti videogiochi, nei momenti pi\u00f9 impegnativi, il gioco inizia ad andare &#8220;a scatti&#8221;. Questo significa che la fase di update \u00e8 durata pi\u00f9 del previsto (magari perch\u00e9 ci sono molti nemici nello schermo o particolari effetti) e quindi diventa visibile ad occhio nudo l&#8217;intervallo di tempo tra un rendering ed il successivo.<\/p>\n<p>Per avere un&#8217;idea di massima il tempo di rendering di default di cocos2d \u00e8 di 0,017 secondi ovvero 1\/60 di secondo ed otteniamo quindi una frequenza di aggiornamento pari a 60 frame per secondo (fps). Considerando che lo standard televisivo \u00e8 fissato a 25 fps pu\u00f2 sembrare inutile o addirittura dannoso averlo fissato a 60 fps, ma in realt\u00e0 non \u00e8 cos\u00ec perch\u00e9 25fps significa un aggiornamento ogni 0.04 secondi che potrebbe, in certi casi, far percepire un certo &#8220;ritardo&#8221; tra i controlli e la risposa del gioco.<\/p>\n<p>Il framerate minimo accetabile dipende ovviamente dal tipo di gioco che volete realizzare, se voleste riproporre una versione iPad di Unreal Tournament 3, allora preparatevi a sentirvi dire che \u00e8 ingiocabile se scende al di sotto dei 40 fps, se invece state realizzando un gioco di scacchi a tutti sembrer\u00e0 perfetto anche a 10fps.<\/p>\n<p>Indipendentemente dal tipo di gioco che state pianificando, non penso di peccare di generalit\u00e0 se dico che il gioco sar\u00e0 composto da alcune scene, che su queste scene ci saranno degli oggetti che interagiscono tra di loro e con l&#8217;utente rispondendo agli eventi in maniera diversa, a seconda dello stato in cui si trovano e lo stato generale del gioco. Ci sar\u00e0 probabilmente da gestire dei suoni, delle risorse grafiche come immagini e video e ci saranno da gestire dei dati per il salvataggio dello stato di gioco e delle classifiche.<\/p>\n<p>Bench\u00e9 questa descrizione sia tanto generica da accogliere dentro di se praticamente qualsiasi gioco pensabile \u00e8 gi\u00e0 sufficiente per tracciare un primo schema dei blocchi che costituiscono il motore di un un videogame.<\/p>\n<h4>Game State Manager<\/h4>\n<p>Difficilmente un gioco si compone esclusivamente della schermata di gioco, ma molto pi\u00f9 probabilmente ci saranno delle altre schermate, come ad esempio un men\u00f9 iniziale, un&#8217;help, una parte delle opzioni e quello che pi\u00f9 conta \u00e8 che lo stesso input (un tap, uno swipe) deve essere gestito in maniera diversa a seconda dello stato in cui si trova l&#8217;applicazione. Simulando il comportamento di una macchina a stati finiti.<\/p>\n<p>Useremo spesso il termine &#8220;macchina a stati finiti&#8221; e forse \u00e8 il caso di spiegare brevemente di cosa si tratta. Una macchina a stati finiti o anche &#8220;automa a stati finiti&#8221; \u00e8 un modello che che pu\u00f2 trovarsi in un solo stato alla volta, che da quello stato pu\u00f2 passare ad un numero finito di stati in una transazione atomica. Inoltre a parit\u00e0 di input lo stato raggiunto dipende dallo stato in cui si trova.<br \/>\nPotremmo pensare ad un semaforo come una macchina a stati finiti: quando si trova nello stato rosso ed il vigile preme il pulsante passa allo stato verde, quando \u00e8 sullo stato verde ed il vigile preme lo stesso pulsante passa allo stato giallo e poi allo stato rosso e si ricomincia. Non c&#8217;\u00e8 verso con il pulsante di far passare da rosso a giallo e come si pu\u00f2 intuire il numero di configurazioni possibili \u00e8 finito.<\/p>\n<p>Un videogame \u00e8 paragonabile ad un automa a stati finiti perch\u00e9 da uno stato o configurazione che comprende tutto, dalla scena attualmente visibile allo stato dei personaggi nel gioco (e tanto altro) dipende in maniera diretta la risposa ad un input.<\/p>\n<p>Pu\u00f2 sembrare un ragionamento un po&#8217; strambo a prima vista, ma vi assicuro che ragionare in termini di stati aiuta il programmatore non solo nella programmazione dei videogiochi, ma anche nella realizzazione delle applicazioni standard.<\/p>\n<h4>Graphics Engine<\/h4>\n<p>Il motore grafico in un gioco \u00e8 quello che si occupa di disegnare sullo schermo quanto abbiamo richiesto.  Esisono diversi livelli di astrazione, possiamo usare cocos2d o qualche altro engine di alto livello per facilitarci il lavoro oppure, se ne abbiamo il coraggio, possiamo passare a lavorare direttamente con le <strong>OpenglES<\/strong>, che sono il modo pi\u00f9 a basso livello che abbiamo per dire alla scheda grafica di disegnare qualcosa sullo schermo.<\/p>\n<h4>Gestore degli eventi<\/h4>\n<p>\u00c8 responsabile di gestire gli eventi e di informare gli oggetti del gioco che sono interessati a quell&#8217;evento.<br \/>\nPer fare un&#8217;esempio supponiamo di aver creato un pulsante all&#8217;interno del nostro videogioco, il pulsante comunicher\u00e0 al gestore degli eventi di essere interessato ai tap sulla sua area, cos\u00ec il gestore degli eventi quanto ricever\u00e0 dal sistema operativo un evento tap lo esaminer\u00e0 e se ricade nell&#8217;area del pulsante lo avviser\u00e0 dell&#8217;accaduto. Sar\u00e0 poi il pulsante a decidere cosa fare una volta ricevuta questa informazione.<\/p>\n<h4>Sound engine<\/h4>\n<p>Ogni videogioco ha dei suoni, una colonna sonora o degli effetti speciali ed \u00e8 quindi necessario che si crei un responsabile dell&#8217;audio per concentrare compiti e responsabilit\u00e0.<\/p>\n<h4>Data Engine<\/h4>\n<p>In alcuni casi \u00e8 necessario creare anche un gestore dei dati, che si occupi di salvare su disco lo stato dell&#8217;applicazione e successivamente sia anche in grado di ricreare lo stesso stato usando le informazioni presenti sul file.<\/p>\n<h4>Conclusioni<\/h4>\n<p>Abbiamo parlato di funzionalit\u00e0 ed abbiamo detto che sono pressocch\u00e9 indipendenti dal gioco da realizzare e questo significa essenzialmente che potrebbero essere racchiuse in un framework e riutilizzate poi in tutti i progetti.<\/p>\n<p>Sarebbe bello, no?<\/p>\n<p>Vi far\u00e0 piacere allora sapere che siamo davvero molto fortunati, perch\u00e9 ci hanno gi\u00e0 pensato ed hanno anche deciso di rilasciare il tutto con licenza opensource cosicch\u00e9 possiamo utilizzare tutte queste funzionalit\u00e0 (e molte altre) senza dover scrivere migliaia di righe di codice.<br \/>\nSto chiaramente parlando di cocos2d, al momento, il framework opensource pi\u00f9 diffuso per la piattaforma iOS.<\/p>\n<p>Nella prossima lezione faremo un primo incontro con questo bellissimo framework, vedremo nel dettaglio come scaricarlo ed installarlo sui nostri mac e analizzeremo le sue potenzialit\u00e0 esaminando qualche progetto di esempio disponibile in rete.<\/p>\n<p>Alla prossima!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Squillino le trombe e rullino i tamburi! Mettete da parte i social network, dite addio a tumblr&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1119],"tags":[1121,1124,1120,1122,1123],"class_list":["post-9070","post","type-post","status-publish","format-standard","hentry","category-corso-programmazione-videogiochi","tag-corso-cocos2d","tag-creare-giochi-iphone-e-ipad","tag-creare-videogame-iphone-ipad","tag-programmazione-cocos2d","tag-programmazione-videogiochi-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9070","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=9070"}],"version-history":[{"count":28,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9070\/revisions"}],"predecessor-version":[{"id":9123,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9070\/revisions\/9123"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=9070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=9070"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=9070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}