【问题标题】:XNA Editable text fieldXNA 可编辑文本字段
【发布时间】:2011-05-26 14:44:17
【问题描述】:

我知道如何在 XNA 中绘制文本,但我正在实现一个关卡设计器,它需要用户在 UI 中输入文本。我在 Google 上玩了一会儿,但找不到如何实现可编辑的文本字段。框架中没有为此内置任何内容吗?

【问题讨论】:

    标签: c# user-interface xna


    【解决方案1】:

    【讨论】:

    • 我可能应该提到关卡设计师快完成了。只需要一些简单的方法来添加可编辑的文本字段:(
    • 因为它是在 Windows 上,你总是可以让“编辑”按钮弹出一个带有 winforms 或 wpf 文本框的小弹出窗体,然后将该值发送回你的 xna 应用程序。
    • 好吧,我想我可以试试放入其中一个 nuclex 盒子。我希望这是多平台,所以没有必要将自己限制在 Windows 上。
    【解决方案2】:

    您是否考虑过通过embedding XNA in WinForms 为您的游戏实现关卡编辑器?

    【讨论】:

    • 哈哈。我只是你在六个月前说过。关卡编辑器即将完成,这实际上是唯一可能需要使用文本进行编辑的字段之一。呸呸呸
    【解决方案3】:

    如果只需要一个简单的方法来输入少量的文本创建一个类 kbHandler

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Microsoft.Xna.Framework.Input;
    
    namespace CodeName
    {
    public class KbHandler
    {
        private Keys[] lastPressedKeys;
        public string tekst = "";
    
        public KbHandler()
        {
            lastPressedKeys = new Keys[0];
        }
    
        public void Update()
        {
            KeyboardState kbState = Keyboard.GetState();
            Keys[] pressedKeys = kbState.GetPressedKeys();
    
            //check if any of the previous update's keys are no longer pressed
            foreach (Keys key in lastPressedKeys)
            {
                if (!pressedKeys.Contains(key))
                    OnKeyUp(key);
            }
    
            //check if the currently pressed keys were already pressed
            foreach (Keys key in pressedKeys)
            {
                if (!lastPressedKeys.Contains(key))
                    OnKeyDown(key);
            }
    
            //save the currently pressed keys so we can compare on the next update
            lastPressedKeys = pressedKeys;
        }
    
    //Create your own   
    private void OnKeyDown(Keys key)
        {
            switch (key)
            {
                case Keys.D0:
                    tekst += "0";
                    break;
                case Keys.D1:
                    tekst += "1";
                    break;
                case Keys.D2:
                    tekst += "2";
                    break;
                case Keys.D3:
                    tekst += "3";
                    break;
                case Keys.D4:
                    tekst += "4";
                    break;
                case Keys.D5:
                    tekst += "5";
                    break;
                case Keys.D6:
                    tekst += "6";
                    break;
                case Keys.D7:
                    tekst += "7";
                    break;
                case Keys.D8:
                    tekst += "8";
                    break;
                case Keys.D9:
                    tekst += "9";
                    break;
                case Keys.NumPad0:
                    tekst += "0";
                    break;
                case Keys.NumPad1:
                    tekst += "1";
                    break;
                case Keys.NumPad2:
                    tekst += "2";
                    break;
                case Keys.NumPad3:
                    tekst += "3";
                    break;
                case Keys.NumPad4:
                    tekst += "4";
                    break;
                case Keys.NumPad5:
                    tekst += "5";
                    break;
                case Keys.NumPad6:
                    tekst += "6";
                    break;
                case Keys.NumPad7:
                    tekst += "7";
                    break;
                case Keys.NumPad8:
                    tekst += "8";
                    break;
                case Keys.NumPad9:
                    tekst += "9";
                    break;
                case Keys.OemPeriod:
                    tekst += ".";
                    break;
                case Keys.Back:
                    if (tekst.Length > 0)
                    {
                        tekst = tekst.Remove(tekst.Length - 1, 1);
                    }                    
                    break;
    
            }
    
        }
    
        private void OnKeyUp(Keys key)
        {
            //do stuff
        }
    }
    }
    

    在更新循环中

    kb.Update();
    string text = kb.tekst;
    

    这是一种非常简单而肮脏的方法

    【讨论】:

      【解决方案4】:

      您必须创建自己的用户可以点击进入的区域。当他们这样做时,您需要捕获按键。

      【讨论】:

        【解决方案5】:

        要遵循此线程上的其他一些建议,您还可以使用 WPF 并将 XNA 呈现给 xaml 中的自定义用户控件。 Nick Gravelyn 有一篇很棒的博客文章,介绍了如何在此处执行此操作:
        http://blogs.msdn.com/b/nicgrave/archive/2010/07/25/rendering-with-xna-framework-4-0-inside-of-a-wpf-application.aspx

        这样做的好处是您可以使用 MVVM 之类的技术来编写您的编辑器 :-)

        【讨论】:

          猜你喜欢
          • 2011-08-02
          • 1970-01-01
          • 1970-01-01
          • 2021-10-10
          • 2019-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多