{"id":687,"date":"2015-02-27T11:42:42","date_gmt":"2015-02-27T11:42:42","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=687"},"modified":"2016-07-20T11:38:16","modified_gmt":"2016-07-20T11:38:16","slug":"une-quake-like-console-colorisee","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=687","title":{"rendered":"Une console Quake-like coloris\u00e9e"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-702\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1.png\" alt=\"quake-like_console\" width=\"1281\" height=\"502\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1.png 1281w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1-300x118.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1-1024x401.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/02\/quake-like_console1-624x245.png 624w\" sizes=\"(max-width: 1281px) 100vw, 1281px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>Parfois dans un jeu on a besoin de configurer ou de param\u00e9trer le gameplay ou les m\u00e9canismes du jeu directement dans le programme.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>&#8211; Savoir un peu utiliser DirectX 10<\/p>\n<p>&#8211; Savoir lire du C++<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>On peut entrer et ex\u00e9cuter des <strong>commandes<\/strong> (toutes tr\u00e8s utiles) pour modifier les <strong>variables<\/strong> ou les comportements du jeu. On peut aussi par ce biais afficher des <strong>informations<\/strong> syst\u00e8me ou des informations sur le comportement du jeu.<\/p>\n<p>Nous allons impl\u00e9menter cette console dans DirectX 10. Mais vous pouvez aussi l&rsquo;impl\u00e9menter dans votre propre application \u00e0 partir du code expliqu\u00e9.<\/p>\n<p>Cette console pr\u00e9sente les fonctionnalit\u00e9s suivantes :<\/p>\n<p style=\"padding-left: 30px;\"><em>&#8211; \u00e9l\u00e9ments de texte en couleur<\/em><br \/>\n<em>&#8211; historique de commande<\/em><br \/>\n<em> &#8211; commandes basiques<\/em><br \/>\n<em> &#8211; image de fond<\/em><br \/>\n<em> &#8211; correction \/ suppression de caract\u00e8re de la ligne de commande<\/em><\/p>\n<p style=\"text-align: left;\"><strong>Pr\u00e9requis :<\/strong><\/p>\n<p style=\"text-align: left;\">&#8211; Savoir lire du C++<\/p>\n<p style=\"text-align: left;\">&#8211; Savoir initialiser DirectX 10<\/p>\n<p style=\"text-align: left;\"><strong>Explications :<\/strong><\/p>\n<p style=\"text-align: left;\">Voici le fichier Console.h :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef CONSOLE_H\r\n#define CONSOLE_H\r\n\r\n#include &lt;string&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;list&gt;\r\n#include &lt;d3dx10math.h&gt;\r\n\r\n#include &quot;Singleton.h&quot;\r\n#include &quot;Sprite2D.h&quot;\r\n#include &quot;InputManager.h&quot;\r\n\r\nclass KeyEvent;\r\nclass Line;\r\nclass Command;\r\nclass DataParameters;\r\n\r\nstruct MessageType\r\n{\r\n\u00a0\u00a0 \u00a0enum Type {MSG_SYSTEM, MSG_WARNING, MSG_ERROR, MSG_DEBUG, MSG_GAME, MSG_COMMAND, MSG_BLANK};\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Type\r\n\u00a0\u00a0 \u00a0static std::string GetMessageType(MessageType::Type type);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Couleur\r\n\u00a0\u00a0 \u00a0static D3DXCOLOR GetMessageColour(MessageType::Type type);\r\n};\r\n\r\n\/* Un ensemble de mots *\/\r\nclass TextElement\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0TextElement(std::wstring sTextElementText, D3DXCOLOR colour, bool bBlinking);\r\n\u00a0\u00a0 \u00a0virtual ~TextElement();\r\n\r\n\u00a0\u00a0 \u00a0int GetLength();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring GetText();\r\n\r\n\u00a0\u00a0 \u00a0D3DXCOLOR GetColour();\r\n\r\n\u00a0\u00a0 \u00a0void SetColour(D3DXCOLOR colour);\r\n\r\n\u00a0\u00a0 \u00a0bool IsBlinking();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::wstring m_sTextElement;\r\n\r\n\u00a0\u00a0 \u00a0bool m_bBlinking;\r\n\u00a0\u00a0 \u00a0D3DXCOLOR m_colour;\u00a0\u00a0 \u00a0\r\n};\r\n\r\n\/* Un ensemble de TextElement *\/\r\nclass Line\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0Line(MessageType::Type type);\r\n\u00a0\u00a0 \u00a0virtual ~Line();\r\n\r\n\u00a0\u00a0 \u00a0void AddTextElement(std::wstring sTextElement, D3DXCOLOR colour, bool bBlinking);\r\n\u00a0\u00a0 \u00a0void AddTextElementSolo(std::wstring sTextElement, D3DXCOLOR colour, bool bBlinking);\r\n\r\n\u00a0\u00a0 \u00a0void GetTextElements(std::vector&lt;TextElement*&gt;&amp; elems);\r\n\r\n\u00a0\u00a0 \u00a0unsigned int GetTextElementsCount();\r\n\r\n\u00a0\u00a0 \u00a0MessageType::Type GetType();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0void ParseLines(std::wstring sText, std::vector&lt;std::wstring&gt;&amp; moreLines);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::vector&lt;TextElement*&gt; m_textElements;\r\n\r\n\u00a0\u00a0 \u00a0MessageType::Type m_type;\r\n\r\n\u00a0\u00a0 \u00a0unsigned int m_iLastElementLength;\r\n};\r\n\r\n\/* Le petit texte de saisie en bas \u00e0 gauche de la console *\/\r\nclass CommandLinePrompt\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0CommandLinePrompt();\r\n\u00a0\u00a0 \u00a0virtual ~CommandLinePrompt();\r\n\r\n\u00a0\u00a0 \u00a0void AppendCommandLineText(const std::wstring sText);\r\n\r\n\u00a0\u00a0 \u00a0void SetText(const std::wstring sText);\r\n\r\n\u00a0\u00a0 \u00a0void Clear();\r\n\r\n\u00a0\u00a0 \u00a0bool HasText();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Retourne le texte du prompt\r\n\u00a0\u00a0 \u00a0const std::wstring GetPromptText();\r\n\u00a0\u00a0 \u00a0\/\/ Retourne le texte de la ligne de commande\r\n\u00a0\u00a0 \u00a0const std::wstring GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0void Render();\r\n\r\n\u00a0\u00a0 \u00a0void SetArrowTransparency(float fValue);\r\n\u00a0\u00a0 \u00a0void SetArrowPosition(float x, float y);\r\n\u00a0\u00a0 \u00a0void SetArrowSize(unsigned int iArrowWidth, unsigned int iArrowHeight);\r\n\r\n\u00a0\u00a0 \u00a0void MoveCursorToLeft();\r\n\u00a0\u00a0 \u00a0void MoveCursorToRight();\r\n\r\n\u00a0\u00a0 \u00a0unsigned int GetCursorPos();\r\n\r\n\u00a0\u00a0 \u00a0void Update(float fYPosition);\r\n\r\n\u00a0\u00a0 \u00a0float GetCommandLengthPosition();\r\n\r\n\u00a0\u00a0 \u00a0void ResetCursorPos();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::wstring m_sPromptText;\r\n\u00a0\u00a0 \u00a0std::wstring m_sCommandLineText;\r\n\r\n\u00a0\u00a0 \u00a0Sprite2D* m_pArrowSprite;\r\n\r\n\u00a0\u00a0 \u00a0int m_iCursorPos;\r\n};\r\n\r\n\/* L'historique des commandes *\/\r\nclass CommandsHistory\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0CommandsHistory();\r\n\u00a0\u00a0 \u00a0virtual ~CommandsHistory();\r\n\r\n\u00a0\u00a0 \u00a0bool Empty();\r\n\r\n\u00a0\u00a0 \u00a0const std::wstring GetNext();\r\n\u00a0\u00a0 \u00a0const std::wstring GetPrevious();\r\n\r\n\u00a0\u00a0 \u00a0void Clear();\r\n\r\n\u00a0\u00a0 \u00a0void AddCommand(const std::wstring sCommandName);\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0std::list&lt;std::wstring&gt; m_history;\r\n\r\n\u00a0\u00a0 \u00a0std::wstring m_sLastCommand;\r\n};\r\n\r\nclass Console : public Singleton&lt;Console&gt;, public KeyListener\r\n{\r\n\u00a0\u00a0 \u00a0friend class Line;\r\n\u00a0\u00a0 \u00a0friend class CommandLinePrompt;\r\n\r\npublic:\r\n\u00a0\u00a0 \u00a0enum ConsoleState {MOVING_UP, MOVING_DOWN, HIDDEN, SHOWN};\r\n\u00a0\u00a0\u00a0 enum TransparencyState {FADE_IN, FADE_OUT};\r\n\r\n\u00a0\u00a0 \u00a0Console();\r\n\u00a0\u00a0 \u00a0virtual ~Console();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0void Initialize(); \r\n\r\n\u00a0\u00a0 \u00a0\/\/ Fonctions de conversion de cha\u00eenes de caract\u00e8res\r\n\u00a0\u00a0 \u00a0static std::string ToString(const std::wstring&amp; sText);\r\n\u00a0\u00a0 \u00a0static std::wstring ToWString(const std::string&amp; sText);\r\n\r\n\u00a0\u00a0 \u00a0void Render(float fTimeElapsedSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0void SetState(ConsoleState state);\r\n\r\n\u00a0\u00a0 \u00a0\/** M\u00e9thodes d'affichage **\/\r\n\u00a0\u00a0 \u00a0void Print(Line* pLine);\r\n\u00a0\u00a0 \u00a0void Print(const std::wstring&amp; sMessage, D3DXCOLOR colour, MessageType::Type type);\r\n\u00a0\u00a0 \u00a0void Print(const std::wstring&amp; sMessage, MessageType::Type type);\r\n\u00a0\u00a0 \u00a0void Print(const std::wstring&amp; sMessage, D3DXCOLOR colour);\r\n\u00a0\u00a0 \u00a0void Print(const std::wstring&amp; sMessage);\r\n\u00a0\u00a0 \u00a0void Print(const std::string&amp; sMessage);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Ajoute une ligne vide\r\n\u00a0\u00a0 \u00a0void AddBlankLine();\r\n\r\n\u00a0\u00a0\u00a0 bool IsVisible();\r\n\r\n\u00a0\u00a0 \u00a0void ToggleState();\r\n\r\n\u00a0\u00a0 \u00a0void AddToHistory(const std::wstring&amp; cmd);\r\n\u00a0\u00a0 \u00a0bool IsCharAuthorized(const wchar_t key);\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Ajoute une ligne dans la console\r\n\u00a0\u00a0\u00a0 void AddLine(Line* pLine); \r\n\r\n\u00a0\u00a0 \u00a0\/\/ Ces m\u00e9thodes permettent de d\u00e9filer la console\r\n\u00a0\u00a0 \u00a0void IncreaseScrollingPosition();\r\n\u00a0\u00a0 \u00a0void DescreaseScrollingPosition();\r\n\u00a0\u00a0 \u00a0void ResetScrollingPosition();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Ajoute les \u00e9l\u00e9ments qui qui changent de transparence\r\n\u00a0\u00a0\u00a0 void AddBlinkingTextElement(TextElement* pTextElement);\r\n\u00a0\u00a0\u00a0 void RemoveAllBlinkingTextElements();\r\n\r\n\u00a0\u00a0 \u00a0void Clear();\r\n\r\n\u00a0\u00a0 \u00a0virtual void SoloKeyPressed(const KeyEvent &amp;arg);\r\n\u00a0\u00a0 \u00a0virtual void SoloKeyReleased(const KeyEvent &amp;arg);\r\n\r\n\u00a0\u00a0 \u00a0virtual void RepetitiveKeyPressed(const KeyEvent &amp;arg);\r\n\u00a0\u00a0 \u00a0virtual void RepetitiveKeyReleased(const KeyEvent &amp;arg);\r\n\r\n\u00a0\u00a0 \u00a0unsigned int GetCharactWidth();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0unsigned int GetWidth();\r\n\u00a0\u00a0 \u00a0float GetStringLength(std::wstring sText);\r\n\u00a0\u00a0 \u00a0void UpdateSprites(float fTimeElapsedSinceLastFrame);\r\n\u00a0\u00a0 \u00a0void CreateTextFont();\r\n\u00a0\u00a0 \u00a0void UpdateCommandLineText();\r\n\u00a0\u00a0 \u00a0void LoadDefaultCommands();\r\n\u00a0\u00a0 \u00a0void TabComplete();\r\n\u00a0\u00a0 \u00a0void GetCommandLineArguments(const std::wstring&amp; sCommandLine, DataParameters&amp; param);\r\n\u00a0\u00a0 \u00a0bool TextIsOutOfWidth(const std::wstring sText);\r\n\r\n\u00a0\u00a0 \u00a0void DeletePreviousCharacter();\r\n\u00a0\u00a0 \u00a0void DeleteNextCharacter();\r\n\r\nprivate:\r\n\u00a0\u00a0 \u00a0\/\/ Les lignes affich\u00e9es\r\n\u00a0\u00a0 \u00a0std::vector&lt;Line*&gt; m_lines;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Hauteur de la console\r\n\u00a0\u00a0 \u00a0float m_fConsoleHeight;\r\n\u00a0\u00a0 \u00a0\/\/ Largeur de la console\r\n\u00a0\u00a0 \u00a0float m_fConsoleWidth;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/ Hauteur totale de la console en prenant en compte le prompt\r\n\u00a0\u00a0 \u00a0unsigned int m_iTotalConsoleHeight;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Largeur d'un caract\u00e8re\r\n\u00a0\u00a0 \u00a0float m_fCharWidth;\r\n\u00a0\u00a0 \u00a0\/\/ Hauteur d'un caract\u00e8re\r\n\u00a0\u00a0 \u00a0float m_fCharHeight;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Le nombre maximum de lignes affich\u00e9es \u00e0 la fois\r\n\u00a0\u00a0 \u00a0unsigned int m_iMaxLinesDisplayed;\r\n\u00a0\u00a0 \u00a0\/\/ Le nombre maximul de caract\u00e8res pr\u00e9sent sur une ligne\r\n\u00a0\u00a0 \u00a0unsigned int m_iMaxCharOnLine;\r\n\r\n\u00a0\u00a0\u00a0 std::vector&lt;TextElement*&gt; m_blinkingTextElements;\r\n\r\n\u00a0\u00a0 \u00a0TransparencyState m_elemState;\r\n\u00a0 \u00a0\u00a0\u00a0 \u00a0ConsoleState m_state;\r\n\r\n\u00a0\u00a0 \u00a0int m_iLinesStart;\r\n\u00a0\u00a0 \u00a0int m_iLinesOffset;\r\n\r\n\u00a0\u00a0 \u00a0ID3DX10Font* m_pFont;\r\n\r\n\u00a0\u00a0 \u00a0ID3DX10Sprite* m_pConsoleTextSprite;\r\n\r\n\u00a0\u00a0 \u00a0Sprite2D* m_pBackgroudImage;\r\n\u00a0\u00a0 \u00a0Sprite2D* m_pBorderImage;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Cha\u00eene de tous les carcat\u00e8res autoris\u00e9s\r\n\u00a0\u00a0 \u00a0std::wstring m_aLegalChars;\r\n\r\n\u00a0\u00a0 \u00a0CommandLinePrompt* m_pPrompt;\r\n\u00a0\u00a0 \u00a0CommandsHistory* m_pHistory;\r\n\r\n\u00a0\u00a0 \u00a0float m_fScrollOffset;\r\n\r\n\u00a0\u00a0 \u00a0std::list&lt;std::wstring&gt; m_tabHistory;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Voici le fichier Console.cpp :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n\/\/----------------------------------------------------\r\n\/\/ Auteur : Cl\u00e9ment Profit\r\n\/\/ Date de cr\u00e9ation : Juillet 2010\r\n\/\/ Description : Une console quake-like avec commandes et appel\r\n\/\/ d'events\r\n\/\/----------------------------------------------------\r\n\r\n#include &quot;InputManager.h&quot;\r\n#include &quot;Console.h&quot;\r\n#include &quot;Defines.h&quot;\r\n\r\n#include &quot;Commands.h&quot;\r\n#include &quot;DataParameters.h&quot;\r\n#include &quot;D3D10Renderer.h&quot;\r\n\r\ntemplate&lt;&gt; Console* Singleton&lt;Console&gt;::ms_instance = nullptr;\r\n\r\n\/********** MessageType **********\/\r\n\r\nstd::string MessageType::GetMessageType(MessageType::Type type)\r\n{\r\n\u00a0\u00a0 \u00a0std::string messageType = &quot;&quot;;\r\n\r\n\u00a0\u00a0 \u00a0switch (type)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_SYSTEM: messageType = &quot;[SYSTEM]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_WARNING: messageType = &quot;[WARNING]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_ERROR: messageType = &quot;[SYS_ERROR]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_DEBUG: messageType = &quot;[SYS_DEBUG]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_GAME: messageType = &quot;[GAME]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_COMMAND: messageType = &quot;[COMMAND]&quot;; break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_BLANK: messageType = &quot;&quot;; break;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return messageType;\r\n}\r\n\r\nD3DXCOLOR MessageType::GetMessageColour(MessageType::Type type)\r\n{\r\n\u00a0\u00a0 \u00a0D3DXCOLOR messageColour;;\r\n\r\n\u00a0\u00a0 \u00a0switch (type)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_SYSTEM: messageColour = D3DXCOLOR(0.8f, 0.9f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_WARNING: messageColour = D3DXCOLOR(0.7f, 0.8f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_ERROR: messageColour = D3DXCOLOR(0.2f, 0.4f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_DEBUG: messageColour = D3DXCOLOR(0.3f, 0.5f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_GAME: messageColour = D3DXCOLOR(0.1f, 0.8f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_COMMAND: messageColour = D3DXCOLOR(0.4f, 0.8f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0case MSG_BLANK: messageColour = D3DXCOLOR(1.0, 1.0f, 1.0f, 1.0f); break;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return messageColour;\r\n}\r\n\r\n\/********** TextElement **********\/\r\n\r\nTextElement::TextElement(std::wstring sTextElementText, D3DXCOLOR colour, bool bBlinking) :\r\nm_sTextElement(sTextElementText),\r\nm_bBlinking(bBlinking),\r\nm_colour(colour)\r\n{\r\n}\r\n\r\nTextElement::~TextElement()\r\n{\r\n}\r\n\r\nint TextElement::GetLength()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sTextElement.length();\r\n}\r\n\r\nstd::wstring TextElement::GetText()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sTextElement;\r\n}\r\n\r\nD3DXCOLOR TextElement::GetColour()\r\n{\r\n\u00a0\u00a0 \u00a0return m_colour;\r\n}\r\n\r\nvoid TextElement::SetColour(D3DXCOLOR colour)\r\n{\r\n\u00a0\u00a0 \u00a0m_colour = colour;\r\n}\r\n\r\nbool TextElement::IsBlinking()\r\n{\r\n\u00a0\u00a0 \u00a0return m_bBlinking;\r\n}\r\n\r\n\/********** Line **********\/\r\n\r\nLine::Line(MessageType::Type type) :\r\nm_type(type),\r\nm_iLastElementLength(0)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Ajoute le type de message (par ex [Game]) au d\u00e9but de la ligne\r\n\u00a0\u00a0 \u00a0AddTextElementSolo(Console::ToWString(MessageType::GetMessageType(m_type)), MessageType::GetMessageColour(m_type), false);\r\n}\r\n\r\nLine::~Line()\r\n{\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_textElements.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0SAFE_DELETE(m_textElements[i]);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nunsigned int Line::GetTextElementsCount()\r\n{\r\n\u00a0\u00a0 \u00a0return m_textElements.size();\r\n}\r\n\r\n\/***\r\nExplications : \r\n\r\nCes deux suivantes instructions servent \u00e0 faire en sorte qu'un \u00e9l\u00e9ment de la ligne ne d\u00e9passe\r\nla largeur de la console\r\n\r\n1 -\r\n2 -\r\n\r\n***\/\r\nvoid Line::AddTextElement(std::wstring sTextElement, D3DXCOLOR colour, bool bBlinking)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ Le d\u00e9but de la ligne : [Game]\r\n\u00a0\u00a0 \u00a0std::wstring s = CONSOLE-&gt;ToWString(MessageType::GetMessageType( GetType() ));\r\n\r\n\u00a0\u00a0 \u00a0unsigned int iStringLength = CONSOLE-&gt;GetStringLength( s + sTextElement ) + m_iLastElementLength;\r\n\r\n\u00a0\u00a0 \u00a0if (CONSOLE-&gt;TextIsOutOfWidth(s + sTextElement)) \/\/ || iStringLength &gt; CONSOLE-&gt;GetWidth())\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Apr\u00e8s on segmente la ligne\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::vector&lt;std::wstring&gt; moreLines;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ParseLines(sTextElement, moreLines);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; moreLines.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring pCurrentString = moreLines[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Line* pLine = new Line(m_type);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pLine-&gt;AddTextElementSolo(pCurrentString, colour, bBlinking);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CONSOLE-&gt;AddLine(pLine);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLastElementLength = 0;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0AddTextElementSolo(sTextElement, colour, bBlinking);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ On sauve la longueur en pixel de la derni\u00e8re ligne affich\u00e9e\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLastElementLength = CONSOLE-&gt;GetStringLength(sTextElement);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Line::AddTextElementSolo(std::wstring sTextElement, D3DXCOLOR colour, bool bBlinking)\r\n{\r\n\u00a0\u00a0 \u00a0TextElement* pTextElement = new TextElement(sTextElement, colour, bBlinking);\r\n\u00a0\u00a0 \u00a0m_textElements.push_back(pTextElement);\r\n\r\n\u00a0\u00a0 \u00a0if (bBlinking)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CONSOLE-&gt;AddBlinkingTextElement(pTextElement);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\n\/\/ Analyse une ligne et la d\u00e9coupe en plusieurs lignes si le nombre\r\n\/\/ de caract\u00e8res de la ligne pass\u00e9 d\u00e9passe un certain seuil\r\nvoid Line::ParseLines(std::wstring sText, std::vector&lt;std::wstring&gt;&amp; moreLines)\r\n{\r\n\u00a0\u00a0 \u00a0std::wstring s = CONSOLE-&gt;ToWString(MessageType::GetMessageType( GetType() ));\r\n\r\n\u00a0\u00a0 \u00a0const wchar_t* str = sText.c_str();\r\n\u00a0\u00a0 \u00a0std::wstring line = L&quot;&quot;;\r\n\r\n\u00a0\u00a0 \u00a0for (unsigned int c = 0; c &lt; sText.length(); c++)\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (str1 == '\\n' || CONSOLE-&gt;TextIsOutOfWidth(s + line))\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0moreLines.push_back(line);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0line = L&quot;&quot;;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (str1 != '\\n')\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0line += str1;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (line.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0moreLines.push_back(line);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Line::GetTextElements(std::vector&lt;TextElement*&gt;&amp; elem)\r\n{\r\n\u00a0\u00a0 \u00a0elem = m_textElements;\r\n}\r\n\r\nMessageType::Type Line::GetType()\r\n{\r\n\u00a0\u00a0 \u00a0return m_type;\r\n}\r\n\r\n\/****************************** CommandLinePrompt ******************************\/\r\n\r\nCommandLinePrompt::CommandLinePrompt() :\r\nm_sPromptText(CONSOLE_PROMPT_TEXT),\r\nm_pArrowSprite(nullptr),\r\nm_iCursorPos(0)\r\n{\r\n\u00a0\u00a0 \u00a0m_pArrowSprite = new Sprite2D(D3D10_RENDERER-&gt;GetDevice(), L&quot;arrow.png&quot;, 10, 12);\r\n\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;Initialize();\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;SetColor(D3DXCOLOR(1.0f, 0.85f, 0.0f, 0.0f));\r\n}\r\n\r\nCommandLinePrompt::~CommandLinePrompt()\r\n{\r\n\u00a0\u00a0 \u00a0delete m_pArrowSprite;\r\n}\r\n\r\nvoid CommandLinePrompt::Update(float fYPosition)\r\n{\r\n\u00a0\u00a0 \u00a0float fPromptXOffset = CONSOLE-&gt;GetStringLength(L&quot;_&quot;) + CONSOLE-&gt;GetStringLength(m_sPromptText);\r\n\r\n\u00a0\u00a0 \u00a0float fTotalWidth = GetCommandLengthPosition();\r\n\r\n\u00a0\u00a0 \u00a0SetArrowPosition(fPromptXOffset + fTotalWidth, fYPosition);\r\n}\r\n\r\nvoid CommandLinePrompt::AppendCommandLineText(const std::wstring sText)\r\n{\r\n\u00a0\u00a0 \u00a0unsigned int iPromptCursorPos = GetCursorPos();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sCurrentCommandLine = GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sFirstPart = sCurrentCommandLine.substr(0, iPromptCursorPos);\r\n\u00a0\u00a0 \u00a0std::wstring sLastPart = sCurrentCommandLine.substr(iPromptCursorPos, sCurrentCommandLine.length());\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0if (sLastPart.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sFirstPart += sText;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_sCommandLineText = sFirstPart + sLastPart;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MoveCursorToRight();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_sCommandLineText += sText;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0MoveCursorToRight();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\u00a0 \u00a0\r\nvoid CommandLinePrompt::SetText(const std::wstring sText)\r\n{\r\n\u00a0\u00a0 \u00a0m_sCommandLineText = sText;\r\n}\r\n\r\nvoid CommandLinePrompt::Clear()\r\n{\r\n\u00a0\u00a0 \u00a0m_sCommandLineText = L&quot;&quot;;\r\n\u00a0\u00a0 \u00a0m_iCursorPos = 0;\r\n}\r\n\r\nbool CommandLinePrompt::HasText()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sCommandLineText.size() &gt; 0;\r\n}\r\n\r\nconst std::wstring CommandLinePrompt::GetPromptText()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sPromptText;\r\n}\r\n\r\nconst std::wstring CommandLinePrompt::GetCommandLineText()\r\n{\r\n\u00a0\u00a0 \u00a0return m_sCommandLineText;\r\n}\r\n\r\nvoid CommandLinePrompt::Render()\r\n{\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;Render();\r\n}\r\n\r\nvoid CommandLinePrompt::SetArrowTransparency(float fValue)\r\n{\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;SetTransparency(fValue);\r\n}\r\n\r\nvoid CommandLinePrompt::SetArrowPosition(float x, float y)\r\n{\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;SetPosition(x, y);\r\n}\r\n\r\nvoid CommandLinePrompt::SetArrowSize(unsigned int iArrowWidth, unsigned int iArrowHeight)\r\n{\r\n\u00a0\u00a0 \u00a0m_pArrowSprite-&gt;SetImageSize(iArrowWidth, iArrowHeight);\r\n}\r\n\r\nunsigned int CommandLinePrompt::GetCursorPos()\r\n{\r\n\u00a0\u00a0 \u00a0return m_iCursorPos;\r\n}\r\n\r\nvoid CommandLinePrompt::MoveCursorToLeft()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_iCursorPos &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iCursorPos--;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid CommandLinePrompt::MoveCursorToRight()\r\n{\r\n\u00a0\u00a0 \u00a0float fPromptXOffset = CONSOLE-&gt;GetStringLength(m_sCommandLineText);\r\n\r\n\u00a0\u00a0 \u00a0if (GetCommandLengthPosition() &lt; fPromptXOffset)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iCursorPos++;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nfloat CommandLinePrompt::GetCommandLengthPosition()\r\n{\r\n\u00a0\u00a0 \u00a0float fTotalWidth = 0.0f;\r\n\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_iCursorPos; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring s = L&quot;&quot;;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0s.push_back(m_sCommandLineText[i]);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fTotalWidth += CONSOLE-&gt;GetStringLength(s);\r\n\u00a0\u00a0 \u00a0} \r\n\r\n\u00a0\u00a0 \u00a0return fTotalWidth;\r\n}\r\n\r\nvoid CommandLinePrompt::ResetCursorPos()\r\n{\r\n\u00a0\u00a0 \u00a0m_iCursorPos = m_sCommandLineText.length();\r\n}\r\n\r\n\/****************************** CommandsHistory ******************************\/\r\n\r\nCommandsHistory::CommandsHistory() :\r\nm_sLastCommand(L&quot;&quot;)\r\n{\r\n}\r\n\r\nCommandsHistory::~CommandsHistory()\r\n{\r\n\u00a0\u00a0 \u00a0m_history.clear();\r\n}\r\n\r\nbool CommandsHistory::Empty()\r\n{\r\n\u00a0\u00a0 \u00a0return m_history.size() == 0;\r\n}\r\n\r\nconst std::wstring CommandsHistory::GetPrevious()\r\n{\r\n\u00a0\u00a0 \u00a0if (!Empty())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_sLastCommand == m_history.back())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::wstring sCommandName = m_history.back();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_history.push_front(sCommandName);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_history.pop_back();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_sLastCommand = sCommandName;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return sCommandName;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return EMPTY;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nconst std::wstring CommandsHistory::GetNext()\r\n{\r\n\u00a0\u00a0 \u00a0if (!Empty())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_sLastCommand == m_history.front())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::wstring sCommandName = m_history.front();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_history.push_back(sCommandName);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_history.pop_front();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_sLastCommand = sCommandName;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return sCommandName;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return EMPTY;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid CommandsHistory::Clear()\r\n{\r\n\u00a0\u00a0 \u00a0m_history.clear();\r\n}\r\n\r\nvoid CommandsHistory::AddCommand(const std::wstring sCommandName)\r\n{\r\n\u00a0\u00a0 \u00a0m_history.remove(sCommandName);\r\n\u00a0\u00a0 \u00a0m_history.push_back(sCommandName);\r\n\r\n\u00a0\u00a0 \u00a0if (m_history.size() &gt; CONSOLE_MAX_COMMAND_HISTORY)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_history.pop_front();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\n\/****************************** Console ******************************\/\r\n\r\nConsole::Console() :\r\nm_elemState(TransparencyState::FADE_IN),\r\nm_iLinesStart(0),\r\nm_iLinesOffset(0),\r\nm_iMaxCharOnLine(0),\r\nm_pFont(nullptr),\r\nm_pConsoleTextSprite(nullptr),\r\nm_pBackgroudImage(nullptr),\r\nm_pBorderImage(nullptr),\r\nm_aLegalChars(INPUT_LEGAL_CHARS),\r\nm_fCharHeight(0),\r\nm_fCharWidth(0),\r\nm_fScrollOffset(1.0f),\r\nm_pPrompt(nullptr)\r\n{\r\n}\r\n\r\nConsole::~Console()\r\n{\r\n\u00a0\u00a0 \u00a0RemoveAllBlinkingTextElements();\r\n}\r\n\r\nvoid Console::Initialize()\r\n{\r\n\u00a0\u00a0 \u00a0new CommandsManager();\r\n\u00a0\u00a0 \u00a0CreateTextFont();\r\n\r\n\u00a0\u00a0 \u00a0m_fConsoleHeight = (float) D3D10_RENDERER-&gt;GetViewportHeight() * CONSOLE_HEIGHT_FACTOR;\r\n\u00a0\u00a0 \u00a0m_fConsoleWidth = (float) D3D10_RENDERER-&gt;GetViewportWidth();\r\n\r\n\u00a0\u00a0 \u00a0\/* Calcul des tailles d'un caract\u00e8re *\/\r\n\u00a0\u00a0 \u00a0RECT rect = {0, 0, 0, 0};\r\n\r\n\u00a0\u00a0 \u00a0m_pFont-&gt;DrawText(nullptr, L&quot;a&quot;, -1, &amp;rect, DT_CALCRECT, D3DXCOLOR());\r\n\r\n\u00a0\u00a0 \u00a0m_fCharWidth = rect.right - rect.left;\r\n\u00a0\u00a0\u00a0 m_fCharHeight = rect.bottom - rect.top;\r\n\r\n\u00a0\u00a0 \u00a0m_iMaxLinesDisplayed = (unsigned int) (m_fConsoleHeight \/ (m_fCharHeight - CONSOLE_HEIGHT_PADDING \/ 2));\r\n\u00a0\u00a0 \u00a0m_iMaxCharOnLine = (unsigned int) ((m_fConsoleWidth)\u00a0 \/ m_fCharWidth);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Le total des lignes affichables + la hauteur du prompt\r\n\u00a0\u00a0 \u00a0m_iTotalConsoleHeight = m_fConsoleHeight + m_fCharHeight + CONSOLE_HEIGHT_PADDING \/ 2;\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Image de fond\r\n\u00a0\u00a0 \u00a0m_pBackgroudImage = new Sprite2D(D3D10_RENDERER-&gt;GetDevice(), L&quot;background.jpg&quot;, m_fConsoleWidth, m_iTotalConsoleHeight);\r\n\u00a0\u00a0 \u00a0m_pBackgroudImage-&gt;Initialize();\r\n\u00a0\u00a0 \u00a0m_pBackgroudImage-&gt;SetPosition(0, -m_fConsoleHeight);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Bord du bas\r\n\u00a0\u00a0 \u00a0m_pBorderImage = new Sprite2D(D3D10_RENDERER-&gt;GetDevice(), L&quot;border.png&quot;, m_fConsoleWidth, CONSOLE_BORDER_HEIGHT);\r\n\u00a0\u00a0 \u00a0m_pBorderImage-&gt;Initialize();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ La ligne de commande et le prompt\r\n\u00a0\u00a0 \u00a0m_pPrompt = new CommandLinePrompt();\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/ Ajout de lignes pr\u00e9d\u00e9finies\r\n\u00a0\u00a0 \u00a0for (int i = 0; i &lt; 0; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Line* line = new Line(MessageType::MSG_GAME);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/line-&gt;AddTextElement(L&quot;En analyse, le nombre d\u00e9riv\u00e9 en un point d'une fonction \u00e0 variable et valeurs r\u00e9elles est le coefficient directeur de la tangente au graphe de cette fonction en ce point. C'est le coefficient directeur de l'approximation affine de cette fonction en ce point ; ce nombre n'est donc d\u00e9fini que si cette tangente \u2014 ou cette approximation \u2014 existe.&quot;, D3DXCOLOR(0.0f, 1.0f, 1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0line-&gt;AddTextElement(std::to_wstring(i), D3DXCOLOR(0.0f, 1.0f, 1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 AddLine(line);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0LoadDefaultCommands();\r\n\r\n\u00a0\u00a0 \u00a0Print(L&quot;En math\u00e9matiques, une m\u00e9trique ou distance est une fonction qui d\u00e9finit la distance entre les \u00e9l\u00e9ments d'un ensemble. Un ensemble muni d'une distance est appel\u00e9 un espace m\u00e9trique. Toute distance induit une topologie sur un ensemble mais la r\u00e9ciproque est fausse : un espace topologique n'est pas toujours m\u00e9trisable.&quot;);\r\n\r\n\u00a0\u00a0 \u00a0INPUT_MANAGER-&gt;SetKeyListener(this);\r\n\r\n\u00a0\u00a0 \u00a0m_pHistory = new CommandsHistory();\r\n\r\n\u00a0\u00a0\u00a0 \/\/ La console est cach\u00e9 d\u00e8s le d\u00e9but\r\n\u00a0\u00a0 \u00a0SetState(HIDDEN);\r\n\r\n\u00a0\u00a0 \u00a0Print(&quot;Salut!&quot;);\r\n}\r\n\r\nvoid Console::CreateTextFont()\r\n{\r\n\u00a0\u00a0 \u00a0ID3D10Device* pd3dDevice = D3D10_RENDERER-&gt;GetDevice();\r\n\r\n\u00a0\u00a0 \u00a0D3DX10CreateSprite(pd3dDevice, 0, &amp;m_pConsoleTextSprite);\r\n\r\n\u00a0\u00a0 \u00a0D3DX10_FONT_DESC fd;\r\n\u00a0\u00a0 \u00a0fd.Height = CONSOLE_FONT_HEIGHT;\r\n\u00a0\u00a0 \u00a0fd.Width = CONSOLE_FONT_WIDTH;\r\n\u00a0\u00a0 \u00a0fd.Weight = 3;\r\n\u00a0\u00a0 \u00a0fd.MipLevels = 0;\r\n\u00a0\u00a0 \u00a0fd.Italic = false;\r\n\u00a0\u00a0 \u00a0fd.CharSet = OUT_DEFAULT_PRECIS;\r\n\u00a0\u00a0 \u00a0fd.Quality = ANTIALIASED_QUALITY;\r\n\u00a0\u00a0 \u00a0fd.PitchAndFamily = DEFAULT_PITCH;\r\n\u00a0\u00a0 \u00a0wcscpy(fd.FaceName, CONSOLE_FONT_NAME);\r\n\r\n\u00a0\u00a0 \u00a0D3DX10CreateFontIndirect(pd3dDevice, &amp;fd, &amp;m_pFont);\r\n}\r\n\r\nfloat Console::GetStringLength(std::wstring sText)\r\n{\r\n\u00a0\u00a0 \u00a0RECT rect = {0, 0, 0, 0};\r\n\r\n\u00a0\u00a0 \u00a0m_pFont-&gt;DrawText(nullptr, sText.c_str(), -1, &amp;rect, DT_CALCRECT, D3DXCOLOR());\r\n\r\n\u00a0\u00a0 \u00a0float fWidth = rect.right - rect.left;\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On rajoute les espaces qui ne sont pas pris en compte\r\n\u00a0\u00a0 \u00a0if (!sText.empty() &amp;&amp; sText.back() == L' ')\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int c = sText.size() - 1;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (true)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sText.at(c) == L' ')\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0fWidth += 5;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0c--;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ Au cas o\u00f9...\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (c &lt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0break;\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\u00a0\u00a0 \u00a0return fWidth;\r\n}\r\n\r\nvoid Console::AddLine(Line* pLine)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ On n'ajoute pas les lignes qui comportent uniquement\r\n\u00a0\u00a0 \u00a0\/\/ l'en-t\u00eate [Game] par exemple\r\n\u00a0\u00a0 \u00a0if (pLine-&gt;GetTextElementsCount() &gt; 1)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_lines.push_back(pLine);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ On d\u00e9cale toutes les lignes\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_lines.size() &gt; m_iMaxLinesDisplayed)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesStart++;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::IncreaseScrollingPosition()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_iLinesStart &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesOffset++;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesStart--;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::DescreaseScrollingPosition()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_iLinesOffset &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesOffset--;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesStart++;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::SetState(ConsoleState state)\r\n{\r\n\u00a0\u00a0 \u00a0m_state = state;\r\n}\r\n\r\nvoid Console::ToggleState()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_state == SHOWN)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_state = MOVING_UP;\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (m_state == HIDDEN)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_state = MOVING_DOWN;\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::Print(Line* pLine)\r\n{\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::Print(const std::wstring&amp; sMessage, D3DXCOLOR colour, MessageType::Type type)\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(type);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(sMessage, colour, false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::Print(const std::wstring&amp; sMessage, MessageType::Type type)\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(type);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(sMessage, D3DXCOLOR(1.0f, 1.0f,1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::Print(const std::wstring&amp; sMessage, D3DXCOLOR colour)\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(MessageType::MSG_GAME);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(sMessage, colour, false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::Print(const std::wstring&amp; sMessage)\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(MessageType::MSG_GAME);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(sMessage, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::Print(const std::string&amp; sMessage)\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(MessageType::MSG_GAME);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(ToWString(sMessage), D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nvoid Console::AddBlankLine()\r\n{\r\n\u00a0\u00a0 \u00a0Line* pLine = new Line(MessageType::MSG_BLANK);\r\n\r\n\u00a0\u00a0 \u00a0pLine-&gt;AddTextElement(L&quot;&quot;, D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f), false);\r\n\r\n\u00a0\u00a0 \u00a0AddLine(pLine);\r\n}\r\n\r\nbool Console::IsVisible()\r\n{\r\n\u00a0\u00a0\u00a0 return m_state != HIDDEN;\r\n}\r\n\r\nvoid Console::AddToHistory(const std::wstring&amp; cmd)\r\n{\r\n\u00a0\u00a0 \u00a0m_pHistory-&gt;AddCommand(cmd);\r\n}\r\n\r\nbool Console::IsCharAuthorized(const wchar_t key)\r\n{\r\n\u00a0\u00a0 \u00a0for (unsigned int c = 0; c &lt; m_aLegalChars.size(); c++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_aLegalChars1 == key)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return true;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return false;\r\n}\r\n\r\nvoid Console::AddBlinkingTextElement(TextElement* elem)\r\n{\r\n\u00a0\u00a0\u00a0 m_blinkingTextElements.push_back(elem);\r\n}\r\n\r\nvoid Console::RemoveAllBlinkingTextElements()\r\n{\r\n\u00a0\u00a0 \u00a0m_blinkingTextElements.clear();\r\n}\r\n\r\nvoid Console::Clear()\r\n{\r\n\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_lines.size(); i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0delete m_lines[i];\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_lines.clear();\r\n\r\n\u00a0\u00a0 \u00a0RemoveAllBlinkingTextElements();\r\n\r\n\u00a0\u00a0 \u00a0m_iLinesOffset = 0;\r\n\u00a0\u00a0 \u00a0m_iLinesStart = 0;\r\n}\r\n\r\nvoid Console::LoadDefaultCommands()\r\n{\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;AddCommand( new Command_QUIT() );\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;AddCommand( new Command_HELP() );\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;AddCommand( new Command_EXIT() );\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;AddCommand( new Command_VERSION() );\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;AddCommand( new Command_CLS() );\r\n}\r\n\r\nvoid Console::TabComplete()\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0std::wstring sCurrentCommandLine = m_pPrompt-&gt;GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0std::vector&lt;std::string&gt; cmds;\r\n\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;GetCommandsNames(cmds);\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\/\/ On stocke toutes les commandes qui commence par le m\u00eame d\u00e9but que la saisie\r\n\u00a0\u00a0 \u00a0\/\/ et ceci lorsque la liste est vide\r\n\u00a0\u00a0 \u00a0if (sCurrentCommandLine.length() &gt; 0 &amp;&amp; m_tabHistory.empty())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (int i = 0; i &lt; cmds.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring cmd = ToWString(cmds[i]);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (cmd.size() &gt; sCurrentCommandLine.size())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (cmd.substr(0, sCurrentCommandLine.size()) == sCurrentCommandLine)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_tabHistory.push_back(cmd);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\/\/ Sinon on stocke toutes les commandes existantes\r\n\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (int i = 0; i &lt; cmds.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring cmd = ToWString(cmds[i]);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_tabHistory.push_back(cmd);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On \u00e9change les commandes de mani\u00e8re circulaire dans la liste\r\n\u00a0\u00a0 \u00a0if (!m_tabHistory.empty())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring command = m_tabHistory.front();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_tabHistory.pop_front();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_tabHistory.push_back(command);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(command);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::SoloKeyPressed(const KeyEvent&amp; arg)\r\n{\r\n\u00a0\u00a0 \u00a0if (arg.key == DIK_F1)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ToggleState();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (!IsVisible())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (IsCharAuthorized(arg.text))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring wStr;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0wStr.push_back( arg.text );\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;AppendCommandLineText(wStr);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/* On reset l'historique de selection automatique\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0de commande par tabulation *\/\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_tabHistory.clear();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (arg.key == DIK_RETURN)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (!m_pPrompt-&gt;HasText())\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0ResetScrollingPosition();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DataParameters param;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::wstring sCommandLineCaption = m_pPrompt-&gt;GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0GetCommandLineArguments(sCommandLineCaption, param);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (param.getParametersCount() &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::string sCommandName = param.getParameterAsString(&quot;0&quot;);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/ On appel la commande sp\u00e9cifi\u00e9e\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CONSOLE_COMMANDS_MANAGER-&gt;InvokeCommand(sCommandName, param);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0AddToHistory( sCommandLineCaption );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;Clear();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (arg.key == DIK_LEFTARROW)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;MoveCursorToLeft();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (arg.key == DIK_RIGHTARROW)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;MoveCursorToRight();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (arg.key == DIK_BACK)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DeletePreviousCharacter();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (arg.key == DIK_DELETE)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DeleteNextCharacter();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (arg.key == DIK_TAB)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0TabComplete();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;ResetCursorPos();\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if(arg.key == DIK_UP)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::wstring sCommand = m_pHistory-&gt;GetPrevious();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sCommand != EMPTY)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(sCommand);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;ResetCursorPos();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if(arg.key == DIK_DOWN)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0const std::wstring sCommand = m_pHistory-&gt;GetNext();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sCommand != EMPTY)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(sCommand);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;ResetCursorPos();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::SoloKeyReleased(const KeyEvent&amp; arg)\r\n{\r\n}\u00a0\u00a0 \u00a0\r\n\r\nvoid Console::RepetitiveKeyPressed(const KeyEvent&amp; arg)\r\n{\r\n\u00a0\u00a0 \u00a0if (!IsVisible())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (arg.key == (DIK_PGUP))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0IncreaseScrollingPosition();\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (arg.key == (DIK_PGDN))\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0DescreaseScrollingPosition();\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::RepetitiveKeyReleased(const KeyEvent&amp; arg)\r\n{\r\n}\u00a0\u00a0 \u00a0\r\n\r\nvoid Console::GetCommandLineArguments(const std::wstring&amp; sCommandLine, DataParameters&amp; param)\r\n{\r\n\u00a0\u00a0 \u00a0std::string sArgument = &quot;&quot;;\r\n\u00a0\u00a0 \u00a0unsigned int iArgumentCount = 0;\r\n\r\n\u00a0\u00a0 \u00a0for (unsigned int c = 0; c &lt; sCommandLine.length(); c++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sCommandLine1 == ' ')\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sArgument.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0param.setParam(iArgumentCount, sArgument);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iArgumentCount++;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sArgument = &quot;&quot;;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sArgument += sCommandLine1;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0if (sArgument.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0param.setParam(iArgumentCount, sArgument);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::Render(float fTimeElapsedSinceLastFrame)\r\n{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0if (!IsVisible())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0UpdateSprites(fTimeElapsedSinceLastFrame);\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On commence par afficher le texte \u00e0 partir d'une certaine marge\r\n\u00a0\u00a0 \u00a0float iLastTextElementXPos = CONSOLE_LINE_BEGINNING_WIDTH;\r\n\u00a0\u00a0 \u00a0int iLineID = 0;\r\n\u00a0\u00a0 \u00a0float fLastLineYPos = 0;\r\n\u00a0\u00a0 \u00a0float fScroll = -(m_fScrollOffset * m_fConsoleHeight);\r\n\u00a0\u00a0 \u00a0float fHeightPadding = m_fCharHeight \/ 2 + CONSOLE_HEIGHT_PADDING;\r\n\r\n\u00a0\u00a0 \u00a0m_pConsoleTextSprite-&gt;Begin(D3DX10_SPRITE_SAVE_STATE);\r\n\u00a0\u00a0 \u00a0for (unsigned int i = m_iLinesStart; i &lt; m_lines.size() - m_iLinesOffset; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0Line* pLine = m_lines[i];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::vector&lt;TextElement*&gt; elems;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pLine-&gt;GetTextElements(elems);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (unsigned int j = 0; j &lt; elems.size(); j++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0TextElement* pElement = elems[j];\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0float fLastLineYPos = (float) (iLineID) * fHeightPadding;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0RECT rectangle = {iLastTextElementXPos, fScroll + fLastLineYPos, 0, 0};\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0D3DXCOLOR color = pElement-&gt;GetColour();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0std::wstring sText = pElement-&gt;GetText();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pFont-&gt;DrawText(m_pConsoleTextSprite, sText.c_str(), -1, &amp;rectangle, DT_NOCLIP, color);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iLastTextElementXPos += GetStringLength( pElement-&gt;GetText() ) ;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iLastTextElementXPos = CONSOLE_LINE_BEGINNING_WIDTH;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0iLineID++;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\/******** Command Line Prompt ********\/\r\n\r\n\u00a0\u00a0 \u00a0const std::wstring sPromptText = m_pPrompt-&gt;GetPromptText();\r\n\u00a0\u00a0 \u00a0const std::wstring sCommandLineText = m_pPrompt-&gt;GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0float y = fScroll + (float) (m_iMaxLinesDisplayed) * fHeightPadding;\r\n\r\n\u00a0\u00a0 \u00a0RECT promptRectangle = {CONSOLE_LINE_BEGINNING_WIDTH, y, 0, 0};\r\n\u00a0\u00a0 \u00a0RECT commandLineRectangle = {sPromptText.length() * m_fCharWidth, y, 0, 0};\r\n\r\n\u00a0\u00a0 \u00a0D3DXCOLOR promptColor(1.0f, 0.85f, 0.0f, 1.0f);\r\n\u00a0\u00a0 \u00a0D3DXCOLOR commandLineColor(0.0f, 0.3f, 1.0f, 1.0f);\r\n\r\n\u00a0\u00a0 \u00a0m_pFont-&gt;DrawText(m_pConsoleTextSprite, sPromptText.c_str(), -1, &amp;promptRectangle, DT_NOCLIP, promptColor);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0m_pFont-&gt;DrawText(m_pConsoleTextSprite, sCommandLineText.c_str(), -1, &amp;commandLineRectangle, DT_NOCLIP, commandLineColor);\r\n\r\n\u00a0\u00a0 \u00a0float fBorderScroll = y + m_fCharHeight + CONSOLE_HEIGHT_PADDING \/ 2;\r\n\u00a0\u00a0 \u00a0m_pBorderImage-&gt;SetPosition(0, fBorderScroll);\r\n\r\n\u00a0\u00a0 \u00a0float fY = y + (m_fCharHeight \/ 2 - CONSOLE_HEIGHT_PADDING \/ 2);\r\n\u00a0\u00a0 \u00a0m_pPrompt-&gt;Update(fY);\r\n\r\n\u00a0\u00a0\u00a0 m_pConsoleTextSprite-&gt;End();\r\n\r\n\u00a0\u00a0 \u00a0\/\/ On affiche le prompt apr\u00e8s tous les pr\u00e9c\u00e9dents rendus\r\n\u00a0\u00a0 \u00a0m_pPrompt-&gt;Render();\r\n}\r\n\r\nvoid Console::UpdateSprites(float fTimeElapsedSinceLastFrame)\r\n{\r\n\u00a0\u00a0 \u00a0if (!IsVisible())\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0m_pBackgroudImage-&gt;Render();\r\n\u00a0\u00a0 \u00a0m_pBorderImage-&gt;Render();\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Montrer\r\n\u00a0\u00a0 \u00a0if (m_state == MOVING_DOWN)\r\n\u00a0\u00a0 \u00a0{\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_fScrollOffset -= fTimeElapsedSinceLastFrame * CONSOLE_MOVE_SPEED;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_fScrollOffset &lt;= 0.0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_fScrollOffset = 0.0;\r\n\r\n\u00a0 \u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 SetState(SHOWN);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pBackgroudImage-&gt;SetPosition(0, -m_fScrollOffset * m_fConsoleHeight);\r\n\u00a0\u00a0\u00a0 }\r\n\u00a0\r\n\u00a0\u00a0\u00a0 \/\/ Cacher\r\n\u00a0\u00a0 \u00a0if (m_state == MOVING_UP)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_fScrollOffset += fTimeElapsedSinceLastFrame * CONSOLE_MOVE_SPEED;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (m_fScrollOffset &gt;= 1.0)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_fScrollOffset = 1.0;\r\n\r\n\u00a0 \u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0 SetState(HIDDEN);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pBackgroudImage-&gt;SetPosition(0, -m_fScrollOffset * m_fConsoleHeight);\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Mise \u00e0 jour des \u00e9l\u00e9ments qui alterne en couleur alpha\r\n\u00a0\u00a0 \u00a0if (m_state == SHOWN)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0static float alpha = 0.0f;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_elemState == TransparencyState::FADE_IN)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0alpha -= fTimeElapsedSinceLastFrame;\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (alpha &lt; 0.0f)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_elemState = TransparencyState::FADE_OUT;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (m_elemState == TransparencyState::FADE_OUT)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0alpha += fTimeElapsedSinceLastFrame;\r\n\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (alpha &gt; 1.0f)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_elemState = TransparencyState::FADE_IN;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (unsigned int i = 0; i &lt; m_blinkingTextElements.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0TextElement* pTextElem = m_blinkingTextElements[i];\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0static D3DXCOLOR color = pTextElem-&gt;GetColour();\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0pTextElem-&gt;SetColour(D3DXCOLOR(color.r, color.g, color.b, alpha));\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetArrowTransparency(alpha);\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\n\/* todo : utils.cpp *\/\r\nstd::string Console::ToString(const std::wstring&amp; sText)\r\n{\r\n\u00a0\u00a0 \u00a0std::string text = &quot;&quot;;\r\n\r\n\u00a0\u00a0 \u00a0text.assign(sText.begin(), sText.end());\r\n\r\n\u00a0\u00a0 \u00a0return text;\r\n}\r\n\r\nstd::wstring Console::ToWString(const std::string&amp; sText)\r\n{\r\n\u00a0\u00a0 \u00a0std::wstring text = L&quot;&quot;;\r\n\r\n\u00a0\u00a0 \u00a0text.assign(sText.begin(), sText.end());\r\n\r\n\u00a0\u00a0 \u00a0return text;\r\n}\r\n\r\nunsigned int Console::GetWidth()\r\n{\r\n\u00a0\u00a0 \u00a0return m_fConsoleWidth;\r\n}\r\n\r\nbool Console::TextIsOutOfWidth(const std::wstring sText)\r\n{\r\n\u00a0\u00a0 \u00a0\/\/ On applique un certain espace entre les bords de la console\r\n\u00a0\u00a0 \u00a0unsigned int iTotalWidth = GetStringLength(sText) + CONSOLE_LINE_BEGINNING_WIDTH * 4;\r\n\r\n\u00a0\u00a0 \u00a0return iTotalWidth &gt;= GetWidth();\r\n}\r\n\r\nvoid Console::ResetScrollingPosition()\r\n{\r\n\u00a0\u00a0 \u00a0if (m_lines.size() &gt; m_iMaxLinesDisplayed)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for (int i = 0; i &lt; m_lines.size(); i++)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (m_iLinesOffset &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesOffset--;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_iLinesStart++;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nunsigned int Console::GetCharactWidth()\r\n{\r\n\u00a0\u00a0 \u00a0return m_fCharWidth;\r\n}\r\n\r\nvoid Console::DeleteNextCharacter()\r\n{\r\n\u00a0\u00a0 \u00a0unsigned int iPromptCursorPos = m_pPrompt-&gt;GetCursorPos();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sCurrentCommandLine = m_pPrompt-&gt;GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sFirstPart = sCurrentCommandLine.substr(0, iPromptCursorPos);\r\n\u00a0\u00a0 \u00a0std::wstring sLastPart = sCurrentCommandLine.substr(iPromptCursorPos, sCurrentCommandLine.length());\r\n\r\n\u00a0\u00a0 \u00a0if (sFirstPart.length() &gt;= 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sLastPart.length() &gt; 0 )\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sLastPart.erase(0, 1);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(sFirstPart + sLastPart);\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n\r\nvoid Console::DeletePreviousCharacter()\r\n{\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0unsigned int iPromptCursorPos = m_pPrompt-&gt;GetCursorPos();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sCurrentCommandLine = m_pPrompt-&gt;GetCommandLineText();\r\n\r\n\u00a0\u00a0 \u00a0std::wstring sFirstPart = sCurrentCommandLine.substr(0, iPromptCursorPos);\r\n\u00a0\u00a0 \u00a0std::wstring sLastPart = sCurrentCommandLine.substr(iPromptCursorPos, sCurrentCommandLine.length());\r\n\r\n\u00a0\u00a0 \u00a0if (sFirstPart.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if (sLastPart.length() &gt; 0 )\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sFirstPart.pop_back();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(sFirstPart + sLastPart);\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;MoveCursorToLeft();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0else if (sCurrentCommandLine.length() &gt; 0)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0sCurrentCommandLine.pop_back();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;SetText(sCurrentCommandLine);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0m_pPrompt-&gt;MoveCursorToLeft();\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n}\r\n<\/pre>\n<p style=\"text-align: left;\"><strong>R\u00e9sum\u00e9 :<\/strong><\/p>\n<p style=\"text-align: left;\">Voici le code de cet article : <a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/data\/DirectXConsole.zip\">archive<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : Parfois dans un jeu on a besoin de configurer ou de param\u00e9trer le gameplay ou les m\u00e9canismes du jeu directement dans le programme. Pr\u00e9requis : &#8211; Savoir un peu utiliser DirectX 10 &#8211; Savoir lire du C++ Explications : On peut entrer et ex\u00e9cuter des commandes (toutes tr\u00e8s utiles) pour modifier les variables [&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\/687"}],"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=687"}],"version-history":[{"count":40,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions"}],"predecessor-version":[{"id":5185,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/687\/revisions\/5185"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}