【问题标题】:How to pass values to phaser (Dart port) State.init() function?如何将值传递给移相器(Dart 端口)State.init() 函数?
【发布时间】:2015-03-31 15:08:36
【问题描述】:

我的游戏代码的开头结构是这样的

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() 链接到它就像

.then(_) {
  game.state.start('maprender');
}

现在,我的问题是,因为我必须调用分析函数的 FileProcessor 的实例嵌套在 GameMap 内,我想要一种方法将映射的引用从 Foo 构造函数传递到 @ 987654331@。 (顺便说一句:即使不知何故或出于某种原因我要重组代码以便在这里不需要地图引用,如果可能的话,MapRenderState 也会遇到同样的问题。)我有看到 Phaser 的 State 有一个 init() 函数,这是在新启动状态下首先调用的函数,它允许将可变数量的参数传递给它。我试图弄清楚的是我应该如何指定要传递给它的参数,或者我是否错误地接近这个?当然有一种方法可以在那里发送值,对吧?否则 init() 允许任何参数有什么意义?我的意思不是宣布它应该采取什么措施。显然我只需要在任何 State 类中编写我的 init 实现。我的意思是,回到我的代码,如果我说 init 是采用 GameMap 类型的一个参数,那么有没有办法在某处说“当为此状态调用 init 时,将这个 GameMap [来自 Foo ctor] 作为参数"

如果我在这里缺少有关框架的一些基本内容,我深表歉意,但即使在查看了一些原始 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 var inside 状态不为空。我的问题是我应该如何传递该引用?

【问题讨论】:

  • 感谢您的提问!你能做一个tldr版本吗?很难说出你到底在问什么(这里有很多评论:) 尝试以非常清晰的方式重写你的问题,并包括你遇到的错误。你甚至可以使用伪代码来解释你想要做什么。
  • 您好,我现在将尝试制作 TLDR..但是哦,是的,我确实忘记了错误。我得到的错误是尝试在 null 对象上调用函数,因为我无法将地图引用传递到我的状态初始化函数中。
  • 我认为期待这样一个问题的答案是相当乐观的。似乎您想要做/知道的事情非常基本,但解释涉及很多事情,似乎有必要查看框架的工作原理以了解问题。我建议您尝试简化/澄清问题,并在框架 repo 中创建一个问题,并提供指向此问题的链接,以使开发人员了解您的问题(不确定他/她是否正在监视 SO)。

标签: dart phaser-framework


【解决方案1】:

我不太清楚你的意思,但如果你想传递一些东西来初始化一个状态,你可以在状态的构造函数中这样做。例如,您的状态构造函数可以是

MapRenderState(this.map){//do something about map}

那你就可以了

game.state.add('render',new MapRenderState(map));
game.state.start('render');

如果你想加载一个状态的地图并使用相同状态的地图,请在 preload() 中进行加载。我推荐使用移相器的加载功能。 game.load.text(key,url) 将加载一个文本文件。

【讨论】:

  • 哦,是的,我认为这确实适合我。我不敢相信我没想过只使用 GameMap arg 来创建构造函数.. :( 也许我认为我会被允许这样做,谁知道呢:/ 因为我想你至少对 Phaser 有一些经验,我可以问一下 init 函数实际上应该如何使用吗?我的意思是,正如我的问题所证明的那样,我真的看不出你应该如何将值传递给它。由于 State 函数的调用由 @ 处理987654325@你如何设置要传递给它的
  • 另一件事:是的,我已经在此代码的另一部分中使用了该文本加载代码,所以我已经看到了,但是在我为我的问题描述的部分中,它不合适,因为文本文件代码将执行的分析将用于确定稍后要渲染的“地图”部分的外观;在这种情况下,文本本身不会被放到屏幕上。无论如何感谢您的帮助和建议:)
  • 我也是这个库的新手,我从未使用过 init。我也在制作一个瓷砖地图游戏(wip),我将对地图做的是,我将在状态对象中有一个变量。您可以在启动状态之前将任何映射分配给此变量,以便您可以在状态的更新功能中使用映射。这样您就不需要为不同的地图制作多个状态对象。不过,这可能不是最佳做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多