Tôi có một giao diện (ICamera) được triển khai bởi 2 lớp (FreeCamera, StaticCamera). Các lớp học được kế thừa từ GameComponent.Dịch vụ trò chơi thay đổi XNA tự động trong thời gian chạy
Ví dụ definiton:
public class FreeCamera : GameComponent, ICamera
{
...
}
Bây giờ tôi đang bổ sung thêm các lớp học để các thành phần game và đăng ký một trong các thành phần cho một dịch vụ trò chơi
private FreeCamera freeCam;
private StaticCamera staticCam;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
freeCam = new FreeCamera(this) { Enabled = true };
staticCam = new StaticCamera(this) { Enabled = false };
Services.AddService(typeof(ICamera, freeCam);
Components.Add(freeCam);
Components.Add(staticCam);
...
}
Sau đó, tôi muốn thay đổi nhà cung cấp cho dịch vụ trong luồng ứng dụng với sự trợ giúp của chức năng chuyển đổi
namespace Game1
{
protected override void Update(GameTime gameTime)
{
var keyboard = Keyboard.GetState();
if(keyboard.IsKeyDown(Keys.C))
{
if(freeCam.Enabled)
{
Services.RemoveService(typeof(ICamera));
Services.AddService(typeof(ICamera, staticCam);
freeCam.Enabled = !freeCam.Enabled;
staticCam.Enabled = !staticCam.Enabled;
}
else
{
Services.RemoveService(typeof(ICamera));
Services.AddService(typeof(ICamera, freeCam);
freeCam.Enabled = !freeCam.Enabled;
staticCam.Enabled = !staticCam.Enabled;
}
}
base.Update(gameTime);
}
}
Th e StaticCamera chỉ lấy đầu vào bằng chuột (bạn có thể xoay máy ảnh), FreeCamera cũng có thể di chuyển bằng cách nhập bằng bàn phím. Khi tôi gọi phương thức trên (bằng cách nhấn C trên bàn phím), lớp FreeCamera bị tắt nhưng chế độ xem có vẻ bị đóng băng và không phản ứng với bất kỳ đầu vào nào. Khi tôi gọi lại phương thức sau một thời gian ngắn, FreeCamera được kích hoạt lại và mọi thứ hoạt động như mong đợi.
Bây giờ tôi có 2 câu hỏi về vấn đề này:
- Có thể thay đổi nhà cung cấp dịch vụ của một dịch vụ trò chơi trong vòng lặp trò chơi?
- Có cách tiếp cận tốt hơn để xử lý các loại máy ảnh khác nhau trong trò chơi và chuyển đổi giữa chúng dễ dàng không?
Cảm ơn bạn đã giúp đỡ.
Chỉ cần một mẹo nhanh chóng cho bây giờ: 'keyboard.IsKeyDown (Keys.C) && keyboardLastFrame.IsKeyUp (Keys.C)' –