gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:48:24 26 4
gpt4 key购买 nike

我有一个由 2 个类(FreeCamera、StaticCamera)实现的接口(interface) (ICamera)。这些类继承自 GameComponent。

示例定义:

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);
}
}

StaticCamera 只接受鼠标输入(你可以旋转相机),FreeCamera 也可以通过键盘输入移动。当我调用上面的方法(通过按键盘上的 C)时,FreeCamera 类被停用,但视口(viewport)似乎卡住并且不对任何输入使用react。当我在短时间后再次调用该方法时,FreeCamera 再次被激活,一切都按预期进行。

现在我有两个问题:

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

在此先感谢您的帮助。

最佳答案

就像您回答的那样,使用相机管理器。它既充当当前相机的工厂又充当容器。您可以将管理器注册为服务。经理看起来像这样:

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)];
}
}

这只是粗略的代码 - 需要填写更多内容。一个限制是每种类型只能有一台相机。为相机提供一个字符串名称或一个枚举标志可以让您在任意数量的相机之间切换。

关于c# - XNA 在运行时动态更改游戏服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4050560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com