define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);{"id":12,"date":"2013-12-27T18:02:29","date_gmt":"2013-12-27T17:02:29","guid":{"rendered":"http:\/\/www.softgame.it\/?p=12"},"modified":"2014-02-08T11:11:01","modified_gmt":"2014-02-08T10:11:01","slug":"creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica","status":"publish","type":"post","link":"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica\/","title":{"rendered":"Creare un videogioco: 3 Irrlicht, struttura base e panoramica"},"content":{"rendered":"<div id=\"itiner-social\" style=\"padding: 5px 0; float:left; width:100%;\"><a href=\"https:\/\/twitter.com\/share\" class=\"twitter-share-button\" data-url=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica\/\" data-text=\"ItinerSocial\" data-count=\"horizontal\" data-via=\"ItinerSocial\" style=\"flaot:left;margin: 0 10px\"><\/a><div class=\"fb-like\" data-href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica\/\" data-layout=\"button_count\" data-send=\"false\" data-show-faces=\"false\" data-width=\"90\" style=\"flaot:left;margin: 0 10px\"><\/div><div class=\"g-plusone\" data-annotation=\"inline\" data-href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica\/\" data-size=\"medium\" data-width=\"120\" style=\"flaot:left;margin: 0 10px\"><\/div><\/div><p>In questo articolo finalmente <strong>metteremo mano al codice<\/strong>! Verr\u00e0 illustrata la struttura del motore 3D Irrlicht con una panoramica generale sulle diverse componenti\u00a0 e la struttura minima per far funzionare un&#8217;applicazione. Tale struttura sar\u00e0 la base per la creazione del nostro videogioco. Si presuppone che ci sia un minimo di conoscenza non tanto della programmazione in C++ ma della logica ad oggetti che sta dietro di essa.<\/p>\n<p><strong>Irrlicht<\/strong><br \/>\nCome anticipato nei precedenti articoli Irrlicht \u00e8 un motore 3D open source scritto in C++, il quale ci mette a disposizione delle librerie molto potenti per la realizzazione di videogiochi e\/o presentazioni 3D. Entrando nello specifico, il motore \u00e8 articolato in namespace (un namespace non \u00e8 altro che un raggruppamento di nomi di entit\u00e0), ecco come \u00e8 strutturato:<!--more--><\/p>\n<p>irr\u00a0 &#8211; Namespace principale che racchiude tutto ci\u00f2 che \u00e8 compreso in Irrlicht<br \/>\nirr::core &#8211; Namespace che racchiude tutti gli elementi e funzioni che costituiscono il cuore del motore tipo le funzioni sui vettori, piani ecc.<br \/>\nirr::gui &#8211; Namespace che racchiude tutti gli elementi che compongono e gestiscono la GUI (Graphic user interface)<br \/>\nirr::io &#8211; Namespace che gestisce l&#8217;input e l&#8217;output di dati, legge e scrive files di testo o XML, archivi zip ecc.<br \/>\nirr::scene &#8211; Namespace che gestisce la scena, carica le mesh, i nodi, le billboard ecc.<br \/>\nirr::video &#8211; Namespace che gestisce tutte le operazioni atte alla resa video (rendering) della scena.<\/p>\n<p>se alcuni di questi termini non vi suonassero familiari non vi preoccupate, verranno approfonditi man mano; l&#8217;importante \u00e8 capire che per ogni cosa che dobbiamo fare c&#8217;\u00e8 una funzione da utilizzare e queste funzioni sono suddivisi nei Namespace sopracitati.<\/p>\n<p>Ora invece analizziamo i principali elementi che compongono il motore, alcuni sono essenziali e senza di essi non si pu\u00f2 utilizzare Irrlicht.<\/p>\n<p>irr::IrrlichtDevice &#8211; questa \u00e8 la classe principale, tramite questa si pu\u00f2 accedere praticamente a tutto e non possiamo usare molteplici istanze di questa classe, solo una.<br \/>\nirr::video::IVideoDriver &#8211; questa classe \u00e8 l&#8217;interfaccia al driver che si occupa di eseguire tutte le funzioni grafiche sia 2D che 3D, tutti i rendering e le manipolazioni di texture vengono realizzate qui.<br \/>\nirr::scene::ISceneManager &#8211; questa classe gestisce tutti i nodi, le mesh e le telecamere della scena da rendere.<br \/>\n<code lang=\"cpp\"><\/code><\/p>\n<p><strong>Passiamo al codice!<\/strong><br \/>\nAnalizziamo ora il listato di questo programma che si occupa di caricare una mesh (modello 3D) ed inquadrarlo con una telecamera di tipo FPS (First person shooter), il tutto utilizzando ovviamente le classi di Irrlicht.<\/p>\n<pre class=\"lang:default decode:true\">#include \"irrlicht.h\"\r\nusing namespace irr;\r\n#pragma comment(lib, \"irrlicht.lib\")\r\n\r\nint main()\r\n\u00a0{\r\n\u00a0\u00a0\u00a0 \/\/ inizializzo il device impostando risoluzione 1024x720 usando DirectX9\r\n\u00a0\u00a0\u00a0 IrrlichtDevice *device = createDevice(video::EDT_DIRECT3D9,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 core::dimension2d&lt;u32&gt;(1024,720));\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Creo driver\r\n\u00a0\u00a0\u00a0 video::IVideoDriver* driver = device-&gt;getVideoDriver();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Creo il gestore di scena\r\n\u00a0\u00a0\u00a0 scene::ISceneManager* scenemgr = device-&gt;getSceneManager();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Tramite il device imposto il titolo della finestra\r\n\u00a0\u00a0\u00a0 device-&gt;setWindowCaption(L\"Irrlicht tutorial by softgame.it\");\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Aggiungo alla scena la mesh\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0scene::ISceneNode* node = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"take.x\"));\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Se caricata correttamente la mesh procedo al caricamento della texture e\r\n\u00a0\u00a0 \u00a0\/\/ disabilito il lighting *1, setto la posizione di partenza a -100 per ogni asse\r\n\u00a0\u00a0\u00a0 if (node)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 node-&gt;setMaterialTexture(0, driver-&gt;getTexture(\"milwalll.bmp\"));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 node-&gt;setMaterialFlag(video::EMF_LIGHTING, false);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0node-&gt;setPosition(core::vector3df(-100, -100, -100));\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Aggiungo una camera di tipo FPS (si controlla tramite mouse e frecce)\r\n\u00a0\u00a0 \u00a0\/\/ Gli indico il target da inquadrare con le coord.\r\n\u00a0\u00a0\u00a0 scenemgr-&gt;addCameraSceneNodeFPS();\r\n\u00a0\u00a0 \u00a0scenemgr-&gt;getActiveCamera()-&gt;setTarget(core::vector3df(-100, -100, -100));\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Ciclo principale dove viene renderizzata la scena\r\n\u00a0\u00a0\u00a0 while(device-&gt;run() &amp;&amp; driver)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 driver-&gt;beginScene(true, true, video::SColor(255,0,0,255));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 scenemgr-&gt;drawAll();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 driver-&gt;endScene();\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Cancello il device prima di uscire\r\n\u00a0\u00a0\u00a0 device-&gt;drop();\r\n\u00a0\u00a0\u00a0 return 0;\r\n\r\n\u00a0}<\/pre>\n<p>Il codice \u00e8 commentato riga per riga, di seguito voglio aggiungere alcune considerazioni generali e alcune precisazioni sulle prime 3 righe.<\/p>\n<pre class=\"lang:default decode:true\">#include \"irrlicht.h\"\r\nusing namespace irr;\r\n#pragma comment(lib, \"irrlicht.lib\")<\/pre>\n<p>La prima riga include il file di intestazioni (.h Header file irrlicht).<br \/>\nNella seconda dichiariamo l&#8217;utilizzo del namespace irr, questo ci semplifica la scrittura del codice, difatti per utilizzare una qualsiasi entit\u00e0 inclusa in questo namespace possiamo ora omettere irr. Esempio concreto per indicare quale video driver debba utilizzare ho scritto:<\/p>\n<p>video::EDT_DIRECT3D9<\/p>\n<p>e non<\/p>\n<p>irr::video::EDT_DIRECT3D9<\/p>\n<p>e cos\u00ec via per tutte le altre entit\u00e0.<br \/>\nNella terza riga abbiamo specificato al linker di dover utilizzare la liberia irrlicht.lib.<br \/>\nL&#8217;oggetto caricato \u00e8 solo la base del nostro piccolo carro armato. Riguardo l&#8217;illuminazione potete leggere nei commenti che al caricamento della mesh il lighting \u00e8 stato disabilitato, questo perch\u00e8 non avendo inserito nessuna luce, sarebbe risultato completamente buio. Le luci le aggiungeremo successivamente.<br \/>\nIl codice di questo primo listato \u00e8 stato scritto in modo procedurale e non ad oggetti, questo per ridurre al minimo i files e le istruzioni, nei prossimi articoli lo riscriveremo in modo da utilizzare i vantaggi della programmazione ad oggetti.<\/p>\n<p><strong>Sorgente e archivio file multimediali<\/strong><br \/>\nIl listato di codice che abbiamo visto in questo articolo lo potete <a href=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/main-3.zip\">scaricare qui<\/a>, mentre di seguito <a href=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/media.zip\">il link a tutti i media<\/a>: le mesh, le texture e i file sonori che ci serviranno per portare avanti il nostro piccolo progetto.<br \/>\nSe avete configurato bene il vostro ambiente di sviluppo come indicato nel precedente articolo, non dovete fare altro che creare un nuovo progetto (salvatelo dove preferite sul vostro PC), tipologia: Win32 console vuoto, aggiungete il listato chiamando il file main.cpp e procedete alla compilazione, il compilatore vi creer\u00e0 una sottocartella Debug dove troverete il file eseguibile (.exe), per far funzionare il tutto dovete copiare il file irrlicht.dll dalla sottocartella bin\\Win32-VisualStudio della libreria Irrlicht e dovete anche scompattare ed aggiungere i file che abbiamo utilizzato nell&#8217;esempio ovvero: take.X e milwalll.bmp. Ora facendo partire l&#8217;eseguibile dovrebbe visualizzarsi correttamente il nostro oggetto grazie ad Irrlicht come da screenshot:<br \/>\n<a href=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/tutorial3irrlicht.jpg\" target=\"_blank\"><img loading=\"lazy\" class=\"alignnone size-medium wp-image-92\" alt=\"Tutorial 3 irrlicht\" src=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/tutorial3irrlicht-300x218.jpg\" width=\"300\" height=\"218\" srcset=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/tutorial3irrlicht-300x218.jpg 300w, http:\/\/www.softgame.it\/wp-content\/uploads\/2013\/12\/tutorial3irrlicht.jpg 800w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>La telecamera che abbiamo usato \u00e8 del tipo FPS (first person shooter), di conseguenza la si pu\u00f2 utilizzare tramite mouse e frecce direzionali.<\/p>\n<p>Articolo precedente: <a href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-2-configurazione-ambiente-di-lavoro\/\">Creare un videogioco: 2 Configurazione ambiente di lavoro<\/a><\/p>\n<p>Articolo successivo: <a href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-4-componiamo-la-scena\/\">Creare un videogioco: 4 Componiamo la scena<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo finalmente metteremo mano al codice! Verr\u00e0 illustrata la struttura del motore 3D Irrlicht con una panoramica generale sulle diverse componenti\u00a0 e la struttura minima per far funzionare un&#8217;applicazione. Tale struttura sar\u00e0 la base per la creazione del nostro videogioco. Si presuppone che ci sia un minimo di conoscenza non tanto della programmazione&hellip;&nbsp;<a href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-3-irrlicht-struttura-base-e-panoramica\/\" class=\"\" rel=\"bookmark\">Leggi tutto &raquo;<span class=\"screen-reader-text\">Creare un videogioco: 3 Irrlicht, struttura base e panoramica<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":92,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_ti_tpc_template_sync":false,"_ti_tpc_template_id":""},"categories":[13],"tags":[36,22,21],"_links":{"self":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/12"}],"collection":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":13,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/12\/revisions"}],"predecessor-version":[{"id":133,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/12\/revisions\/133"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/media\/92"}],"wp:attachment":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/media?parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/categories?post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/tags?post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}