如何为 DroidScript 中的每个按钮创建具有不同值的回调函数?

How to create callback function with different value for every button in DroidScript?

我尝试在 Android 上使用 DroidScript 制作一个小游戏。它使用 Javascript.

这是一款纸牌游戏。每个按钮代表一副牌中的一张牌。当我触摸一个按钮时,我希望该应用程序会显示弹出窗口,其中包含我触摸的按钮(卡片)的值。

function callbackFunction( value )
{
    app.ShowPopup(value);
}

//Called when application is started.
function OnStart()
{
    //Create a layout with objects vertically centered.
    lay = app.CreateLayout( "linear", "VCenter,FillXY" );   

    var deck = [1,2,3,4,5,6,7,8,9,10];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btn.SetOnTouch( callbackFunction );
        lay.AddChild(btn);
    }

    //Add layout to app.    
    app.AddLayout( lay );
}

但这不会输出任何内容,因为我无法将值传递给回调函数。所以我尝试使用一组按钮:

//Called when application is started.
function OnStart()
{
    //Create a layout with objects vertically centered.
    lay = app.CreateLayout( "linear", "VCenter,FillXY" );   

    // Deck array
    var deck = [1,2,3,4,5,6,7,8,9,10];

    // array of buttons
    var btns = [];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btns.push(btn);
        btns[btns.length - 1].SetOnTouch( 
            () => { app.ShowPopup(btns[btns.length - 1].GetText())} );
        lay.AddChild(btns[btns.length - 1]);
    }

    //Add layout to app.    
    app.AddLayout( lay );
}

问题是,每次我触摸任何按钮,应用程序都会显示“10”。基本上我希望以卡片的值作为参数调用回调。所以我尝试了这个:

button.SetOnTouch( callbackFunction( button.GetText() );

但这不被接受为回调。真不知道怎么传值给回调函数

您可以非常简单地引用按钮,方法是:

function callbackFunction(){
 var button = this;
 var name = this.GetText();
}

您还可以将自己的数据保存到按钮或任何类型的对象中:

var deck = [1,2,3,4,5,6,7,8,9,10];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btn.SetOnTouch( callbackFunction );
        btn.name = card.toString();
        btn.index = deck.indexOf(card);
        lay.AddChild(btn);
    }

你无论如何都可以使用数组来保存按钮(最好使用我提供给你的第一个解决方案),方法是:

// Deck array
    var deck = [1,2,3,4,5,6,7,8,9,10];

    // array of buttons
    var btns = [];

    for (var card of deck)
    {
        var btn = app.CreateButton(card.toString(), 0.3, 0.1);
        btns.push(btn);
        eval("btns["+(btns.length - 1)+"].SetOnTouch(function(){callbackFunction("+card.toString()+");} );");
        lay.AddChild(btns[btns.length - 1]);
    }

function callbackFunction(name){
  app.ShowPopup(name);
}