问题的标题可能不是最好的,但是到目前为止我写的代码是:
var menuState = {
//state variables
menuBttn: {
x: _canvas.width/2,
y:_canvas.height/2,
img: imageArray[2],
over: false,
click: function() {
changeState(2);
}
},
preload: function () {
},
update: function(){
surface.clearRect(0, 0, _canvas.width, _canvas.height);
for (var i = 0; i < menuAssets; i++){
surface.drawImage(//draw menuBttn);
}
},
exit: function(){
},
};
我想要做的事实上是创建一个名为menuButtn(它是一个对象)的变量,它只存在于menuState中。
我以为我可以这样做:
var menuState = {
//state variables
this.menuBttn = {
x: _canvas.width/2,
y:_canvas.height/2,
img: imageArray[2],
over: false,
click: function(){
changeState(2);
}
},
}
这是它在Phaser.io(一个制作游戏的库)中的工作方式,但我试图制作自己的游戏引擎。
我该如何解决?
答案 0 :(得分:0)
我认为你做对了。菜单按钮仅存在于您创建的对象的范围内,因此其他类无法访问menuBttn
,因为它位于menuState
内。使用this
关键字也非常智能。
另一个选项是创建一个make_button函数,用于创建一个新按钮,并在menuState
对象内创建它。它完成了同样的事情。
答案 1 :(得分:0)
您可能正在寻找&#34;模块模式&#34;,它使用立即调用的函数表达式(IIFE)和闭包来创建&#34; private&#34;成员,例如
var foo = (function() {
// Private function
function bar(text) {
console.log(text);
}
// Private variable
var private = 'initial value';
// Object to assign to foo
return { runBar: function(text) {
bar(text);
},
setPrivate: function(value) {
private = value;
},
getPrivate: function() {
return private;
}
};
}());
console.log(foo.runBar('bar text')); // bar text
foo.setPrivate('new value');
console.log(foo.getPrivate()); // new value
&#13;
有很多关于此的文章,开始搜索。 ; - )
答案 2 :(得分:0)
var menuState = (function () {
var menuBttn = {
x: canvas.width / 2,
y: canvas.height / 2,
over: false,
click: function () {
console.log('clicked');
}
};
var update = function () {
console.log(menuBttn);
};
/* if you are in menuState scope then you can access menuBttn with out using menuState*/
console.log(menuBttn);
return{menuBttn: menuBttn, update: update};
})();
这样做,就像你在第一个例子中所做的那样。如果你使用&#34; menuState.menuBttn&#34;这允许你访问menuBttn。或者如果您想访问menuBttn属性。你可以&#34; menuState.menuBttn.x&#34;。此外,您无法将单行注释放在函数中。
surface.drawImage(//draw menuBttn);
它会破坏功能并导致错误。