2012-04-14 39 views
6

Tôi đang cố gắng thực hiện nhập văn bản bàn phím để trò chuyện trong trò chơi, nhập tên ký tự, lưu tên tệp, v.v.Nhập văn bản vào XNA (để nhập tên, trò chuyện)

Tôi đang làm phiền với KeyboardState đang thử để có được biểu tượng được thêm vào mới nhất để dịch thành ký tự mà tôi có thể thêm vào chuỗi đầu vào của mình, nhưng dường như sắp xếp mảng các phím hiện đang được bấm theo thứ tự nào đó (tôi đặt cược nó được sắp xếp theo mã khóa), vì vậy tôi không thể dễ dàng tìm thấy phím nào được nhấn cuối cùng để thêm nó vào chuỗi đầu vào.

Có cách nào dễ dàng để phát hiện phím văn bản được nhấn cuối cùng (bao gồm các tình huống khi nhấn nhiều phím, vì thỉnh thoảng mọi người), hoặc dễ sử dụng một số giải pháp hiện có?

Tôi đang học C# và XNA, vì vậy tôi muốn tự mình làm được, nhưng cuối cùng tôi muốn trò chơi của mình hoạt động.

Trả lời

6

Để xử lý nhập văn bản, bạn sẽ cần biết khi nào một phím được nhấn hoặc được thả ra. Thật không may, KeyboardState của XNA không thực sự hữu ích với điều này, vì vậy bạn phải tự mình làm điều đó. Về cơ bản, bạn chỉ cần so sánh các phím PressedKeys cập nhật hiện tại với các phím PressedKeys từ bản cập nhật trước.

public class KbHandler 
{ 
    private Keys[] lastPressedKeys; 

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

    private void OnKeyDown(Keys key) 
    {   
     //do stuff 
    } 

    private void OnKeyUp(Keys key) 
    { 
     //do stuff 
    } 
} 

Cung cấp cho lớp Trò chơi của bạn KbHandler và gọi đó là phương thức cập nhật từ phương thức cập nhật trò chơi của bạn.

(BTW có lẽ là một cách hiệu quả hơn để so sánh hai mảng hơn với foreach và Có, nhưng với rất ít mặt hàng để so sánh tôi nghi ngờ nó sẽ thành vấn đề.)

+0

Cảm ơn, đây là loại bản ngã tôi đang tìm kiếm. – user1306322

0

Bạn có thể thử ví dụ được liệt kê here

KeyboardState keybState = Keyboard.GetState(); 
if (keybState.IsKeyDown(Keys.Left)) { 
    // process left key 
} 
if (keybState.IsKeyDown(Keys.Right)) { 
    // process right key 
} 

này sẽ xử lý nhiều phím bấm cùng một lúc. Nếu bạn muốn tránh điều đó, hãy thêm một số else trước số if thứ hai (và các số sau)

Ngoài ra, một phím được giữ sẽ kích hoạt nhiều sự kiện từ chối - nếu điều này không được mong muốn, bạn sẽ cần phải giới thiệu biến trạng thái mà bạn lật khi phím đó không hoạt động và khi nó không và tiến hành theo trạng thái của nó khi khóa nhấn

+0

Tôi đang cố gắng để đọc ký tự văn bản, không phím mũi tên. – user1306322

+0

Rõ ràng, bạn có thể đọc những người khác: [MSDN] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.input.keys.aspx), ví dụ: 'Keys.A' thay vì' Keys.Left' – Attila

+0

Tôi nghi ngờ bạn có nghĩa là, và nó không phải là rất mát mẻ để gõ một kịch bản rõ ràng cho mọi trường hợp có thể, và có rất nhiều trường hợp trong ascii, hãy để một mình unicode. Bạn có biết cách khác không? – user1306322

Các vấn đề liên quan