Первый проект это сам я не делал этого я взял его из GitHub:Как я могу исправить Index Out Of Range Exception char?
Проблема исключение происходит, когда я пытаюсь использовать любой 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];
Я пытался спросить у владельца об этой проблеме и до сих пор все, что он сказал мне это:
«Похоже, он пытается привлечь персонаж, который он еще не подготовил ... »
Я попытался сузить код здесь настолько, насколько могу, но все это соединяет друг друга.
Каков размер '_charRects' при попытке получить к нему доступ? В вашем примере вы получаете доступ к элементу 163-33 = 130. Поэтому, если '_charRects' содержит менее 131 элемента, вы получаете исключение, о котором вы сообщаете. –
Добавление этого метода GetCharRect заставило его работать: var index = c - StartChar; if (index <0 || index> = _charRects.Length), но это не решение проблемы, это просто как обход. Я имею в виду, теперь это работает, но я не отслеживал и не исправлял источник проблемы. Не уверен, знаю ли я, как это сделать. –
Дэвид для вашего вопроса, когда исключение происходит _charRects содержит 94 элемента. –