我在使用 XNA 4.0 创建输入框时遇到了困难。
我已经可以在 inputTextbox 中绘制和输入文本,但是当我输入时出现两个问题。
- 当我按住一个键时,我想它会写很多次那个字符,但事实并非如此。我不知道为什么它没有。
- 按键时屏幕闪烁,我该如何解决?我已经尝试过翻转后缓冲区或类似的东西太糟糕了,这不是解决方案
这是属于文本框的代码:
public TextboxInput(GraphicsDevice graphicsDevice, int width, SpriteFont font)
{
this.font = font;
var fontMeasurements = font.MeasureString("dfgjlJL");
var height = (int) fontMeasurements.Y;
renderTarget = new RenderTarget2D(graphicsDevice, width, height);
Text = new StringBuilder();
this.graphicsDevice = graphicsDevice;
spriteBatch = new SpriteBatch(graphicsDevice);
}
public void Update(GameTime gameTime)
{
if (!HasFocus)
{
return;
}
var keyboard = Keyboard.GetState();
foreach (var key in keyboard.GetPressedKeys())
{
if (!lastKeyboard.IsKeyUp(key))
{
continue;
}
if (key == Keys.Delete ||
key == Keys.Back)
{
if (Text.Length == 0)
{
continue;
}
Text.Length--;
renderIsDirty = true;
continue;
}
char character;
if (!characterByKey.TryGetValue(key, out character))
{
continue;
}
if (keyboard.IsKeyDown(Keys.LeftShift) ||
keyboard.IsKeyDown(Keys.RightShift))
{
character = Char.ToUpper(character);
}
Text.Append(character);
renderIsDirty = true;
}
lastKeyboard = keyboard;
}
public void PreDraw()
{
if (!renderIsDirty)
{
return;
}
graphicsDevice.Clear(BackgroundColor);
renderIsDirty = false;
graphicsDevice.SetRenderTarget(renderTarget);
spriteBatch.Begin();
spriteBatch.DrawString(font, Text, Vector2.Zero, ForegroundColor);
spriteBatch.End();
graphicsDevice.SetRenderTargets(null);
}
public void Draw()
{
spriteBatch.Begin();
spriteBatch.Draw(renderTarget, Position, Color.White);
spriteBatch.End();
}