我有一个由2个类(FreeCamera,StaticCamera)实现的接口(ICamera)。这些类是从GameComponent继承的。XNA在运行时动态更改游戏服务
例definiton:
public class FreeCamera : GameComponent, ICamera
{
...
}
现在我加入了类的游戏组件,并注册的组件之一的游戏服务
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);
...
}
然后我想改变供应商在应用程序流程期间借助于切换功能的服务
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只通过鼠标输入(您可以旋转相机),FreeCamera也可以通过键盘输入来移动。当我调用上面的方法时(通过按下键盘上的C键),FreeCamera类被取消激活,但视口看起来是冻结的,并且不会对任何输入做出反应。当我在短时间内再次调用该方法时,FreeCamera会再次被激活,并且所有内容都按预期工作。
现在我有2个对此问题:
- 是否有可能改变游戏服务的服务提供商 在 游戏循环?
- 有没有更好的方法 来处理 游戏中的不同相机类型并轻松切换它们?
在此先感谢您的帮助。
只是一个快速提示为:
所以我建议你更新这个样子的'keyboard.IsKeyDown(Keys.C)&& keyboardLastFrame.IsKeyUp(Keys.C)' – 2010-10-29 12:20:56