关于如何在 Sprite 中创建真正的“打孔”区域有啥想法吗?

Posted

技术标签:

【中文标题】关于如何在 Sprite 中创建真正的“打孔”区域有啥想法吗?【英文标题】:Any thoughts on how to create a true 'punch-out' area in a Sprite?关于如何在 Sprite 中创建真正的“打孔”区域有什么想法吗? 【发布时间】:2010-11-02 21:33:03 【问题描述】:

我已经为此工作了一段时间。您也可以将其称为“反向掩码”或“反向掩码”。

基本上,我在显示对象中创建了一个视图窗口。我需要让舞台上窗口下方的对象能够与鼠标交互。

这类似于 WPF 问题:Use WPF object to 'punch' hole in another?,它的写法要短得多。

我有一个名为PunchOutShield 的类,它创建了一个覆盖舞台(或某个所需区域)的 Sprite。 Sprite 的 Graphics 对象使用 Flex 模态屏幕的颜色和透明度进行填充。结果是一个看起来像出现在模态弹出窗口后面的屏幕。

PunchOutShield 有一个名为punch 的方法,它接受两个参数——第一个是Shape 对象,它定义了穿通区域的形状;第二个是 Point 对象,指示穿通区域的位置。

进行了一些实验,但我发现我可以成功创建一个打孔区域(即 - 模态屏幕不会显示在给定形状的范围内)。为此,我在用于创建模式屏幕的 Sprite 以及添加到模式屏幕 Sprite 的 displayList 的 Shape 对象上将 cacheAsBitmap 设置为 true。

如果我将 Shape 的混合模式设置为 ERASE,则会在模态屏幕中创建一个完全透明的区域。到目前为止,很好。

问题是Shape没有继承InteractiveObject,所以没办法在上面设置mouseEnabled = false。因此,它可以防止鼠标与通过打孔区域可见的任何对象之间的交互。

最重要的是,InteractiveObject 无法查看,所以我看不出是否有办法借用它正在做的事情来提供 mouseEnabled 功能并将其应用于 Shape 的子类。

我尝试使用另一个 Sprite 对象,而不是 Shape 对象,但混合效果不正确。我不确定为什么会有差异,但 Shape 对象似乎以某种方式与父 Sprite 结合,允许 ERASE blendMode 影响所需的打孔视觉外观。

如果我必须用一系列矩形绘制屏幕,​​这样打孔区域就不会被绘制出来,那也不会是世界末日,但是如果打孔-外面的区域很复杂。或圆形。

对这种方法或替代方法有什么想法吗?

【问题讨论】:

可以在这里找到答案:***.com/questions/554631/… 如果您将项目缓存为位图,则您无法将其作为位图访问,但我没想过创建位图的 PunchOutShield。有时间我会试试这个并发布结果。 关于如何完成此操作的另一个可能的信息来源:JSFL 有一个 document.punch() 方法,它完全符合我的意思(形成一个形状并穿透其他层)。因此,至少可以证明在 Flash Player 中可以做到这一点。 【参考方案1】:

似乎在 beginFill() 和 endFill() 之间绘制多个形状并将结果用作蒙版可以产生所需的效果。另见:http://www.galaxygoo.org/blogs/2007/09/shapes_unexpectedly_cancelling_1.html

【讨论】:

【参考方案2】:

有什么原因不能使用 DisplayObject 的 mask 属性吗?这应该允许您在任何显示对象上放置一个洞。

【讨论】:

嘿,雅各布。非常感谢您的回复。设置掩码将允许我定义 DisplayObject 的可见区域。在这种情况下,我有一个“屏幕”(覆盖舞台的半透明 Sprite)。我想在那个“屏幕”上打一个洞——比如说,一个 400 x 200 的矩形区域。在“屏幕”上设置一个蒙版会导致屏幕只显示在那个 400 x 200 的区域中。我想要做的是让屏幕正常显示,except 对于那个 400 x 200 矩形区域。基本上是正常掩码的逆操作。 我想我现在明白了。一种方法可能是不动态绘制蒙版,而是创建一个带有足够大孔的大矩形蒙版,以便可以通过移动蒙版将剪切区域放在舞台上的任何位置。 这不是一个坏计划,但这确实需要动态创建。此外,我希望能够使用任何形状,而不仅仅是矩形。但是,如果我在“屏幕”下创建了所有内容的副本,并将其添加到屏幕上方的显示列表中,并使用作为 InteractiveObject 的子对象的 Shape 掩盖了重复的内容,那么您的建议将起作用。不能很好地扩展,但绝对值得考虑。

以上是关于关于如何在 Sprite 中创建真正的“打孔”区域有啥想法吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 如何在 Sprite Kit 游戏中创建音频淡入/淡出效果?

cocos2d-x js 中创建node的方法

在 Sprite 工具包级别编辑器中创建的场景不起作用

在 Sprite Kit 场景中创建带有重复图像的栏 - iOS

如何在 ui 窗口中创建草图区域

如何在excel中创建表格区域