2010-12-16 6 views
3

XNA에서 텍스트를 그리는 방법을 알고 있지만 사용자가 UI에 텍스트를 입력해야하는 레벨 디자이너를 구현 중입니다. Google에서 약간의 문제가 있었지만 수정 가능한 텍스트 입력란을 구현하는 방법을 찾지 못했습니다. 거기에 아무것도 프레임 워크에 내장되어 있습니까?XNA 편집 가능한 텍스트 필드

답변

3

이 스레드에서 다른 제안의 일부와 함께 이동하려면 http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1

+0

아마도 레벨 디자이너가 거의 완성되었다고 언급 했어야합니다. 편집 가능한 텍스트 필드를 추가하는 간단한 방법이 필요합니다. ( – DrLazer

+0

Windows에 있기 때문에 항상 "편집"버튼을 팝업 형태로 팝업하여 winforms 또는 wpf 텍스트 상자가있는 양식을 만든 다음 그 값을 다시 보냅니다. –

+0

OK 핵 상자 중 하나에 아프다는 생각이 들지만 멀티 플랫폼이기 때문에 창문에만 제한을 두지 않아야합니다. – DrLazer

0

사용자가 클릭 할 수있는 자신 만의 영역을 만들어야합니다. 그들이 할 때 당신은 주요 프레스를 캡처해야합니다.

1

게임용 레벨 편집기를 embedding XNA in WinForms으로 구현하는 것을 고려 했습니까?

당신이 http://nuclexframework.codeplex.com

또는 사용과 같은 GUI 라이브러리의 일종을 사용할 수 있습니다

+0

하하. 6 개월 전에 당신이 말 했잖아요. 레벨 편집기가 완료되면 문자 그대로 텍스트 편집이 필요한 유일한 필드 중 하나입니다. Grrrr – DrLazer

1

:-) 편집기를 작성 MVVM 같은 기술을 사용할 수 있다는 것입니다 : 여기에이 작업을 수행하는 방법에 대한 닉 Gravelyn의 뛰어난 블로그 게시물이있다 클래스를 생성

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 
    } 
} 
} 

그리고 업데이트 루프에서 kbHandler을 적은 양의 텍스트를 입력하는 간단한 방법

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

이것은 정말 쉽고 더러운 방법입니다.

관련 문제