0

XNA 4.0 で入力ボックスを作成できません。

すでにテキストを描画して inputTextbox に入力できますが、入力すると 2 つの問題が発生します。

  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