【问题标题】:HitTest for objects not yet on Stage尚未在舞台上的对象的 HitTest
【发布时间】:2012-07-19 14:36:43
【问题描述】:

我需要将一个 MovieClip 添加到舞台,限制是它只能添加到舞台上的空白区域。舞台本身要么包含复杂的形状,要么可由用户操作,即他可以拖动/移动对象来改变空白区域。 hitTest 和 hitTestObject 方法需要舞台上已有的 DisplayObject。正确的方法是什么 - 我能想象的唯一解决方案是将我的对象添加到舞台上,然后反复进行命中测试?

[想象一下,就像在电子游戏中添加精灵一样——它们必须在空白区域生成;如果它们从彼此的内部弹出,那看起来会很奇怪。]

【问题讨论】:

    标签: actionscript-3 flash collision-detection hittest stage


    【解决方案1】:

    好吧,当你创建一个新类时,只需用一个变量将其关闭并将可见性设置为 false,然后循环直到没有 hitTest。

    一个愚蠢的例子:

    public class someClass extends Sprite
    {
        private var objectsOnStage:Array;
        public function someClass(objectsArray:Array) {
            objectsOnStage = objectsArray;
            visible = false;
            addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event){
            removeEventListener(Event.ADDED_TO_STAGE, init);
            addEventListener(Event.ENTER_FRAME, SEARCH);
        }
        private function SEARCH(e:Event) {
            var doesHit:Boolean = false;
            x = Math.round(Math.random() * (550 - 0)) + 0;
            y = Math.round(Math.random() * (400 - 0)) + 0;
            for (var i:int = 0; i < objectsOnStage; i++) {
                if (doesHit) break;
                if (this.hitTestObject(objectsOnStage[i])) {
                    doesHit = true;
                }
            }
            if (doesHit) return;
            placedInit();
        }
        private function placedInit() {
            visible = true;
            removeEventListener(Event.ENTER_FRAME, SEARCH);
            //now init the stuff you want.
        }
    }
    

    【讨论】:

      【解决方案2】:

      您只需检查两个剪辑的边界框是否重叠。像这样:

      import flash.geom.Rectangle;
      import flash.display.MovieClip;
      
      // create simple movie clips that has a rectangle shape inside
      var sym1 : MovieClip = new Sym1();
      var sym2 : MovieClip = new Sym2();
      
      // get a rectanle of both clipt
      var boundingBox1 : Rectangle = sym1.getBounds(this);
      var boundingBox2 : Rectangle = sym2.getBounds(this);
      
      // check if bounding boxes of both movie clips overlaps
      // so it works like hitTestObject() method
      trace( boundingBox1.intersects( boundingBox2) ) 
      

      【讨论】:

        【解决方案3】:

        我知道这篇文章已经很老了,但万一它对任何人都有帮助--

        如果您需要对不在舞台上的影片剪辑进行命中测试。一种解决方法是先将其光栅化为位图。

        var bitmapData:BitmapData = new BitmapData(mc.width, mc.height, true, 0x0000000);
        bitmapData.draw(mc);
        
        if (bitmapData.getPixel32(x, y) > 0) {
          // Hit true.
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          • 2016-06-23
          • 2011-08-24
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 2014-10-25
          相关资源
          最近更新 更多