define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', true);{"id":100,"date":"2014-02-06T18:44:40","date_gmt":"2014-02-06T17:44:40","guid":{"rendered":"http:\/\/www.softgame.it\/?p=100"},"modified":"2014-02-08T11:13:44","modified_gmt":"2014-02-08T10:13:44","slug":"creare-un-videogioco-4-componiamo-la-scena","status":"publish","type":"post","link":"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-4-componiamo-la-scena\/","title":{"rendered":"Creare un videogioco: 4 componiamo la scena"},"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-4-componiamo-la-scena\/\" 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-4-componiamo-la-scena\/\" 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-4-componiamo-la-scena\/\" data-size=\"medium\" data-width=\"120\" style=\"flaot:left;margin: 0 10px\"><\/div><\/div><p>In questo quarto articolo della serie &#8220;Creare un videogioco con Irrlicht&#8221; vedremo come caricare e posizionare tutti gli elementi che comporranno la scena di gioco, nello specifico useremo le funzioni per posizionare le mesh usando coordinate x,y,z\u00a0 relative agli assi di riferimento. Particolare attenzione \u00e8 rivolta alla creazione di un vincolo padre &#8211; figlio, usate per legare la posizione della torretta alla base.<!--more--><\/p>\n<p>Gli elementi che compongono tutta la scena sono:<\/p>\n<ul>\n<li>Il campo di battaglia, che chiameremo &#8220;campo&#8221;<\/li>\n<li>La base del carro armato blu, che chiameremo &#8220;baseBlu&#8221;<\/li>\n<li>La torretta del carro armato blu, che chiameremo &#8220;torrettaBlu&#8221;<\/li>\n<li>La base del carro armato rosso, che chiameremo &#8220;baseRosso&#8221;<\/li>\n<li>La torretta del carro armato rosso, che chiameremo &#8220;torrettaRosso&#8221;<\/li>\n<li>Potremmo caricare degli ostacoli nel campo di battaglia ma, almeno per ora, non lo facciamo.<\/li>\n<\/ul>\n<p>Impostiamo un vincolo padre figlio su base e torretta dei carri affinch\u00e8 muovendo la base, la torretta essendo solidale si muova anch&#8217;essa.<\/p>\n<p>Di seguito il codice completo che andremo ad analizzare.<\/p>\n<pre class=\"lang:c++ decode:true\">#include \"irrlicht.h\"\r\nusing namespace irr;\r\n\r\n#pragma comment(lib, \"irrlicht.lib\")\r\n\r\nint main()\r\n {\r\n    \/\/ inizializzo il device impostando risoluzione 800x600 usando DirectX9\r\n    IrrlichtDevice *device = createDevice(video::EDT_DIRECT3D9,\r\n        core::dimension2d&lt;u32&gt;(800,600), 16, false, false, false);\r\n\t\/\/ Creo driver\r\n    video::IVideoDriver* driver = device-&gt;getVideoDriver();\r\n\t\/\/ Creo il gestore di scena\r\n    scene::ISceneManager* scenemgr = device-&gt;getSceneManager();\r\n\t\/\/ Tramite il device imposto il titolo della finestra\r\n    device-&gt;setWindowCaption(L\"Irrlicht tutorial by softgame.it\");\r\n\r\n\t\/* --------------------------------\r\n\t\tPer caricare tutta la scena dobbiamo caricare i seguenti elementi: \r\n\t\t1) Campo di battaglia\r\n\t\t2) Base tank blu\r\n\t\t3) Torretta tank blu\r\n\t\t4) Base tank rosso\r\n\t\t5) Torretta tank rosso\r\n\t\t6) Eventuali barriere (opzionale)\r\n\t\t-------------------------------- *\/\r\n\r\n\t\/\/ 1) Carico in memoria la mesh del campo di battaglia\r\n\tscene::IAnimatedMesh* meshCampo = scenemgr-&gt;getMesh(\"field.x\");\r\n\t\/\/ Creo il nodo che conterr\u00e0 il campo di battaglia (campo)\r\n\tscene::ISceneNode* campo = scenemgr-&gt;addOctreeSceneNode(meshCampo-&gt;getMesh(0),0,-1,512);\r\n\t\/\/ Disabilito il lighting\r\n\tcampo-&gt;setMaterialFlag(video::EMF_LIGHTING, false);\r\n\t\/\/ 2) Aggiungo alla scena la base del carro armato Blu\r\n\tscene::ISceneNode* baseBlu = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"take.x\"));\r\n    \/\/ Se caricata correttamente la mesh procedo al caricamento della texture e\r\n\t\/\/ disabilito il lighting *1, setto la posizione di partenza a -100 -220 -100\r\n    if (baseBlu)\r\n    {\r\n        baseBlu-&gt;setMaterialTexture(0, driver-&gt;getTexture(\"milwalll.bmp\"));\r\n        baseBlu-&gt;setMaterialFlag(video::EMF_LIGHTING, false);\r\n\t\tbaseBlu-&gt;setPosition(core::vector3df(-100, -220, -100));\r\n    }\t\r\n\t\/\/ 3) Aggiungo alla scena la torretta del carro blu, e collego i due nodi rendendo la torretta nodo figlio della base\r\n\tscene::ISceneNode* torrettaBlu = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"HeadBlue.x\"));\r\n\tif (torrettaBlu)\r\n    {\r\n\t\ttorrettaBlu-&gt;setMaterialFlag(video::EMF_LIGHTING, false); \/\/lighting disabilitato\r\n\t\tbaseBlu-&gt;addChild(torrettaBlu); \/\/ Rendo il nodo baseBlu Padre e torrettaBlu nodo Figlio\r\n\t\ttorrettaBlu-&gt;setPosition(core::vector3df(0, 60, 0)); \/\/posiziono correttamente la torretta sulla base\r\n\t}\t\r\n\t\/\/ 4) Aggiungo alla scena la base del carro armato Rosso\r\n\tscene::ISceneNode* baseRosso = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"take.x\"));\r\n\tif (baseRosso)\r\n    {\r\n        baseRosso-&gt;setMaterialTexture(0, driver-&gt;getTexture(\"milwalll.bmp\"));\r\n        baseRosso-&gt;setMaterialFlag(video::EMF_LIGHTING, false);\r\n\t\tbaseRosso-&gt;setPosition(core::vector3df(300, -220, -600));\r\n    }\r\n\t\/\/ 5) Aggiungo alla scena la torretta del carro armato Rosso\r\n\tscene::ISceneNode* torrettaRosso = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"HeadRed.x\"));\r\n\tif (torrettaRosso)\r\n    {\r\n\t\ttorrettaRosso-&gt;setMaterialFlag(video::EMF_LIGHTING, false); \/\/lighting disabilitato\r\n\t\tbaseRosso-&gt;addChild(torrettaRosso); \/\/ Rendo il nodo baseRosso Padre e nodeTurret nodo Figlio\r\n\t\ttorrettaRosso-&gt;setPosition(core::vector3df(0, 60, 0)); \/\/posiziono correttamente la torretta sulla base\r\n\t}\r\n    \/\/ Aggiungo una camera di tipo FPS (si controlla tramite mouse e frecce)\r\n\t\/\/ Gli indico il target da inquadrare con le coord.\r\n    scenemgr-&gt;addCameraSceneNodeFPS();\r\n\tscenemgr-&gt;getActiveCamera()-&gt;setPosition(core::vector3df(20.0f, 400.0f, -1000.0f));\r\n\tscenemgr-&gt;getActiveCamera()-&gt;setTarget(core::vector3df(20.0f, -500.0f, 0.0f));\r\n    \/\/ Ciclo principale dove viene renderizzata la scena\r\n    while(device-&gt;run() &amp;&amp; driver)\r\n    {\r\n        driver-&gt;beginScene(true, true, video::SColor(255,0,0,255));\r\n        scenemgr-&gt;drawAll();\r\n        driver-&gt;endScene();\r\n    }\r\n    \/\/ Cancello il device prima di uscire\r\n    device-&gt;drop();\r\n    return 0;\t\r\n }<\/pre>\n<p>Irrlicht \u00e8 un framework che opera in tre dimensioni (3D), usa come riferimento il seguente sistema di assi dello spazio cartesiano:<br \/>\n<a href=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2014\/02\/assi2.gif\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-115\" alt=\"assi2\" src=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2014\/02\/assi2.gif\" width=\"241\" height=\"178\" \/><\/a><br \/>\nDove X rappresenta l&#8217;ascissa, Z l&#8217;ordinata e Y l&#8217;asse delle quote. Quindi X-Z come piano 2D ed Y come altezza. Alcuni corsi di studio utilizzano gli assi in modo diverso, per questo motivo dobbiamo fare attenzione e riferirci sempre allo schema mostrato e non alle nostre remiscenze di geometria.<\/p>\n<p><strong>Iniziamo ad analizzare il codice.<\/strong><br \/>\nDalla linea 1 alla 4 nulla di nuovo rispetto il precedente articolo, inclusione delle intestazioni di irrlicht, utilizzo del namespace irr e direttiva per il linker.<br \/>\nAlla linea 6 inizia il main del programma.<br \/>\nDalla linea 9 alla 16 anche qui nulla di nuovo, inizializzo il device, poi il driver ed infine il gestore di scena (scenemgr).<\/p>\n<p>Arriviamo finalmente alla nuova parte di codice:<\/p>\n<pre class=\"start-line:28 lang:c++ decode:true\">\/\/ 1) Carico in memoria la mesh del campo di battaglia\r\nscene::IAnimatedMesh* meshCampo = scenemgr-&gt;getMesh(\"field.x\");\r\n\/\/ Creo il nodo che conterr\u00e0 il campo di battaglia (campo)\r\nscene::ISceneNode* campo = scenemgr-&gt;addOctreeSceneNode(meshCampo-&gt;getMesh(0),0,-1,512);\r\n\/\/ Disabilito il lighting\r\ncampo-&gt;setMaterialFlag(video::EMF_LIGHTING, false);<\/pre>\n<p>carichiamo la mesh del campo di battaglia usando un puntatore di ripo IAnimatedMesh che chiamiamo <strong>meshCampo<\/strong>.<br \/>\nSuccessivamente creiamo un nodo per la gesione del campo di battaglia e lo chiamiamo <strong>campo<\/strong>.<br \/>\nCome nell&#8217;esempio scorso disabilitiamo l&#8217;illiminazione del campo con l&#8217;istruzione alla riga 33.<\/p>\n<pre class=\"start-line:34 lang:c++ decode:true\">\/\/ 2) Aggiungo alla scena la base del carro armato Blu\r\nscene::ISceneNode* baseBlu = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"take.x\"));\r\n\/\/ Se caricata correttamente la mesh procedo al caricamento della texture e\r\n\/\/ disabilito il lighting *1, setto la posizione di partenza a -100 -220 -100\r\nif (baseBlu)\r\n{\r\n    baseBlu-&gt;setMaterialTexture(0, driver-&gt;getTexture(\"milwalll.bmp\"));\r\n    baseBlu-&gt;setMaterialFlag(video::EMF_LIGHTING, false);\r\n    baseBlu-&gt;setPosition(core::vector3df(-100, -220, -100));\r\n}    \r\n\/\/ 3) Aggiungo alla scena la torretta del carro blu, e collego i due nodi rendendo la torretta nodo figlio della base\r\nscene::ISceneNode* torrettaBlu = scenemgr-&gt;addMeshSceneNode(scenemgr-&gt;getMesh(\"HeadBlue.x\"));\r\nif (torrettaBlu)\r\n{\r\n    torrettaBlu-&gt;setMaterialFlag(video::EMF_LIGHTING, false); \/\/lighting disabilitato\r\n    baseBlu-&gt;addChild(torrettaBlu); \/\/ Rendo il nodo baseBlu Padre e torrettaBlu nodo Figlio\r\n    torrettaBlu-&gt;setPosition(core::vector3df(0, 60, 0)); \/\/posiziono correttamente la torretta sulla base\r\n}<\/pre>\n<p>Alla riga 36 creiamo un nodo chiamato baseBlu e gli assegnamo la mesh della base del carro blu.<br \/>\nSuccessivamente controlliamo che questo \u00e8 stato creato e quindi che tutto \u00e8 andato per il meglio, se cos\u00ec \u00e8 allora procediamo a caricare la texture, disabilitiamo il lighting e lo posizioniamo alle coordinate -100, -220, -100. La texture non \u00e8 altro che un immagine che viene applicata sulla superficie della mesh per aggiungerli dettagli e colori. La mesh e la texture sono legate tra di loro, tutto questo viene creato in un programma di grafica 3D, noi ci limitiamo solo a caricarli. Irrlicht gestisce diversi formati di mesh e diversi formati per le texture, per l&#8217;elenco completo di tutti i formati supportati vi invito a visitare il sio ufficiale.<br \/>\nCaricata la base ora \u00e8 la volta della torretta.<br \/>\nAlla riga 45 creiamo il nodo torrettaBlu e carichiamo la corrispondente mesh (HeadBlue.x). Se il caricamento va a buon fine disabilitiamo il lighting e subito dopo la rendiamo nodo figlio della base. Ora i due nodi sono legati tra di loro. Successivamente posizioniamo la torretta, il posizionamento ora non \u00e8 relativo agli assi d&#8217;origine dello spazio cartesiamo bens\u00ec all&#8217;oggetto padre, quindi la torretta viene ad essere 60 unit\u00f9 pi\u00f9 in altro della base. Usano l&#8217;associazione padre figlio in futuro per il movimento non dovremo pensare a muovere entramvi gli oggetti, ma muoveremo solo il nodo padre ovvero la base, la torretta seguir\u00e0 automaticamente tutti i movimenti.<br \/>\nDalla riga 56 alla 67 ripetiamo le stesse operazioni questa volta per\u00f2 per caricare e posizionare il carro armato rosso sempre con un vincolo padre figlio tra il nodo della base e quello della torretta.<\/p>\n<pre class=\"start-line:70 lang:default decode:true\">scenemgr-&gt;addCameraSceneNodeFPS();\r\nscenemgr-&gt;getActiveCamera()-&gt;setPosition(core::vector3df(20.0f, 400.0f, -1000.0f));\r\nscenemgr-&gt;getActiveCamera()-&gt;setTarget(core::vector3df(20.0f, -500.0f, 0.0f));<\/pre>\n<p>Dalla riga 70 alla 72 creiamo una telecamra di tipo First Person Shooter e la settiamo in modo tale da inquadrare il campo di battaglia per intero. Essendo una telecamera FPS possiamo cambiare la visuale tramite mouse e tasti direzionali.<br \/>\nIl restante codice non \u00e8 altro che il loop principale dove viene renderizzata la scena finquando non viene chiusa la finestra.<\/p>\n<p>Come di consuetudine potete <a href=\"http:\/\/www.softgame.it\/wp-content\/uploads\/2014\/02\/main-4.zip\">scaricare il codice di questo articolo cliccando qui.<\/a><\/p>\n<p><strong>Conclusioni<\/strong><br \/>\nIn questo articolo abbiamo visto come caricare le mesh, assegnagli correttamente le texture, creare nodi con vincoli padre figlio, modificare la posizione di un elemento della scena, creare una camera di tipo FPS e posizionarla. Da segnalare che non abbiamo usato luci, la luce e le ombre che si vedono sul campo di battaglia sono state create con il software di modellazione 3D che ha generato la mesh e soprattuto la texture. Questa infatti include luci e ombre precalcolate.<br \/>\nNel prossimo articolo vedremo come gestire i movimenti del carro blu in relazione all&#8217;input impartito dal giocatore.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo quarto articolo della serie &#8220;Creare un videogioco con Irrlicht&#8221; vedremo come caricare e posizionare tutti gli elementi che comporranno la scena di gioco, nello specifico useremo le funzioni per posizionare le mesh usando coordinate x,y,z\u00a0 relative agli assi di riferimento. Particolare attenzione \u00e8 rivolta alla creazione di un vincolo padre &#8211; figlio, usate&hellip;&nbsp;<a href=\"http:\/\/www.softgame.it\/index.php\/creare-un-videogioco-4-componiamo-la-scena\/\" class=\"\" rel=\"bookmark\">Leggi tutto &raquo;<span class=\"screen-reader-text\">Creare un videogioco: 4 componiamo la scena<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":129,"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":[37,21,38],"_links":{"self":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/100"}],"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=100"}],"version-history":[{"count":26,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/100\/revisions"}],"predecessor-version":[{"id":136,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/posts\/100\/revisions\/136"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/media\/129"}],"wp:attachment":[{"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/media?parent=100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/categories?post=100"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.softgame.it\/index.php\/wp-json\/wp\/v2\/tags?post=100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}