2015-05-08 2 views
0

Первый проект это сам я не делал этого я взял его из GitHub:Как я могу исправить Index Out Of Range Exception char?

spazzarama/Direct3DHook

Проблема исключение происходит, когда я пытаюсь использовать любой DirectX11 игры. Исключение произойдет в DXHookD3D11.cs

#region Draw overlay (after screenshot so we don't capture overlay as well) 
       if (this.Config.ShowOverlay) 
       { 
        // Initialise Overlay Engine 
        if (_swapChainPointer != swapChain.NativePointer || _overlayEngine == null) 
        { 
         if (_overlayEngine != null) 
          _overlayEngine.Dispose(); 

         _overlayEngine = new DX11.DXOverlayEngine(); 
         _overlayEngine.Overlays.Add(new Capture.Hook.Common.Overlay 
         { 
          Elements = 
          { 
           //new Capture.Hook.Common.TextElement(new System.Drawing.Font("Times New Roman", 22)) { Text = "Test", Location = new System.Drawing.Point(200, 200), Color = System.Drawing.Color.Yellow, AntiAliased = false}, 
           new Capture.Hook.Common.FramesPerSecond(new System.Drawing.Font("Arial", 16)) { Location = new System.Drawing.Point(5,5), Color = System.Drawing.Color.Red, AntiAliased = true } 
          } 
         }); 
         _overlayEngine.Initialise(swapChain); 

         _swapChainPointer = swapChain.NativePointer; 
        } 
        // Draw Overlay(s) 
        else if (_overlayEngine != null) 
        { 
         foreach (var overlay in _overlayEngine.Overlays) 
          overlay.Frame(); 
         _overlayEngine.Draw(); 
        } 
       } 
       #endregion 

Затем, когда он пытается рисовать() я использовал контрольную точку он собирается к классу DXOverlayEngine.cs этой линии:

_spriteEngine.DrawString(textElement.Location.X, textElement.Location.Y, textElement.Text, textElement.Color.R, textElement.Color.G, textElement.Color.B, textElement.Color.A, font); 

Тогда это происходит к DXSprite.cs в этой части:

public void DrawString(int X, int Y, string text, int R, int G, int B, int A, DXFont F) 
     { 
      Color4 blendFactor = new Color4(1.0f); 
      Color4 backupBlendFactor; 
      int backupMask; 
      var backupBlendState = _deviceContext.OutputMerger.GetBlendState(out backupBlendFactor, out backupMask); 
      _deviceContext.OutputMerger.SetBlendState(_transparentBS, blendFactor); 

      BeginBatch(F.GetFontSheetSRV()); 


      int length = text.Length; 

      int posX = X; 
      int posY = Y; 

      Color4 color; 
      Vector4 Vec = new Vector4(R > 0 ? (float)(R/255.0f) : 0.0f, G > 0 ? (float)(G/255.0f) : 0.0f, B > 0 ? (float)(B/255.0f) : 0.0f, A > 0 ? (float)(A/255.0f) : 0.0f); 
      color = new Color4(Vec); 

      for (int i = 0; i < length; ++i) 
      { 
       char character = text[i]; 

       if (character == ' ') 
        posX += F.GetSpaceWidth(); 
       else if (character == '\n') 
       { 
        posX = X; 
        posY += F.GetCharHeight(); 
       } 
       else 
       { 
        Rectangle charRect = F.GetCharRect(character); 

И последнее, что делает линию F.GetCharRect (символ) в классе DXFont.cs:

public Rectangle GetCharRect(char c) 
     { 
      Debug.Assert(_initialized); 

      return _charRects[c - StartChar]; 
     } 

Я использовал точку останова по методу GetCharRect и, например, в этом случае значение переменной c: 163 '£, а значение в переменной StartChar равно 33'! '

Затем он показывает исключение на линии:

return _charRects[c - StartChar]; 

Я пытался спросить у владельца об этой проблеме и до сих пор все, что он сказал мне это:

«Похоже, он пытается привлечь персонаж, который он еще не подготовил ... »

Я попытался сузить код здесь настолько, насколько могу, но все это соединяет друг друга.

+0

Каков размер '_charRects' при попытке получить к нему доступ? В вашем примере вы получаете доступ к элементу 163-33 = 130. Поэтому, если '_charRects' содержит менее 131 элемента, вы получаете исключение, о котором вы сообщаете. –

+0

Добавление этого метода GetCharRect заставило его работать: var index = c - StartChar; if (index <0 || index> = _charRects.Length), но это не решение проблемы, это просто как обход. Я имею в виду, теперь это работает, но я не отслеживал и не исправлял источник проблемы. Не уверен, знаю ли я, как это сделать. –

+0

Дэвид для вашего вопроса, когда исключение происходит _charRects содержит 94 элемента. –

ответ

2

Глядя в DXFont.cs он выглядит, как он готовит только символы с ASCII-кодами от 33 до 127

 const char StartChar = (char)33; 
    const char EndChar = (char)127; 
    const uint NumChars = EndChar - StartChar; 

_charRects устанавливается во время BuildFontSheetBitmap на основе этого диапазона. Вам нужно расширить диапазон, чтобы включить все символы, которые вы хотите отобразить.

+0

Тогда почему бы не изменить его от 0 до 127, так что StartChar будет (char) 0? Я имею в виду, логично ли включать все символы? Я имею в виду, почему владелец установил диапазон от 33 до 127? –

+0

Символы @ DanielHamutel, которые являются низкими, не подлежат печати. Пробел - 32, и он намеренно не включен в метод DrawString, то же самое с новой строкой (13). Я бы просто увеличил EndChar, чтобы включить персонажей, которые вам нужно рисовать. –