gpt4 book ai didi

flash - 动态传递参数给事件监听器 AS3

转载 作者:行者123 更新时间:2023-12-04 14:41:47 27 4
gpt4 key购买 nike

我有一个 16x16 的按钮网格,我想为每个按钮添加一个事件监听器,以便在单击时返回其唯一的网格位置编号(0-255 之间的任何值);到目前为止我所拥有的:

    public static const GRID_SIZE:Number = 16;
private var i:int;
private var j:int;

// Constructor
public function Grid()
{
for (i = 0; i < GRID_SIZE; i++)
{
for (j = 0; j < GRID_SIZE; j++)
{
// Creates new instance of GridButton, a custom class that extends SimpleButton
var button:GridButton = new GridButton();

// Arranges buttons into a grid
button.x = (i + 1) * button.width;
button.y = (j + 1) * button.height;

// Create unique value for grid position
var position:Number = i * GRID_SIZE + j;

// Add listener to button, with position as extra param
button.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) : void { buttonClick(e, position) } );

// Adds button to Sprite
addChild(button);
}
}
}
}

不幸的是,每次每个按钮调用监听器函数时,它都会使用 i 和 j 的最后两个值,在这种情况下,每个按钮都会返回 255。

有什么建议吗?

最佳答案

还有一些其他的选择...

1 使用 signals here's a post 而不是 Flash 事件监听器描述它并提供更多细节。还有一个 video tutorial让您快速入门。我建议这样做的原因是您可以设置一个信号来传递参数,因此您不需要使用事件目标,这并不总是最好的。

2 使用函数工厂。

// factory:
public function fooFactory($mc:GridButton):Function{
var $f:Function = new Function($e:MouseEvent):void{
trace($mc.x, $mc.y);
}
// you might want to consider adding these to a dictionary or array, so can remove the listeners to allow garbage collection
return $f;
}


// then assign the function to the button like this
button.addEventListener(MouseEvent.CLICK, fooFactory(button) );

这基本上完成了您想做的事情,但它会起作用,因为 position var 没有改变。在您的代码中,每次循环执行时 position 都会发生变化,然后当您触发监听器函数时,它会使用 position 分配的最后一个值,这就是为什么您全部获得255。让我知道这是否没有意义...

关于flash - 动态传递参数给事件监听器 AS3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581952/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com