如何为 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);
}
我尝试在 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);
}