使用 bitmap.hittest 在动作脚本中进行碰撞检测

Posted

技术标签:

【中文标题】使用 bitmap.hittest 在动作脚本中进行碰撞检测【英文标题】:collision detection in actionscript using bitmap.hittest 【发布时间】:2010-08-26 23:12:24 【问题描述】:

好的,所以我有两个 png 文件,一个圆圈和一个迷宫。基本上,迷宫是一个正方形,上面刻有一些路径。我想绘制这些图像,将圆圈移动到鼠标坐标处,并在圆圈与迷宫墙相交时显示“命中”,而在没有时显示“未命中”。现在我想使用 bitmapdata.hittest 方法来做这些。圆圈是 32x32 的图像,迷宫是 256*256 的图像。我已经完成了所有设置,并且所有内容都正确绘制在屏幕上,但我无法让它的实际碰撞检测部分工作,即即使圆圈明显相交,它也总是显示“未命中”而不是“命中”迷宫。这是我所做的:

package 

    import flash.display.*;     
    import flash.events.*;
    import flash.geom.*;
    import flash.text.TextField;
    import flash.utils.getTimer;
    import flash.net.URLRequest;
    import flash.ui.Mouse;
    import flash.system.*;
    import Math;
    public class MAIN extends Sprite
    
        private var TEXT:TextField = new TextField();
        public var LOADER_1:Loader = new Loader();
        public var LOADER_2:Loader = new Loader();
        public var DATA_1:BitmapData;
        public var DATA_2:BitmapData;

        public function MAIN()
           
            LOADER_2.load(new URLRequest('TEST.png'));
            LOADER_2.x = 125;       LOADER_2.y = 125;
            DATA_2 = new BitmapData(256,256,true,0);
            DATA_2.draw(LOADER_2);
            addChild(LOADER_2);

            LOADER_1.load(new URLRequest('BALL.png'));
            LOADER_1.x = mouseX;        LOADER_1.y = mouseY;
            DATA_1 = new BitmapData(32,32,true,0);
            DATA_1.draw(LOADER_1);
            addChild(LOADER_1);

            Mouse.hide();
            stage.frameRate = 60;
            addChild(TEXT);
            stage.addEventListener(Event.ENTER_FRAME,STEP);
        
        public function STEP(event:Event):void
        
            LOADER_1.x = mouseX;
            LOADER_1.y = mouseY;

            if (DATA_1.hitTest(new Point(LOADER_1.x,LOADER_1.y),255,DATA_2,new Point(LOADER_2.x,LOADER_2.y)))
            
                TEXT.text = 'hit';
            
            else
            
                TEXT.text = 'miss';
            
        
    

那么有人可以告诉我我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

您必须等到您的图像加载后才能将它们绘制到BitmapData

        LOADER_2.load(new URLRequest('TEST.png'));
        LOADER_2.x = 125;       LOADER_2.y = 125;
        DATA_2 = new BitmapData(256,256,true,0);
        DATA_2.draw(LOADER_2);

此时您正在拍摄加载程序的“快照”,但加载程序没有内容。因此,您应该等待 Event.COMPLETE 事件在每个加载程序上触发,并绘制到 BitmapData 对象。

【讨论】:

那我该怎么做呢?我试过这个: LOADER_1.contentLoader.addEventListener(Event.COMPLETE,LOADED_1);但是有一个编译器错误。 好的,我可以编译它(它是 contentLoaderInfo),但现在什么都没有出现。这就是我所做的(对不起,如果它没有正确显示): LOADER_2.contentLoaderInfo.addEventListener(Event.COMPLETE,LOADED_2); LOADER_2.load(new URLRequest('TEST.png'));函数 LOADED_2(事件:事件):void LOADER_2.x = 125;装载机_2.y = 125; DATA_2 = new BitmapData(256,256,true,0); DATA_2.draw(LOADER_2); addChild(LOADER_2); 我最终改用了 embed...我不喜欢它,但它更容易使用。

以上是关于使用 bitmap.hittest 在动作脚本中进行碰撞检测的主要内容,如果未能解决你的问题,请参考以下文章

使用动作脚本文件编译 .SWF

使用动作脚本 3 检测颜色

将动作脚本 2 转换为动作脚本 3

我可以在警报功能中使用滚动和单击动作脚本吗?

Flash 动作脚本

将动作脚本 2 翻译成动作脚本 3