XNA在运行时动态更改游戏服务

org*_*nic 5 c# xna

我有一个接口(ICamera),由2个类(FreeCamera,StaticCamera)实现.这些类继承自GameComponent.

示例定义:

public class FreeCamera : GameComponent, ICamera
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在我将这些类添加到游戏组件中,并将其中一个组件注册到游戏服务中

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);
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后我想借助切换功能在应用程序流程中更改服务的提供程序

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

StaticCamera仅通过鼠标输入(您可以旋转相机),FreeCamera也可以通过键盘输入移动.当我调用上面的方法时(通过按键盘上的C键),FreeCamera类会被取消激活,但视口似乎已冻结,并且不会对任何输入做出反应.当我在短时间内再次调用该方法后,FreeCamera再次被激活,一切都按预期工作.

现在我有两个问题:

  • 是否可以在游戏循环中更改游戏服务的服务提供商?
  • 有没有更好的方法来处理游戏中的不同相机类型并轻松切换它们?

在此先感谢您的帮助.

小智 0

谢谢你的提示。我只是在没有 IDE 的情况下凭脑子写下了代码,所以请不要过多关注语法错误等。

在我的游戏中,我使用包装类作为输入。该代码只是问题的一个简短示例 - 如果两个类使用相同的接口,如何替换游戏服务。

我的新想法:我可以使用“管理器”类(如本例中的 CameraManager),它具有以下方法

public void SetCameraType(CameraType type) //CameraType could be an enum
public ICamera GetCamera()
Run Code Online (Sandbox Code Playgroud)

然后将管理器类放入服务中(具有自己的接口,如ICameraManager)。

编辑:这被认为是对上面评论的回答......但似乎我点击了错误的按钮 - 抱歉