0

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

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

  1. 当我按住一个键时,我想它会写很多次那个字符,但事实并非如此。我不知道为什么它没有。
  2. 按键时屏幕闪烁,我该如何解决?我已经尝试过翻转后缓冲区或类似的东西太糟糕了,这不是解决方案

这是属于文本框的代码:

    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();
    }
4

1 回答 1

1

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

以下代码是按住时没有获得更多字符的原因。这就是说,如果键的最后状态是向上的,则只注册按键。

if (!lastKeyboard.IsKeyUp(key))
{
    continue;
}
于 2014-06-03T11:58:46.187 回答