我有一个接口(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)。
编辑:这被认为是对上面评论的回答......但似乎我点击了错误的按钮 - 抱歉
| 归档时间: |
|
| 查看次数: |
811 次 |
| 最近记录: |