Vâng, nó hoàn toàn hợp lý, và tôi có thể để nó ở đó!
... nhưng cá nhân tôi thích đóng gói hơn một chút. Vì vậy, thay vì quản lý trạng thái bên trong Game
lớp và cung cấp quyền truy cập toàn cầu vào nó, tôi thích bọc nó trong lớp riêng hơn.
Đây là một ví dụ từ bộ nhớ. Không chắc chắn nếu tôi bỏ lỡ một số chi tiết nhưng điều quan trọng là ý tưởng chung:
public static class InputManager
{
public static void Update()
{
_previousKeyboardState = _currentKeyboardState;
_currentKeyboardState = Keyboard.GetState();
}
public static bool IsKeyDown(Keys key)
{
return _currentKeyboardState.IsKeyDown(key);
}
public static bool IsKeyUp(Keys key)
{
return _currentKeyboardState.IsKeyUp(key);
}
public static bool OnKeyDown(Keys key)
{
return _currentKeyboardState.IsKeyDown(key) && _previousKeyboardState.IsKeyUp(key);
}
public static bool OnKeyUp(Keys key)
{
return _currentKeyboardState.IsKeyUp(key) && _previousKeyboardState.IsKeyDown(key);
}
private static KeyboardState _currentKeyboardState;
private static KeyboardState _previousKeyboardState;
}
Sau đó, ở đầu Game.Update
tôi chỉ cần gọi Cập nhật trên trình quản lý:
InputManager.Update();
Và cuối cùng ở mọi nơi khác trong trò chơi, tôi có thể sử dụng trình bao bọc trực tiếp:
if(InputManager.OnKeyDown(Keys.Space))
{
// Shoot once
}
Một số ưu điểm:
- Giống như trong giải pháp của bạn, chỉ có một nơi trong ứng dụng cần quản lý trạng thái bàn phím hiện tại và trước đó.
- Nhưng thay vì làm ô nhiễm lớp trò chơi bằng cách xử lý bàn phím, nó được gói gọn trong lớp riêng của nó chỉ vì điều đó.
- Lớp này là tĩnh khiến nó có thể truy cập toàn cầu, do đó, nếu bạn không muốn, bạn không cần cung cấp quyền truy cập toàn cầu vào lớp trò chơi của mình.
- Nó cũng dễ dàng sử dụng lại - nếu bạn bắt đầu một dự án mới, bạn có thể bỏ lớp đó vào và bạn sẽ ổn.