0

我目前正在使用 ActionScript 3 编程语言在 Adob​​e CS5 Flash Professional 平台上开发一个教育 Flash 应用程序。

在我的程序中,用户需要在一个 4x4 的方形网格上绘制一个形状,这是我使用一个运行了 16 次的 For 循环生成的。

当 For 循环构造网格时,它添加了相同的 23x23 像素平方 MovieClip 的 16 个子实例,它们均匀地分布在四行四列中,并且每个 MovieClip 都分配有一个唯一的 ID 号,范围从 1-16 和一个 Mouse Down侦听器事件,准备好进行用户交互。

如果用户单击网格中的正方形,在绘制和选择形状的过程中,MovieClip 的颜色将首先改变以向用户表示它已被选择包含。

其次,我还设置了一个基于布尔值的数组 [0-15],它链接到网格的相应 ID 号,例如,如果我在 4x4 网格中选择了左上角的正方形,则 [0] 的属性我的布尔数组将从 false 变为 true,同样,如果我沿着网格的第二行选择第三个正方形,我的数组的 [6] 属性也会执行相同的操作,依此类推。

现在使用这种技术并引用数组,我总是可以知道我的用户选择了哪些块,并且通过在我的程序的后续幻灯片上运行另一个 For 循环,我已经设法输出,基于我的“选择”布尔数组,与我的用户设计的形状相同,在另一个 4x4 网格的范围内,如果任何数组值设置为 True,则所选块的颜色从灰色变为黑色。

现在我的问题是,我的用户随后需要将他们在第一个网格上生成的设计形状大量绘制到更大的第二个网格上(在某些情况下最多 8-9 次)。这个网格比 4x4 大得多,确切地说是 24 x 12(288 个块)。

现在我需要的是,当我的用户单击第二个较大的网格时,我希望将他们设计的形状的输出作为全新的 MovieClip 添加到舞台上。

但重要的是,需要裁剪形状。例如,如果用户通过选择块 2、3、6、7 在第一个网格上制作了一个正方形;我不希望将 16 块 MovieClip(92x92 像素,基于我的 23x23 像素块)添加到更大的网格中,其中四个块用不同的颜色着色,我想要一个 4 块方形(46 x 46 像素,基于我的 23x23 块)从您在第二个网格上选择的左上角网格正方形中添加。

理想情况下,我想使用形状绘图工具以编程方式创建用户的绘制形状并在函数中执行此操作,因此我可以在每次用户进入第二个网格区域时运行该函数并更新用户的形状,如果用户有回去并在第一个网格中对其进行了修改。这也给了我在将它的子元素添加到我的舞台之前更改形状颜色的范围,这是我需要的另一个功能领域,也是我想以编程方式执行此形状的另一个原因。

我想象在另一个数组中从第一个网格中捕获块的 x/y 坐标,然后在该数组中搜索以找到第一个块实例,然后从这一点绘制形状,这可能是前进的方向,但那是就我的想法而言。

任何关于如何做到这一点的想法或建议阅读都将非常受欢迎。非常感谢。

4

1 回答 1

1

我的建议是您使用位图作为此类形状的基类,以完全透明的方式对其进行初始化,然后使用调整后的 X&Y 值在该 bitmap.bitmapData 上绘制()您的 MC,然后将该位图放置在“更大的网格”上使用提供 X&Y。

var bd:BitmapData=new BitmapData(23*4,23*4,true,0x0);
var mat:Matrix=new Matrix();
mat.tx=-1*LeftCornerX;
mat.ty=-1*LeftCornerY;
for (i=0;i<16;i++) if (BlockMCsSelected[i])  bd.draw(BlockMCs[i],mat);
var bm:Bitmap=new Bitmap(bd);
bm.x=SuppliedX;
bm.y=SuppliedY;
LargerGrid.addChild(bm);

基本上,如果您正确指定输入数据,则应该这样做。但是如果你需要它来接收事件,把这个bitmap封装成一个Sprite对象,它可以处理事件,给sprite坐标,而不是bitmap。

于 2012-08-27T17:24:24.487 回答