如果可能,我怎么能使用我的问题在Flash中的Actionscript 3中接受的答案here中提供的转换表?我知道它可能与Matrix有关,但我真的不知道答案中提供的转换是否可以在那里实现。是吗?如果是这样的话?
答案 0 :(得分:0)
好的,让我们从你的变换开始Matrix(我稍微调整一下看起来更好 - 这就是最后两个值的作用)。
private var gridTransform:Matrix = new Matrix(28, -14, 28, 14, 0, 14);
现在,如果您创建一个UIComponent,则可以使用此矩阵绘制网格:
var grid:UIComponent = new UIComponent();
grid.graphics.beginFill(0xff0000, 0);
grid.graphics.lineStyle(2, 0x888888);
for (var u:int = 0; u < 20; u++)
{
for (var v:int = 0; v < 20; v++)
{
grid.graphics.moveTo(getX(u,v), getY(u,v));
grid.graphics.lineTo(getX(u+1,v), getY(u+1,v));
grid.graphics.lineTo(getX(u+1,v+1), getY(u+1,v+1));
grid.graphics.lineTo(getX(u,v+1), getY(u,v+1));
}
}
grid.graphics.endFill();
使用辅助函数:
private function getX(u:Number, v:Number):Number
{
return gridTransform.transformPoint(new Point(u,v)).x;
}
private function getY(u:Number, v:Number):Number
{
return gridTransform.transformPoint(new Point(u,v)).y;
}
注意: 我知道绘图方法是多余的,但我也是这样做的,因此填充允许网格之间的区域注册点击事件。有更好的方法可以做到这一点,但这不是重点。
在UIComponent上绘制网格后,您可以将其添加到显示列表中:
addChild(grid);
(我正在使用Flex4,所以我使用addElement(grid);
)
为了说明如何将鼠标事件映射回(u,v)坐标,请向grid
添加事件监听器:
grid.addEventListener(MouseEvent.CLICK, grid_clickHandler);
我们有:
private function grid_clickHandler(event:MouseEvent):void
{
trace("Local coordinates: (" + event.localX + "," + event.localY + ")");
var inverted:Matrix = gridTransform.clone();
inverted.invert();
trace("U-V Coordinates: " + inverted.transformPoint(new Point(event.localX,event.localY)));
}
如果您只想让U-V坐标包含整数,可以使用Math.ceil()
或Math.floor()
或类似的东西。