2016-08-24 52 views
0

我正在开发一款游戏,我有一个全球性的save变量,它包含游戏的各个方面(单位,升级等)。游戏代码分为几个模块,如升级或成就。如何创建一个可以在其他模块中编辑而不是全局变量的变量?

如何使save变量在其他模块中可访问?导入给我一个只读的变量副本,这是没有用的。我怎样才能与其他模块共享变量而不使其成为全局变量?

我不是在寻找最简单的解决方案,我正在寻找最佳实践。

编辑:我正在使用ES6导入/导出功能。

+0

你可以看看[依赖注入](http://krasimirtsonev.com/blog/article/Dependency-injection-in-JavaScript)。 – byxor

+0

Ajax +服务器端持久性? – Gar

+1

@JamesThorpe我只是在问题中添加了一些额外的信息。道歉如此宽泛! –

回答

3

导入可能会给你一个只读的变量副本,但导入的对象不是不可变的。因此,如果你想分享各种各样的状态对象,多个模块可以写,你可以:

import saveState from './saveState'; 

saveState = { world: { } }; // Doesn't work 
saveState.world = {};  // Does work 

......不,我会倡导这样的模式(共享状态导致各种upredictability的)。最好有一个共享对象的方法,并让该对象保持内部状态。

+0

老实说,对于视频游戏而言,我认为开放获取可能是最简单的。它可以很容易地检查诸如'if(saveState.world ['dragonChoice'] ==='SAVE'){dialog =“我听说你救了那条龙”。 }' – Katana314

1

如果您使用的是es6,则可以创建本地模块变量并仅导出实用程序函数以更改原始值。

// save-module.js 
let Save = { 
    score: 0, 
    room: 'main' 
} 

export changeRoom(room){ 
    Save.room = room; 
} 
export addScore(){ 
    Save.score++; 
} 
export subtractScore(){ 
    Save.score--; 
} 
export getSaveObject(){ 
    return Save; 
} 

// other-module.js 
import { changeRoom, addScore, subtractScore, getSaveObject } from './save-module'; 

// Do something here with the fns and it should update the Save variable 
+0

有没有一种更清晰的方式来实现这一点,当你有对象嵌套3层深? –