рисование текстового поля с обрезанием текста внутри

Если это имеет значение, я использую XNA 3.1, хотя если 4.0 сильно поможет, я могу подумать о переходе.

Я пытаюсь нарисовать текстовое поле в своей игре. Я хотел бы иметь возможность отображать текст только внутри текстового поля (так что если строка длиннее, то на краю текстового поля отображается только, возможно, неполный символ).

Проблема в том, что либо текст не обрезается, в этом случае он просто выходит за границы текстового поля, либо, используя предложение, описанное здесь - http://social.msdn.microsoft.com/forums/en-US/xnagamestudioexpress/thread/9c395c84-2257-4103-b75c-d9378425cc09 - я обнаружил, что если я использую код:

spriteBatch.GraphicsDevice.RenderState.ScissorTestEnable = true;
spriteBatch.GraphicsDevice.ScissorRectangle = myTextBox.GetRectangle();

я могу получить обрезание внутри текстового поля, как я хотел бы, но, к сожалению, он не показывает ничего другого в игре вообще! В сообщении, где предлагается использовать ScissorRectangle, говорится, что это нужно делать на каждом SpriteBatch. Это навело меня на мысль, что мне нужен новый SpriteBatch только для этого фрагмента. Я попробовал создать новый SpriteBatch, используя графическое устройство существующего (new SpriteBatch(spriteBath.GraphicsDevice)), а затем изменить его, но поскольку это ссылка, то возникла та же проблема, поэтому я решил, что мне нужно либо как-то клонировать объекты SpriteBatch или GraphicsDevice, либо создать новое GraphicsDevice (я не был уверен, что нужно указать в параметрах последнего). Методы клонирования недоступны, и что-то мне подсказывает, что я несколько усложняю задачу, поэтому я и ввел всю эту предысторию.

Если я хочу отобразить текстовое поле с обрезанным текстом, является ли новый SpriteBatch с этим ScissorRectangle лучшим способом продвижения вперед (кажется, он хорошо работает), и если да, то как мне получить новый SpriteBatch, чтобы я мог просто отобразить текстовое поле с обрезанным текстом, но остальная часть игры рисовалась нормально? Я пытался создать новый спрайтбатч одновременно с созданием основного, но поскольку GraphicsDevice должен быть одинаковым, я не мог сделать так, чтобы один менялся, а другой нет.

Большое спасибо. Если я упустил какие-либо полезные детали, пожалуйста, дайте мне знать - на данный момент я понятия не имею, что может иметь значение.

0
задан Jonathan 30 October 2011 в 17:11
поделиться