{"id":5020,"date":"2016-05-31T06:54:45","date_gmt":"2016-05-31T06:54:45","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=5020"},"modified":"2016-05-31T07:02:34","modified_gmt":"2016-05-31T07:02:34","slug":"une-classe-guiwidget-pour-gerer-les-objets-graphiques","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=5020","title":{"rendered":"Une classe GUIWidget pour g\u00e9rer les objets graphiques"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/Morrowind_UI.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-5027\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/Morrowind_UI.jpg\" alt=\"Morrowind_UI\" width=\"559\" height=\"419\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/Morrowind_UI.jpg 600w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2016\/05\/Morrowind_UI-300x225.jpg 300w\" sizes=\"(max-width: 559px) 100vw, 559px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Dans un jeu vid\u00e9o, nous avons besoin de cr\u00e9er des <strong>interfaces graphiques<\/strong> afin que le joueur puisse communiquer ou <strong>s\u00e9lectionner<\/strong> des items, cliquer sur des boutons, d\u00e9placer une armure, etc&#8230;<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir initialiser<em> DirectX 10<\/em><\/p>\n<p>&#8211; Savoir lire du <em>C++<\/em><\/p>\n<p>&#8211; Conna\u00eetre la classe <em>Sprite2D<\/em><\/p>\n<p><strong>Contenu :<\/strong><\/p>\n<p>Voici le fichier GUIWidget.h\u00a0 :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef GUI_WIDGET_H\r\n#define GUI_WIDGET_H\r\n\r\n#include &lt;iostream&gt;\r\n#include &lt;vector&gt;\r\n\r\n#include &lt;d3dx10math.h&gt;\r\n#include &quot;DataParameters.h&quot;\r\n\r\nclass Sprite2D;\r\n\r\ntypedef DataParameters GUIParameters; \r\n\r\nstruct AABB\r\n{\r\n\u00a0\u00a0 \u00a0unsigned int x;\r\n\u00a0\u00a0 \u00a0unsigned int y;\r\n\u00a0\u00a0 \u00a0unsigned int w;\r\n\u00a0\u00a0 \u00a0unsigned int h;\r\n};\r\n\r\nclass GUIEventListener\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0GUIEventListener() {}\r\n\u00a0\u00a0 \u00a0virtual ~GUIEventListener() {}\r\n\r\n\u00a0\u00a0 \u00a0virtual void OnGUIEvent(GUIParameters&amp; param) = 0;\r\n};\r\n\r\nclass GUIWidget\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0GUIWidget(const std::string&amp; sName);\r\n\u00a0\u00a0 \u00a0virtual ~GUIWidget();\r\n\r\n\u00a0\u00a0 \u00a0virtual void Update(float fTimeSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0D3DXVECTOR2 GetPosition();\r\n\u00a0\u00a0 \u00a0virtual void SetPosition(unsigned int x, unsigned int\u00a0 y);\r\n\u00a0\u00a0 \u00a0void SetRelativePosition(unsigned int\u00a0 x, unsigned int\u00a0 y);\r\n\r\n\u00a0\u00a0 \u00a0bool IsCollidingWithMousePointer(unsigned int x, unsigned int y);\r\n\r\n\u00a0\u00a0 \u00a0void SetVisible(bool bVisible);\r\n\u00a0\u00a0 \u00a0bool IsVisible();\r\n\r\n\u00a0\u00a0 \u00a0void AddEventListener(GUIEventListener* pEventListener);\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetSize(unsigned int iWidth, unsigned int iHeight);\r\n\u00a0\u00a0 \u00a0void GetSize(unsigned int&amp; iWidth, unsigned int&amp; iHeight);\r\n\r\n\u00a0\u00a0 \u00a0std::string GetName();\r\n\r\n\u00a0\u00a0 \u00a0void AddChild(GUIWidget* pChild);\r\n\u00a0\u00a0 \u00a0void SetParent(GUIWidget* pParent);\r\n\r\n\u00a0\u00a0 \u00a0bool HasParent();\r\n\r\n\u00a0\u00a0 \u00a0void SetCanBeOverlaped(bool bCanBeOverlaped);\r\n\u00a0\u00a0 \u00a0bool CanOverlap();\r\n\r\n\u00a0\u00a0 \u00a0void GetChildren(std::map&lt;std::string, GUIWidget*&gt;&amp; children);\r\n\u00a0\u00a0 \u00a0GUIWidget* GetParent();\r\n\r\n\u00a0\u00a0 \u00a0bool HasChildren();\r\n\r\n\u00a0\u00a0 \u00a0virtual void SetActive(bool bActive);\r\n\u00a0\u00a0 \u00a0bool IsActive();\r\n\r\n\u00a0\u00a0 \u00a0bool IsChildrenLocked();\r\n\u00a0\u00a0 \u00a0void SetChildrenLocked(bool bActive);\r\n\r\nprotected:\r\n\u00a0\u00a0 \u00a0std::vector&lt;GUIEventListener*&gt; m_eventListeners;\r\n\r\n\u00a0\u00a0 \u00a0void SendEventToListeners(GUIParameters&amp; param);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0AABB m_aabox;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bVisible;\r\n\r\n\u00a0\u00a0 \u00a0unsigned int m_iPosX;\r\n\u00a0\u00a0 \u00a0unsigned int m_iPosY;\r\n\r\n\u00a0\u00a0 \u00a0std::string m_sName;\r\n\r\n\u00a0\u00a0 \u00a0GUIWidget* m_pParent;\r\n\r\n\u00a0\u00a0 \u00a0std::map&lt;std::string, GUIWidget*&gt; m_children;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bCanBeOverlaped;\r\n\u00a0\u00a0 \u00a0bool m_bActive;\r\n\u00a0\u00a0 \u00a0bool m_bIsChildrenLocked;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier GUIWidget.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &quot;GUIWidget.h&quot;\r\n\r\n#include &quot;Sprite2D.h&quot;\r\n#include &quot;Defines.h&quot;\r\n\r\n#include &quot;GUIManager.h&quot;\r\n\r\n#include &quot;System.h&quot;\r\n#include &quot;InputManager.h&quot;\r\n#include &quot;GUIManager.h&quot;\r\n\r\nGUIWidget::GUIWidget(const std::string&amp; sName) :\r\nm_iPosX(0),\r\nm_iPosY(0),\r\nm_sName(sName),\r\nm_pParent(nullptr),\r\nm_bCanBeOverlaped(true),\r\nm_bVisible(true),\r\nm_bActive(true),\r\nm_bIsChildrenLocked(false)\r\n{\r\n\u00a0\u00a0 \u00a0ZeroMemory(&amp;m_aabox, sizeof(AABB));\r\n}\r\n\r\nGUIWidget::~GUIWidget()\r\n{\r\n}\r\n\r\nvoid GUIWidget::Update(float fTimeSinceLastFrame)\r\n{\r\n}\r\n\r\nvoid GUIWidget::SetCanBeOverlaped(bool bCanBeOverlaped)\r\n{\r\n\u00a0\u00a0 \u00a0m_bCanBeOverlaped = bCanBeOverlaped;\r\n\r\n\u00a0\u00a0 \u00a0if (HasChildren())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (auto it = m_children.begin(); it != m_children.end(); it++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIWidget* pChild = it-&gt;second;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pChild-&gt;SetCanBeOverlaped(bCanBeOverlaped);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool GUIWidget::CanOverlap()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bCanBeOverlaped;\r\n}\r\n\r\nstd::string GUIWidget::GetName()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sName;\r\n}\r\n\r\nD3DXVECTOR2 GUIWidget::GetPosition()\r\n{\r\n\u00a0\u00a0 \u00a0return D3DXVECTOR2(m_iPosX, m_iPosY);\r\n}\r\n\r\nvoid GUIWidget::SetPosition(unsigned int x, unsigned int\u00a0 y)\r\n{\r\n\u00a0\u00a0 \u00a0m_iPosX = x;\r\n\u00a0\u00a0 \u00a0m_iPosY = y;\r\n\r\n\u00a0\u00a0 \u00a0m_aabox.x = x;\r\n\u00a0\u00a0 \u00a0m_aabox.y = y;\r\n}\r\n\r\nbool GUIWidget::IsCollidingWithMousePointer(unsigned int x, unsigned int\u00a0 y)\r\n{\r\n\u00a0\u00a0 \u00a0return (x &gt;= m_aabox.x) &amp;&amp; (x &lt; (m_aabox.x + m_aabox.w))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0&amp;&amp; (y &gt;= m_aabox.y) &amp;&amp; (y &lt; (m_aabox.y + m_aabox.h));\r\n}\r\n\r\nvoid GUIWidget::SetVisible(bool bVisible)\r\n{\r\n\u00a0\u00a0 \u00a0m_bVisible = bVisible;\r\n\r\n\u00a0\u00a0 \u00a0if (HasChildren())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (auto it = m_children.begin(); it != m_children.end(); it++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIWidget* pChild = it-&gt;second;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pChild-&gt;SetVisible(bVisible);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (!bVisible)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetActive(false);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool GUIWidget::IsVisible()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bVisible;\r\n}\r\n\r\nvoid GUIWidget::AddEventListener(GUIEventListener* pEventListener)\r\n{\r\n\u00a0\u00a0 \u00a0m_eventListeners.push_back(pEventListener);\r\n}\r\n\r\nvoid GUIWidget::SendEventToListeners(GUIParameters&amp; param)\r\n{\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_eventListeners.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIEventListener* pEventListener = m_eventListeners[i];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pEventListener-&gt;OnGUIEvent(param);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid GUIWidget::SetSize(unsigned int iWidth, unsigned int iHeight)\r\n{\r\n\u00a0\u00a0 \u00a0m_aabox.w = iWidth;\r\n\u00a0\u00a0 \u00a0m_aabox.h = iHeight;\r\n}\r\n\r\nvoid GUIWidget::GetSize(unsigned int&amp; iWidth, unsigned int&amp; iHeight)\r\n{\r\n\u00a0\u00a0 \u00a0iWidth = m_aabox.w;\r\n\u00a0\u00a0 \u00a0iHeight = m_aabox.h;\r\n}\r\n\r\nvoid GUIWidget::AddChild(GUIWidget* pChild)\r\n{\r\n\u00a0\u00a0 \u00a0pChild-&gt;SetParent(this);\r\n\r\n\u00a0\u00a0 \u00a0m_children[pChild-&gt;GetName()] = pChild;\r\n}\r\n\r\nvoid GUIWidget::SetParent(GUIWidget* pParent)\r\n{\r\n\u00a0\u00a0 \u00a0m_pParent = pParent;\r\n}\r\n\r\nvoid GUIWidget::GetChildren(std::map&lt;std::string, GUIWidget*&gt;&amp; children)\r\n{\r\n\u00a0\u00a0 \u00a0children = m_children;\r\n}\r\n\r\nGUIWidget* GUIWidget::GetParent()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pParent;\r\n}\r\n\r\nbool GUIWidget::HasParent()\r\n{\r\n\u00a0\u00a0 \u00a0return m_pParent != nullptr;\r\n}\r\n\r\nvoid GUIWidget::SetRelativePosition(unsigned int\u00a0 x, unsigned int\u00a0 y)\r\n{\r\n\u00a0\u00a0 \u00a0if (HasParent())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIWidget* pParent = GetParent();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXVECTOR2 pos = pParent-&gt;GetPosition();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SetPosition(pos.x + x, pos.y + y);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nbool GUIWidget::HasChildren()\r\n{\r\n\u00a0\u00a0 \u00a0return m_children.size() &gt; 0;\r\n}\r\n\r\nvoid GUIWidget::SetActive(bool bActive)\r\n{\r\n\u00a0\u00a0 \u00a0if (HasChildren())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (auto it = m_children.begin(); it != m_children.end(); it++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GUIWidget* pChild = it-&gt;second;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pChild-&gt;SetActive(bActive);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_bActive = bActive;\r\n}\r\n\r\nbool GUIWidget::IsActive()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bActive;\r\n}\r\n\r\nbool GUIWidget::IsChildrenLocked()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bIsChildrenLocked;\r\n}\r\n\r\nvoid GUIWidget::SetChildrenLocked(bool bActive)\r\n{\r\n\u00a0\u00a0 \u00a0m_bIsChildrenLocked = bActive;\r\n}\r\n\r\n<\/pre>\n<p><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p>Nous avons pr\u00e9senter la premi\u00e8re classe nomm\u00e9e GUIWidget qui servira de base \u00e0 toutes les autres classes graphiques (GUI).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Dans un jeu vid\u00e9o, nous avons besoin de cr\u00e9er des interfaces graphiques afin que le joueur puisse communiquer ou s\u00e9lectionner des items, cliquer sur des boutons, d\u00e9placer une armure, etc&#8230; Pr\u00e9requis : &#8211; Savoir initialiser DirectX 10 &#8211; Savoir lire du C++ &#8211; Conna\u00eetre la classe Sprite2D Contenu : Voici le fichier GUIWidget.h\u00a0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5020"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5020"}],"version-history":[{"count":16,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5020\/revisions"}],"predecessor-version":[{"id":5037,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/5020\/revisions\/5037"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5020"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5020"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5020"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}