2010-10-29 37 views
5

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 đỡ.

+0

Chỉ cần một mẹo nhanh chóng cho bây giờ: 'keyboard.IsKeyDown (Keys.C) && keyboardLastFrame.IsKeyUp (Keys.C)' –

Trả lời

0

Cảm ơn mẹo. Tôi chỉ viết mã xuống từ đầu của tôi mà không có IDE của tôi trong tay, vì vậy xin đừng nhìn quá nhiều vào các lỗi cú pháp, v.v.

Trong trò chơi tôi đang sử dụng các lớp bao bọc cho đầu vào. Mã chỉ là một ví dụ ngắn gọn về vấn đề - cách thay thế dịch vụ trò chơi nếu cả hai lớp đang sử dụng cùng một giao diện.

ý tưởng mới của tôi: tôi có thể sử dụng một lớp "quản lý" (như CameraManager trong trường hợp này) trong đó có các phương pháp sau đây

public void SetCameraType(CameraType type) //CameraType could be an enum 
public ICamera GetCamera() 

và sau đó đặt lớp quản lý vào dịch vụ (với giao diện riêng của mình như ICameraManager).

Edit: này được coi là câu trả lời cho những nhận xét ở trên ... nhưng có vẻ như tôi nhấp vào nút sai - xin lỗi

1

Giống như bạn đã trả lời, sử dụng một trình quản lý camera. Nó hoạt động như một nhà máy và một thùng chứa cho máy ảnh hiện tại. Người quản lý bạn có thể đăng ký làm dịch vụ. Người quản lý sẽ trông giống như sau:

public class CameraManager 
{ 
    private Dictionary<Type, ICamera> _cameras; 
    private ICamera _current; 

    public ICamera Current 
    { 
     get 
     { 
      return _current; 
     } 
    } 

    // Sets the current cammera to the internal instance of the camera type 
    public void SetCurrent<T>() where T : ICamera 
    { 
     if (!_cameras.ContainsKey(typeof(T))) 
     { 
      // TODO: Instantiate a new camera class here... 
     } 

     _current = _cameras[typeof(T)]; 
    } 
} 

Đây chỉ là mã thô - sẽ cần phải được điền nhiều hơn. Một hạn chế là bạn chỉ có thể có một máy ảnh cho mỗi loại. Cung cấp cho máy ảnh một tên chuỗi, hoặc một lá cờ enum sẽ cho phép bạn chuyển đổi giữa một số tùy ý của máy ảnh.

0

Tôi nghĩ nếu bạn đã bỏ qua mã về việc thêm và xóa dịch vụ trong Bản cập nhật, bạn sẽ có các dòng tốt và được thêm vào thay đổi thuộc tính Có thể nhìn thấy. Cho phép các hiệu ứng đặc tính gọi tới Update, nhưng các hiệu ứng thuộc tính Visible gọi tới Draw.

Vì vậy, tôi muốn đề nghị Update cái nhìn như thế này:

protected override void Update(GameTime gameTime) 
    { 
    var keyboard = Keyboard.GetState(); 
    if(keyboard.IsKeyDown(Keys.C)) 
    { 
     if(freeCam.Enabled) 
     { 
     freeCam.Enabled = false; 
     freeCam.Visible = false; 

     staticCam.Enabled = true; 
     staticCam.Visible= true; 
     } 
     else 
     { 
     freeCam.Enabled = true; 
     freeCam.Visible = true; 

     staticCam.Enabled = false; 
     staticCam.Visible= false; 
     }   
    } 
    base.Update(gameTime); 
    } 
Các vấn đề liên quan