【发布时间】:2011-05-26 14:44:17
【问题描述】:
我知道如何在 XNA 中绘制文本,但我正在实现一个关卡设计器,它需要用户在 UI 中输入文本。我在 Google 上玩了一会儿,但找不到如何实现可编辑的文本字段。框架中没有为此内置任何内容吗?
【问题讨论】:
标签: c# user-interface xna
我知道如何在 XNA 中绘制文本,但我正在实现一个关卡设计器,它需要用户在 UI 中输入文本。我在 Google 上玩了一会儿,但找不到如何实现可编辑的文本字段。框架中没有为此内置任何内容吗?
【问题讨论】:
标签: c# user-interface xna
您可以使用某种 gui 库,例如 http://nuclexframework.codeplex.com
或使用winforms http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1
【讨论】:
您是否考虑过通过embedding XNA in WinForms 为您的游戏实现关卡编辑器?
【讨论】:
如果只需要一个简单的方法来输入少量的文本创建一个类 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;
这是一种非常简单而肮脏的方法
【讨论】:
您必须创建自己的用户可以点击进入的区域。当他们这样做时,您需要捕获按键。
【讨论】:
要遵循此线程上的其他一些建议,您还可以使用 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 之类的技术来编写您的编辑器 :-)
【讨论】: