在JavaScript phaser游戏框架中使用onclicklistener在循环中创建对象

在JavaScript phaser游戏框架中使用onclicklistener在循环中创建对象,javascript,arrays,javascript-objects,phaser-framework,Javascript,Arrays,Javascript Objects,Phaser Framework,我正在尝试创建一个简单的问答游戏,其中显示一个问题和5种不同的答案 我使用phaser.js,但我认为它通常适用于JavaScript 这是我创建5个按钮的函数 [char_db.js] for (var i = 0; i < 5; i++) { button[i] = game.add.button((30+10*i), (30+5*i), 'buttons', actionOnClick(i), this, 1, 0, 2); } 我犯了个错误 [Uncaught TypeE

我正在尝试创建一个简单的问答游戏,其中显示一个问题和5种不同的答案

我使用phaser.js,但我认为它通常适用于JavaScript

这是我创建5个按钮的函数

[char_db.js]

for (var i = 0; i < 5; i++) {
    button[i] = game.add.button((30+10*i), (30+5*i), 'buttons', actionOnClick(i), this, 1, 0, 2);
}
我犯了个错误

[Uncaught TypeError: Cannot read property 'setFrames' of undefined]
有什么建议吗?

您的代码有两个问题:

1) 您正在调用按钮构造函数中的actionOnClick(i)函数,该函数不是必需的参数类型(按钮期望在此处引用函数)

2) actionOnClick函数假定Button click事件将传递一个ID,但不会。在Phaser中,将发送的第一个参数是调用回调的对象

考虑到这两件事,以下方法应该有效:

for (var i = 0; i < 5; i++) {
  button[i] = game.add.button((30+10*i), (30+5*i), 'buttons', actionOnClick, this, 1, 0, 2);
}

function actionOnClick (button) {
   button.setFrames(2, 1, 3);
}
for(变量i=0;i<5;i++){
按钮[i]=game.add.button((30+10*i),(30+5*i),'buttons',actionclick,this,1,0,2);
}
函数actionClick(按钮){
按钮。设置帧(2、1、3);
}

我的建议是,如果你想让函数返回一个值,你应该返回一个值……你是否希望
button[id]
在调用它之前使用
game.add.button()
的返回值?在分配给
按钮[i]
之前,您正在调用
actionOnClick(i)
。@cookiemonster在这种情况下,检查单击了什么按钮的正确方法是什么?@cookiemonster现在我只选择函数actionOnClick的名称,但我需要它来检查单击了哪个按钮。因此,一个简单的方法是,您需要将上下文[i]与回调“actionOnClick”一起传递,以便您可以将其放在“game.add.button”方法中。所以你的签名只需要另一个属性:
game.add.button((30+10*i),(30+5*i),'buttons',actionClick,i,this,1,0,2)
button = new Array();
for (var i = 0; i < 5; i++) {
  button[i] = game.add.button((30+10*i), (30+5*i), 'buttons', actionOnClick, this, 1, 0, 2);
}

function actionOnClick (button) {
   button.setFrames(2, 1, 3);
}