{"id":9591,"date":"2012-10-03T10:34:24","date_gmt":"2012-10-03T08:34:24","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=9591"},"modified":"2012-10-03T10:34:24","modified_gmt":"2012-10-03T08:34:24","slug":"9-introduzione-a-box2d-la-fisica-nei-videogame","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/9-introduzione-a-box2d-la-fisica-nei-videogame\/","title":{"rendered":"9. Introduzione a Box2d: la fisica nei videogame"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/corso-programmazione-videogame-cocos2d-09.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/corso-programmazione-videogame-cocos2d-09.jpg\" alt=\"corso-programmazione-videogame-cocos2d-09\" title=\"corso-programmazione-videogame-cocos2d-09\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-9595\" \/><\/a> Ora che abbiamo preso dimestichezza con le librerie di Cocos2d \u00e8 ora di affrontare un argomento un po&#8217; pi\u00f9 tosto, introduciamo infatti in questa lezione il nostro primo motore fisico, <strong>Box2d<\/strong>.<\/p>\n<p>Ma cos&#8217;\u00e8 un motore fisico? Si tratta di un insieme di classi e di utility che permettono ai programmatori un notevolissimo risparmio di tempo nello sviluppo di tutti quei giochi dov&#8217;\u00e8, in qualche modo, presente della fisica.<\/p>\n<p>Supponete infatti di voler realizzare una banalissima applicazione in cui una pallina si muove in un labirinto seguendo l&#8217;inclinazione del device, insomma qualcosa di simile a questo:<!--more--><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-01.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-01.jpg\" alt=\"box2d-introduzione-guida-cocos-2d-01\" title=\"box2d-introduzione-guida-cocos-2d-01\" width=\"480\" height=\"320\" class=\"aligncenter size-full wp-image-9598\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-01.jpg 480w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-01-300x200.jpg 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Potremmo seguire le istruzioni presenti in <a href=\"http:\/\/www.devapp.it\/wordpress\/t029-muoviamo-una-pallina-tramite-l-accelerometro.html\" target=\"_blank\">questo articolo<\/a>, ma non sarebbero sufficienti, perch\u00e9 in quell&#8217;esempio non sono considerati n\u00e9 gli ostacoli lungo il percorso n\u00e9 viene considerata l&#8217;accelerazione della pallina, che nell&#8217;esempio si muove di moto rettilineo uniforme, mentre nella realt\u00e0 una pallina su un piano si muove di moto rettilineo uniformemente accelerato. Se vogliamo rendere la nostra pallina un minimo realistica dovremmo quindi tenere traccia della velocit\u00e0, della accelerazione gravitazionale (9.8 m\/s2 ) e dell&#8217;angolo di inclinazione.<\/p>\n<p>Ok, lo ammetto le ultime frasi avevano come unico scopo quello di farvi apprezzare il lavoro fatto dai ragazzi che sviluppano i motori fisici, muovere una pallina su un piano non sarebbe poi tutto sto lavoro, per\u00f2 avete sicuramnte capito il senso.<\/p>\n<p>Torniamo quindi al nostro framework: Box2d. Parliamo di questo piuttosto che di altri perch\u00e9 questo framework ha la comodit\u00e0 di essere distribuito direttamente con l&#8217;installer di cocos2d, il che rende praticamente nulla la fase di setup e configurazione.<\/p>\n<p>In realt\u00e0 cocos2d viene distribuito con ben 2 motori fisici, il primo \u00e8 appunto Box2d, il secondo \u00e8 <strong>chipmunk<\/strong>, quale scegliere \u00e8 praticamente solo una questione di gusti dell&#8217;utente.<\/p>\n<p>I motori fisici del calibro di Box2D non mappano certamente tutta la realt\u00e0 fisica all&#8217;interno di un videogioco, ma propongono una fisica semplificata il cui scopo non \u00e8 quello di dimostrare la relativit\u00e0 generale di Einstein, ma dare comunque una parvenza di realt\u00e0 all&#8217;interno del videogioco. La pi\u00f9 evidente tra queste semplificazioni \u00e8 che questi motori fisici ragionano in termini di &#8220;corpi rigidi&#8221;. <\/p>\n<p>Vi ricordate il professore di fisica che disegna un blocco alla lavagna e parte con la solfa &#8220;Sia C un corpo rigido indeformabile di massa uniforme posto su un piano inclinato&#8230;&#8221; ecco in pratica box2D fa lo stesso genere di approssimazioni. Qualunque oggetto nella realt\u00e0 non \u00e8 n\u00e9 completamente rigido e n\u00e9 le sue proriet\u00e0 (densit\u00e0, massa) sono omogenee per tutto il corpo. Box2d ignora queste sottigliezze e caratterizza un corpo in base a soli 3 parametri<\/p>\n<ul>\n<li>Density (paragonabile al peso)<\/li>\n<li>Friction (qualcosa simile all&#8217;attrito)<\/li>\n<li>Restitution (questa propriet\u00e0 determina quanto rimbalza uno oggetto)<\/li>\n<\/ul>\n<p>A questi parametri va aggiunta la shape ovvero la forma che il corpo occupa nello spazio bidimensionale.<\/p>\n<p>Esiste un tipo pi\u00f9 evoluto di body e si ottiene collegando insieme pi\u00f9 body attraverso i joints. Per esempio la figura di un uomo pu\u00f2 essere costituita da 6 body (testa, busto, 2 braccia e 2 gambe) tenuti insieme da 5 joints (2 spalle, 2 anche e 1 collo) i joint specificano quanto e come i due corpi possono muoversi rispettivamente, in questo modo, per esempio, \u00e8 possibile applicare una forza al busto dell&#8217;uomo e tutto il corpo si sposter\u00e0. Di quanto e come si sposter\u00e0 la testa \u00e8, appunto, una propriet\u00e0 del joint.<\/p>\n<p>Potete vedere un esempio in questo sito:<\/p>\n<p><a href=\"http:\/\/www.emanueleferonato.com\/2009\/04\/06\/two-ways-to-make-box2d-cars\/\" target=\"_blank\">http:\/\/www.emanueleferonato.com\/2009\/04\/06\/two-ways-to-make-box2d-cars\/<\/a><\/p>\n<h4>Come installare Box2D<\/h4>\n<p>Il primo passo per utilizzare Box2D \u00e8 installare la libreria Cocos2d, il secondo \u00e8..hum..non c&#8217;\u00e8 un secondo passo! Troverete gi\u00e0 tutto pronto e funzionante!<\/p>\n<p>Per chi invece vuol far tutto da se l&#8217;home del progetto \u00e8 questa: <a href=\"http:\/\/code.google.com\/p\/box2d\/\" target=\"_blank\">http:\/\/code.google.com\/p\/box2d\/<\/a> potete scaricare lo zip con i sorgenti ed importarlo dentro Xcode, purtroppo essendo scritto interamente in C++ la sua compilazione richiede qualche attenzione in pi\u00f9, quindi il mio consiglio \u00e8 quello di utilizzare la versione distribuita attraverso Cocos2d.<\/p>\n<h4>La nostra prima applicazione con Box2d<\/h4>\n<p>La difficolt\u00e0 maggiore nell&#8217;uso di Box2D \u00e8 che \u00e8 scritto interamente in C++, quindi per utilizzarlo \u00e8 necessario apprendere giusto un po&#8217; di sintassi del C++, niente paura non c&#8217;\u00e8 bisogno n\u00e9 di studiare a memoria il libro dell&#8217;inventore del C++ Bjarne Stroustrup (<a href=\"http:\/\/www.stroustrup.com\/\" target=\"_blank\">http:\/\/www.stroustrup.com\/<\/a>) n\u00e9 tantomeno di imparare la pronuncia del suo cognome \ud83d\ude00 (che per inciso trovate qui <a href=\"http:\/\/www.stroustrup.com\/pronounciation.wav\" target=\"_blank\">http:\/\/www.stroustrup.com\/pronounciation.wav<\/a> )<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-02.png\" alt=\"box2d-introduzione-guida-cocos-2d-02\" title=\"box2d-introduzione-guida-cocos-2d-02\" width=\"550\" height=\"406\" class=\"aligncenter size-full wp-image-9599\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-02.png 650w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-02-300x221.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Partiamo quindi creando l&#8217;hello world per Box2d.<\/p>\n<p>Il primo passo \u00e8 quello di creare un nuovo progetto con Xcode e selezionare il tipo di progetto &#8220;<strong>cocos2d ios with box2d<\/strong>&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-03.png\" alt=\"box2d-introduzione-guida-cocos-2d-03\" title=\"box2d-introduzione-guida-cocos-2d-03\" width=\"550\" height=\"373\" class=\"aligncenter size-full wp-image-9600\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-03.png 732w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-03-300x203.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Chiamate il progetto &#8220;HelloBox2d&#8221; e salvatelo in una directory a vostro piacimento.<\/p>\n<p>Eseguitelo ed il risultato sar\u00e0 questo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-04.png\" alt=\"box2d-introduzione-guida-cocos-2d-04\" title=\"box2d-introduzione-guida-cocos-2d-04\" width=\"550\" height=\"293\" class=\"aligncenter size-full wp-image-9601\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-04.png 744w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-04-300x159.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Tappando sullo schermo potete far apparire delle nuove scatole che cadranno e interagiranno seguendo pi\u00f9 o meno la legge di gravit\u00e0.<\/p>\n<h4>Esaminiamo pi\u00f9 in dettaglio il progetto<\/h4>\n<p>Tra i file inseriti automaticamente all&#8217;interno del nostro progetto possiamo notare subito una particolarit\u00e0: i file hanno estensione .mm<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-05.png\" alt=\"box2d-introduzione-guida-cocos-2d-05\" title=\"box2d-introduzione-guida-cocos-2d-05\" width=\"254\" height=\"217\" class=\"aligncenter size-full wp-image-9602\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Questo perch\u00e9 \u00e8 necessario specificare ad Xcode che all&#8217;interno di questi file sar\u00e0 presente anche del codice c++ (quello appunto di Box2d) e Xcode provveder\u00e0 a compilarli in un modo leggermente diverso.<\/p>\n<p>Possiamo ottenre lo stesso risultato in un modo diverso, basta infatti selezionare il file e specificare come File Type &#8220;Objective-C++ source&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-06.png\" alt=\"box2d-introduzione-guida-cocos-2d-06\" title=\"box2d-introduzione-guida-cocos-2d-06\" width=\"378\" height=\"184\" class=\"aligncenter size-full wp-image-9603\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-06.png 378w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2012\/10\/box2d-introduzione-guida-cocos-2d-06-300x146.png 300w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La classe pi\u00f9 interessante in questo progetto \u00e8 HelloWorldLayer dove notiamo che \u00e8 stato importato il file principale di box2d con:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"Box2D.h\"\r\n<\/pre>\n<p>La costante appena sotto, PTM_RATIO \u00e8 valore di defautl del rapporto punti\/metri. Non abbiamo detto che box2d utilizza al suo interno una rappresentazione degli oggetti utilizzando il sistema MKS (meter \/ Kilogram \/ second) quindi un oggetto disegnato all&#8217;interno del nostro videogioco non misurer\u00e0 200 punti, ma 6 metri e 25 cm. Il rapporto di conversione tra punti nello schermo e metri \u00e8 dato appunto da PTM_RATIO. Di default un oggetto largo un metro occuper\u00e0 32 punti nello schermo.<\/p>\n<p><strong>ATTENZIONE:<\/strong> punti! non pixel! da quando Apple ha prodotto i device con schermi retina dobbiamo assolutamente fare questa distinsione.<\/p>\n<p>Tra le variabli di istanza troviamo<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nb2World* world;\r\n<\/pre>\n<p>world sar\u00e0 il nostro oggetto che conterr\u00e0 tutto il nostro mondo relativo a questa scena.<\/p>\n<h4>Passiamo ad analizzare l&#8217;implementazione<\/h4>\n<p>Il metodo pi\u00f9 interessante \u00e8 initPhysics, dove il motore fisico viene inizializzato, vediamolo riga per riga.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nCGSize s = [[CCDirector sharedDirector] winSize];\r\n<\/pre>\n<p>In questo modo recuperiamo la dimensione dello schermo.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nb2Vec2 gravity;\r\ngravity.Set(0.0f, -10.0f);\r\n<\/pre>\n<p>b2Vec2 \u00e8 una struttura C la cui dichiarazione si trova nel file b2Math.h. Rappresenta un vettore colonna di una matrice ed \u00e8 costituito da due elementi.<\/p>\n<p>In questo caso ne viene dichiarato uno che servir\u00e0 successivamente per il setup della gravit\u00e0, il valore standard in questo caso \u00e8 (0, -10). Possiamo intervenire su questi parametri per generare una gravit\u00e0 personalizzata, basta ricordare che valori positivi di y indicano una gravit\u00e0 che va verso l&#8217;alto mentre x indicano che va verso destra. Rispettivamente invece verso il basso e verso sinistra per valori negativi di y e di x.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nworld = new b2World(gravity);\r\n<\/pre>\n<p>Qui avviene l&#8217;effettiva inizializzazione del mondo utilizzando il vettore gravit\u00e0 dichiarato alla riga precedente.<\/p>\n<p>Possiamo notare qui una differente sintassi tra il C++ e Obj-c nell&#8217;allocare e inizializzare un oggetto.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Do we want to let bodies sleep?\r\n\r\nworld->SetAllowSleeping(true);\r\n<\/pre>\n<p>In questo modo stiamo richiamando una funzione dell&#8217;oggetto world dichiarando di voler abilitare lo &#8220;sleeping&#8221;.<\/p>\n<p>Questa impostazione permette a box2d di rendere inattivi &#8220;sleeping&#8221; gli oggetti che in pratica hanno raggiunto la condizione di equilibrio, in questo modo si possono ottimizzare i calcoli.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nworld->SetContinuousPhysics(true);\r\n<\/pre>\n<p>Come per il parametro precedente, ma questa volta attiva il continuos collision detection, una modalit\u00e0 in cui il riconoscimento delle collisioni \u00e8 pi\u00f9 preciso.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nm_debugDraw = new GLESDebugDraw( PTM_RATIO );\r\nworld->SetDebugDraw(m_debugDraw);\r\n\r\nuint32 flags = 0;\r\nflags += b2Draw::e_shapeBit;\r\nflags += b2Draw::e_jointBit;\r\nflags += b2Draw::e_aabbBit;\r\nflags += b2Draw::e_pairBit;\r\nflags += b2Draw::e_centerOfMassBit;\r\n\r\nm_debugDraw->SetFlags(flags);   \r\n<\/pre>\n<p>Queste righe servono per attivare alcune funzionalit\u00e0 di debug, potete anche commentarle o eliminarle.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nb2BodyDef groundBodyDef;\r\ngroundBodyDef.position.Set(0, 0);\r\nb2Body* groundBody = world->CreateBody(&groundBodyDef);\r\n<\/pre>\n<p>Iniziamo a creare i body del nostro mondo, dobbiamo creare le pareti intorno allo schermo per evitare che gli oggetti possano volare via.<\/p>\n<p>Iniziamo definento un b2BodyDef, una struttura in grado di mantere le informazioni sul corpo.<\/p>\n<p>Il corpo poi viene effettivamente creato dalla classe world utilizzando la funzione CreateBody, alla quale si passa come parametro la definizione del corpo.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nb2EdgeShape groundBox;\r\n<\/pre>\n<p>Dichiarmiamo una b2EdgeShape (ne servirebbero 4 diverse, una per ogni lato, ma in questo esempio ricicleremo sempre la stessa variabile).<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\ngroundBox.Set(b2Vec2(0,0), b2Vec2(s.width\/PTM_RATIO,0));\r\ngroundBody->CreateFixture(&groundBox,0);\r\n<\/pre>\n<p>creiamo un lato, la parte in basso e creiamo la fixture assegnando 0 come densit\u00e0 (il pagimento \u00e8 un corpo statico, la densit\u00e0 non serve.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ top\r\ngroundBox.Set(b2Vec2(0,s.height\/PTM_RATIO), b2Vec2(s.width\/PTM_RATIO,s.height\/PTM_RATIO));        groundBody->CreateFixture(&groundBox,0);\r\n\r\n\/\/ left\r\ngroundBox.Set(b2Vec2(0,s.height\/PTM_RATIO), b2Vec2(0,0));\r\ngroundBody->CreateFixture(&groundBox,0);\r\n\r\n\/\/ right\r\ngroundBox.Set(b2Vec2(s.width\/PTM_RATIO,s.height\/PTM_RATIO), b2Vec2(s.width\/PTM_RATIO,0));\r\ngroundBody->CreateFixture(&groundBox,0);\r\n<\/pre>\n<p>Creiamo anche gli altri 3 lati ed ecco che abbiamo finito il nostro &#8220;recinto&#8221;.<\/p>\n<p>La creazione dei corpi dinamici (le scatole) avviene all&#8217;interno del metodo addNewSpriteAtPosition<\/p>\n<p>Il codice \u00e8 piuttosto comprensibile, vediamone le parti pi\u00f9 importanti.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nPhysicsSprite *sprite = [PhysicsSprite spriteWithTexture:spriteTexture_ rect:CGRectMake(32 * idx,32 * idy,32,32)];                                                \r\n\r\n[parent addChild:sprite];\r\n\r\nsprite.position = ccp( p.x, p.y);\r\n<\/pre>\n<p>Viene creata una sprite da una texture random tra quattro e la si aggiunge alla scena.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nb2BodyDef bodyDef;\r\nbodyDef.type = b2_dynamicBody;\r\nbodyDef.position.Set(p.x\/PTM_RATIO, p.y\/PTM_RATIO);\r\nb2Body *body = world->CreateBody(&bodyDef);\r\n<\/pre>\n<p>Viene creato un corpo dinamico seguendo la stessa tecnica vista nel metodo precedente, prima si crea un b2BodyDef, si impostano le propriet\u00e0 e poi si chiede all&#8217;oggetto world di creare un body secondo le specifiche passate come parametro.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Define another box shape for our dynamic body.\r\nb2PolygonShape dynamicBox;\r\ndynamicBox.SetAsBox(.5f, .5f);\/\/These are mid points for our 1m box\r\n<\/pre>\n<p>Si crea la shape per questo corpo, che \u00e8 indipendente dalla sprite.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Define the dynamic body fixture.\r\nb2FixtureDef fixtureDef;\r\nfixtureDef.shape = &dynamicBox;        \r\nfixtureDef.density = 1.0f;\r\nfixtureDef.friction = 0.3f;\r\nbody->CreateFixture(&fixtureDef);\r\n<\/pre>\n<p>Si crea una fixture ovvero un contenitore per quelle propriet\u00e0 come densit\u00e0 e frizione da associare al corpo e alla shape.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[sprite setPhysicsBody:body];\r\n<\/pre>\n<p>Si associa la sprite al body, in questo modo abbiamo chiuso il cerchio, la sprite \u00e8 collegata al body, il body \u00e8 collegato alla sua shape e alla sua fixture.<\/p>\n<p>Come introduzione a Box2d direi che ci siamo, ma prima di lasciarvi vi invito a sperimentare e a fare qualche prova per conto vostro, i risultati potrebbero essere divertenti, un esempio?<\/p>\n<p>Provate ad aggiungere alla fixtureDef la riga:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nfixtureDef.restitution = 2;\r\n<\/pre>\n<p>In questo modo quando il body urter\u00e0 un altro corpo piuttosto che perdere energia l&#8217;acquister\u00e0, in un attimo vedrete le shape schizzare sempre pi\u00f9 velocemente all&#8217;interno dello schermo dell&#8217;iphone, in violazione di tutti i principi basilari di meccanica newtoniana!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ora che abbiamo preso dimestichezza con le librerie di Cocos2d \u00e8 ora di affrontare un argomento un&#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":[1205,1131,1130,1207,1204,1206],"class_list":["post-9591","post","type-post","status-publish","format-standard","hentry","category-corso-programmazione-videogiochi","tag-addnewspriteatposition","tag-box2d","tag-chipmunk","tag-guida-gratuita-cocos2d","tag-initphysics","tag-motore-fisico-videogame-ios"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9591","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=9591"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9591\/revisions"}],"predecessor-version":[{"id":9608,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/9591\/revisions\/9608"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=9591"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=9591"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=9591"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}