自定义inputTextBox闪烁

本文关键字:闪烁 inputTextBox 自定义 | 更新日期: 2023-09-27 18:06:12

我在使用XNA 4.0创建输入框时遇到了困难。

我已经可以在inputTextbox中绘制和输入文本,但是当我输入时,我有两个问题发生了。

  1. 当我按住一个键时,我以为它会多次写那个角色,但它没有。我不知道为什么它没有。
  2. 当我按下一个键屏幕闪烁,我怎么解决?我已经尝试过通过翻转backbuffer或类似的东西太糟糕了,这不是解决方案
下面是属于文本框的代码:
    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();
    }

自定义inputTextBox闪烁

对于闪烁,我认为你应该在你的draw方法中调用graphicsDevice.Clear(BackgroundColor)。

下面的代码说明了按住键不能获得更多字符的原因。它说只有当键的最后状态为up时才注册按键。

if (!lastKeyboard.IsKeyUp(key))
{
    continue;
}