How to pass values to phaser (Dart port) State.init() function?
我的游戏代码的开头结构是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| main() {
new Foo();
}
class Foo {
GameMap map;
Foo() {
map = new GameMap(32, 32); //GameMap is a class of my own
... // do some map-related initialisation
Game game = new Game(800, 600, AUTO, 'canvasDiv');
State state, state2;
state = new FileWaitState(); //explained below
game.state.add('wait', state);
game.state.start('wait');
state2 = new MapRenderState();
game.state.add('maprender', state2);
} |
因此,FileWaitState 的想法是需要运行一个算法来分析用户/播放器提交的文本文件,并且在分析完成之前,我的第二个状态,当前称为 MapRenderState 不得启动。为了便于实现这一点,FileWaitState 在其 update() 函数中检查文件是否已提供,如果已提供,则启动异步。用于分析文件的函数调用,该文件具有像
一样链接到它的 .then()
1 2 3
| .then(_) {
game.state.start('maprender');
} |
现在,我的问题是,因为我必须调用分析函数的 FileProcessor 实例嵌套在 GameMap 内,我想要一种方法将地图的引用从 Foo 构造函数传递到 FileWaitState。 (顺便说一句:即使不知何故或出于某种原因我要重组代码,以便在这里不需要地图引用,如果可能的话,对于 MapRenderState 我也会遇到同样的问题。)我已经看到 Phaser 的 State 有一个 init() 函数,它是在新启动状态下首先调用的函数,它允许将可变数量的参数传递给它。我试图弄清楚的是我应该如何指定要传递给它的参数,或者我是否错误地接近这个?当然有一种方法可以在那里发送值,对吧?否则 init() 允许任何参数有什么意义?我的意思不是宣布它应该采取什么;显然我只需要在任何 State 类中编写我的 init 实现。我的意思是,回到我的代码,如果我说 init 是采用 GameMap 类型的一个 arg 那么有没有办法在某处说"当为此状态调用 init 时,将这个 GameMap [来自 Foo ctor] 传递为arg"
如果我在这里遗漏了一些关于框架的基本知识,我深表歉意,但即使在查看了一些原始 Phaser.js API 文档之后(因为 dart 端口文档还没有全部完成)我还没有\\'不知道我能做些什么来让它工作。我想还有一个事实是我现在有点"天气不好",所以我现在不想做很多编程工作,但同时我已经把其中一些工作有点太长了,所以我想摆脱这个代码障碍,这样我就可以减少为这个项目工作的动力。
TL;DR 尝试
我有一个 State (FileWaitState) 并希望将 GameMap 的引用传递给它的 init() 函数,因为 State\\ 的更新函数将需要访问 GameMap 数据。我的问题是这段代码
map.fileProcessor.analyseTxtFile(ie.files[0])
在更新函数中给出了错误
The null object does not have a getter fileProcessor 左右,因为显然我没有传入对 GameMap 的引用以使状态内的 map 变量不为空。我的问题是我应该如何传递该引用?
- 感谢您的提问!你能做一个tldr版本吗?很难说出你到底在问什么(这里有很多评论:) 尝试以非常清晰的方式重写你的问题,并包括你遇到的错误。你甚至可以使用伪代码来解释你想要做什么。
-
嗨,我现在将尝试制作 TLDR..但是哦,是的,我确实忘记了错误。我得到的错误是尝试在空对象上调用函数,因为我无法将地图引用传递到我的状态初始化函数中。
-
我认为期待这样一个问题的答案是相当乐观的。似乎您想要做/知道的内容非常基本,但解释涉及的内容太多,以至于似乎有必要查看框架的工作原理才能理解问题。我建议您尝试简化/澄清问题,并在框架存储库中创建一个带有指向此问题的链接的问题,以使开发人员了解您的问题(不确定他/她是否正在监视 SO)。
我不太清楚你的意思,但是如果你想传递一些东西来初始化一个状态,你可以在状态的构造函数中这样做。例如,您的状态构造函数可能是
MapRenderState(this.map){//do something about map}
那你就可以了
1 2
| game.state.add('render',new MapRenderState(map));
game.state.start('render'); |
如果你想加载一个状态的地图并在相同的状态下使用地图,在 preload() 中进行加载。我推荐使用移相器的加载功能。 game.load.text(key,url) 将加载一个文本文件。
- 哦,是的,我认为这确实适合我。我不敢相信我没想过只使用 GameMap arg 来创建构造函数.. :( 也许我认为我会被允许这样做,谁知道呢:/ 因为我想你至少对 Phaser 有一些经验不过,我能问一下 init 函数实际上应该如何使用吗?我的意思是,正如我的问题所证明的那样,我真的看不出你应该如何将值传递给它。因为调用 State 函数由 StateManager 处理你如何设置要传递给它的值?
-
另一件事:是的,我已经在该代码的另一部分中使用了该文本加载代码,所以我已经看到了,但是在我为我的问题描述的部分中,它是不合适的,因为将使用代码将执行的文本文件分析以某种方式确定稍后要渲染的"地图"部分的外观;在这种情况下,文本本身不会被放到屏幕上。无论如何感谢您的帮助和建议:)
-
我对这个库也很陌生,而且我从未使用过 init。我也在制作一个瓷砖地图游戏(wip),我将对地图做的是,我将在状态对象中有一个变量。您可以在启动状态之前将任何映射分配给此变量,以便您可以在状态的更新功能中使用映射。这样您就不需要为不同的地图制作多个状态对象。不过,这可能不是最佳做法。