2010-12-16 5 views
3

Я знаю, как рисовать текст в XNA, но я реализую дизайнер уровня, который потребует от пользователя ввода текста в пользовательский интерфейс. У меня была небольшая ошибка в Google, но не удалось найти, как реализовать редактируемое текстовое поле. Для этого нет ничего в этом?XNA Редактируемое текстовое поле

ответ

3

вы можете использовать какое-то графический интерфейс библиотеки как http://nuclexframework.codeplex.com

или использование WinForms http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1

+0

Я, наверное, должен был упомянуть, что проектировщик уровня почти закончен. Просто нужен простой способ добавления редактируемого текстового поля :( – DrLazer 2010-12-17 16:48:01

0

Вам нужно будет создать свою собственную область, в которую пользователь может щелкнуть. Когда они это делают, вам нужно захватить нажатия клавиш.

1

Вы считаете, что используете редактор уровней для вашей игры embedding XNA in WinForms?

+0

Ха-ха. Я сказал, что шесть месяцев назад ты сказал. Редактор уровней близок к завершению, это буквально одно из единственных возможных полей, которые нуждаются в редактировании с текстом. Grrrr – DrLazer 2010-12-17 16:45:51

0

Чтобы идти вместе с некоторыми из других предложений по этой теме, вы можете также использовать WPF и просто оказать XNA для пользовательского элемента управления в xaml. Там отличный пост в блоге Ник Gravelyn о том, как сделать это здесь:
http://blogs.msdn.com/b/nicgrave/archive/2010/07/25/rendering-with-xna-framework-4-0-inside-of-a-wpf-application.aspx

Большая часть о том, что вы можете использовать такие методы, как MVVM то, чтобы написать свой редактор :-)

1

Если нужно просто простой способ ввести небольшое количество текста создать класс 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; 

Это очень простой и грязный способ сделать это

Смежные вопросы