AS3 - 如何使用鼠标事件的像素/点检测而不是对象检测

2023-12-03

这看起来应该很容易,我都不好意思问,但我就是不明白。

我有一个大的圆形 MovieClip(用作按钮)。该影片剪辑包含具有透明背景的PNG插入到影片剪辑中。 由于其尺寸,四个角(边界框)上有较大的空白注册区域。

如何让鼠标注册为仅位于圆形像素上方,而不位于方形边界框中的空白区域(Alpha 通道像素)?

简单示例代码:

public function simpleSample () : void
{
    mc1.buttonMode = true;
    mc1.addEventListener(MouseEvent.CLICK, doStuff);
}

public function doStuff (event:MouseEvent) : void
{ 
    mc2.gotoAndStop(2); 
}

这里有 3 种不同的方法来实现这一点。

EDIT由于您后来解释过您的按钮是图像,因此第一个选项不适合您

  1. 如果形状标志打开hitTestPoint与您的按钮一起使用(例如,它是一个形状),您可以使用hitTestPoint在鼠标单击处理程序中确定单击是否确实在对象上:

    public function doStuff(event:MouseEvent){
        //only continue if hit test point is true,  
        //the x and y values are global (not relative to the mc your testing as one might suppose)
        //the third parameter should be true, so it takes into account the shape of object and not just it's bounds
        if(mc1.hitTestPoint(stage.mouseX, stage.mouseY, true)){
            mc2.gotoAndStop(2);
        }
    }
    
  2. 如果上述方法不起作用,因为您的按钮中有 bimtap 数据,那么完成此操作的一个简单方法就是向按钮添加形状蒙版。

    因此,可以在按钮内部使用 FlasPro,用圆形遮盖所有内容,或者在首次显示按钮时通过代码执行以下操作:

    var s:Shape = new Shape();
    s.graphics.beginFill(0);
    s.graphics.drawCircle(mc1.x + (mc1.width * .5), mc1.y + (mc1.height * .5), mc1.width / 2);
    addChild(s);
    
    mc1.mask = s;
    
  3. 如果使用图像作为按钮,或者您想设置考虑点击的透明度阈值,那么您可以检查鼠标下像素的透明度:

    function doStuff(event:MouseEvent){
        //only continue if pixel under the mosue is NOT transparent
    
        //first, you need a bitmap to work with
        //if you know for sure the position of your bitmap, you can do something like this:
        var bm:Bitmap = mc1.getChildAt(0) as Bitmap; 
    
        //annoyingly though, FlashPro makes timeline bitmaps shapes, 
              //so the above won't work UNLESS you take your bitmap in the FlashPro Library
              //and export it for actionscript, giving it a class name, then it will be an actual bitmap on the timeline.
    
        //As an alternative, you could (very CPU expensively) draw the whole button as a bitmap 
        var bmd:BitmapData = new BitmapData(mc1.width,mc1.height,true,0x00000000);
        bmd.draw(mc1);
        var bm:Bitmap = new Bitmap(bmd);
    
        //we get the 32bit pixel under the mouse point
        var pixel:uint = bm.bitmapData.getPixel32(bm.x + event.localX,bm.y + event.localY);
    
        //then we grab just the Alpha part of that pixel ( >> 24 & 0xFF ).
        //if the value is 0,  it's totally transparent, if it's 255, it's totally opaque. 
        //for this example, let's say anything greater than 0 is considered good to be a click
        if((pixel >> 24 & 0xFF) > 0){
    
            mc2.gotoAndStop(2);
    
        }
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AS3 - 如何使用鼠标事件的像素/点检测而不是对象检测 的相关文章

  • Flex/Actionscript:动态访问静态变量

    假设我有一个 Foo 类 public class Foo public static var bar String test 如何在运行时使用字符串 Foo 或 和 Foo 的实例和字符串 bar 引用 bar I e var x Obj
  • 保存应用程序状态 AIR

    有没有办法在 AIR 桌面版 Flex AS3 中保存应用程序状态以保存文件 Thanks 您需要确保您的所有课程都已可序列化 http en wikipedia org wiki Serialization 然后在退出应用程序时将它们序列
  • 我有两个类型定义,如何确定一个类型是否是另一个的基类型?

    我在 ActionScript 3 中有两个类型定义 Class 类型的引用 我需要确定其中一个是否是另一个的基类型 类或接口 我本来希望像下面这样的东西会起作用 但遗憾的是它没有 var isBaseClass Boolean Mouse
  • 正则表达式解析货币价值

    我需要在 AS3 中编写一个 RegExp 它将 Excel 格式的货币值解析为数字 例如 正则表达式 35 600 00 35600 并检查其格式是否正确 使用 作为千位分隔符 作为小数点 货币符号可以是任何符号 不仅仅是 并且可以位于开
  • URLLoader 数据到 BitmapData

    我正在尝试加载 SWF 文件旁边的图像文件 像这样的东西 var loader URLLoader new URLLoader loader dataFormat URLLoaderDataFormat BINARY loader addE
  • 在 ActionScript 中移动数组中的对象,产生体育场波浪效果

    我想移动数组中的所有对象 产生体育场波浪效果 我想根据舞台上的 y 值移动对象 我所有的方块大小都是 50x50 我想将它们向上移动然后向下移动 下面是我的代码 import fl transitions Tween import fl t
  • Actionscript 内存管理、垃圾收集

    这个博客 http blogagic com 163 flex memory management and memory leaks varref 和其他人 指出 在清理对象时 您应该在 dispose 方法中将对象引用设置为 null 但
  • AIR/Actionscript 中没有这样的表 SQLITE_SEQUENCE

    我正在尝试使用 AIR ActionScript Flex 4 5 重置 SQLITE 中自动增量字段的种子 我正在做通常应该有效的事情 DELETE FROM SQLITE SEQUENCE WHERE NAME myTable 我已经检
  • Flash AS3 - 将多个对象拖放到一个目标?

    标题或多或少是不言自明的 我一直在学习许多不同的教程 而且说实话 我对 AS3 不太擅长 上图显示了我的目标 无论如何 我在我看到的大多数在线教程中注意到 拖放教程要么基于一个对象到一个目标 要么基于多个对象到多个目标 所以我想知道是否有人
  • 当给定闪光角度和速度时,计算物体的轨迹

    我正在尝试从大炮中发射炮弹并使其遵循现实的路径 射击角度根据大炮的方向而变化 自动定向到鼠标指针 所以我想弄清楚的是 当给定角度和设定速度时 如何沿着抛物线路径移动炮弹 我读到 这可以在没有复杂的三角学的情况下完成 在高中时从未听过 并且可
  • AS3 中的 Flash 翻页卷曲效果

    我正在开发一个项目 需要使用 Flash 开发翻页 卷曲 效果 如下例所示 http www actionscript org showMovie php id 459http www actionscript org showMovie
  • 如何在flex中绘制虚线

    经过一番搜索和阅读 Graphics 类文档后 我找不到指定线条的线条样式的方法 我的意思是这条线是实线还是虚线 有人可以帮助我吗 Thanks 无论如何 您不能仅仅通过使用 Flex 库类 当然 你也可以自己做 这是一个实现它的类 根据找
  • 安全沙箱违规

    运行我的 Flash 应用程序时出现以下错误 违反安全沙箱 与 rtmp system ip live 的连接已停止 不允许从 file F Flash 工作 RTS RT vlab BIOTECH NEO 简单神经元的被动属性 vi 特征
  • ActionScript 3.0 中缺少运算符重载

    我在 ActionScript 中最怀念的事情之一是缺少运算符重载 特别是 我通过在我的类中添加 Compare 方法来解决这个问题 但这在很多情况下没有帮助 比如当你想使用内置字典之类的东西时 有没有好的方法来解决这个问题 Nope 但添
  • 从另一个域加载外部图像

    是否可以从另一个域加载图像 jpg png gif 并操作像素 我想当下载 复制图像时它就在我的域中 使用加载器并将内容添加到图像组件时 我在调试器中收到错误 我想这里有一些跨域策略在起作用 但在继续之前我需要更确定它是如何工作的 我想 如
  • 在 Flex 选项卡式视图导航器之间切换

    我正在开发 FlexTabbedViewNavigatorApplication具有三个选项卡 ViewNavigator 元素 我想根据用户操作 通过 ActionScript 代码 从一个 ViewNavigator 切换到另一个 Vi
  • Flex 字典字面量

    在 Flex 中工作 我需要用相当复杂的结构填充字典 基于本文档页面 http livedocs adobe com flex 3 html help html content 10 Lists of data 4 html我尝试通过以下语
  • Flex 与 ActionScript

    我正在尝试构建 实现一个 Flash 视频播放器来播放视频 我研究了 Flex 并仅使用 VideoElement 构建了一个基本应用程序 它在没有静态链接库的情况下编译为 41k 在链接库时编译为 300k 我生成了报告 但仍然不确定为什
  • 闪存和 CORBA

    如何让 AS3 和 或 Flex AIR 应用程序与 CORBA 应用程序进行通信 在有人为 Flex 编写符合 CORBA 的库 您可能愿意自己做 之前 您最好的选择可能是构建一个充当桥梁的 包装器 Web 服务 可通过标准 Flex W
  • 如何在as3中不询问的情况下写入外部文件

    我有这个代码 var fileRef FileReference new FileReference fileRef save ciao coso lingua txt 在现有的 lingua txt 文件上写入 该脚本有效 但每次他保存时

随机推荐