gpt4 book ai didi

java - 状态模式中场注入(inject)的替代方案

转载 作者:行者123 更新时间:2023-11-30 02:53:43 26 4
gpt4 key购买 nike

我正在开发一个游戏,该游戏由诸如简介、菜单、加载、游戏等状态组成...这些状态由在其中调用的状态管理器交换(或放置在彼此之上)状态本身,因为每个状态都有对管理器的引用,如下所示:

class IntroState extends State {
//....
void update() {
showIntro();
if(done) {
stateManager.swapState(new MenuState())
}
}
//....
}

我相信这是“状态模式”,但如果我错了,请纠正我。

某些状态对从平台特定模块发送到游戏核心模块的设置和输入配置等内容有一定的依赖性(例如,PC 平台有键盘控制,而移动设备有触摸控制),因此它们不是,不应该是静态的。

最初,我将这些依赖项作为构造函数参数,并传递它们,但后来我遇到了某些情况,例如我的加载状态,它在加载资源时仅呈现典型的加载屏幕,需要具有它们不具有的依赖项使用它们只是为了将它们传递给依赖它们的状态。然后我添加的功能越多,依赖项列表就会变得越大。

这看起来很糟糕,所以我使用反射创建了一个简单/天真的字段注入(inject)器,它可以工作,但是反射在 Android 上非常慢,而且我不是特别喜欢反射。

我曾简要考虑过 Dagger2 DI 框架,它不使用反射并 promise 稳定的性能,但注释生成的代码和繁重的汇编样板很快让我放弃了它。

因此,我正在寻找有关如何在没有构造函数困惑或基于反射的字段注入(inject)的情况下发送/请求我的状态的某些依赖项的建议。

最佳答案

我也遇到过这个问题,并发现最简单的解决方案是最好的解决方案:将所有游戏服务收集到一个类中

所以不是这样:

State mainMenuState = new MainMenuState(inputService, renderingService, gameStateService);
State loadingState = new MainMenuState(renderingService, gameStateService);
// etc...

这样做:

State gameServices = new GameServices(inputService, renderingService, gameStateService);

State mainMenuState = new MainMenuState(gameServices);
State loadingState = new MainMenuState(gameServices);
// etc...

并且 GameServices 看起来像这样:

public final class GameServices {

public final InputService inputService;
public final RenderingService renderingService;
public final GameStateService gameStateService;

public GameServices(final InputService inputService,
final RenderingService renderingService,
final GameStateService gameStateService) {

this.inputService = inputService;
this.renderingService = renderingService;
this.gameStateService = gameStateService;
}
}

我最初担心的是,现在每种类型的状态都可以访问每种游戏服务。然而,这在实践中从未被证明是一个问题;您的 IDE 可以在进行较大更改之前检查类的使用情况。

对于跨平台逻辑,只需将其抽象到接口(interface)后面即可。例如,“InputService”在每个平台上可能有不同的实现。

游戏编程最困难的部分之一是知道何时停止工程。请记住,您提供的是游戏,而不是库。 :)

关于java - 状态模式中场注入(inject)的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37868754/

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