对于尚未登台的对象的HitTest

时间:2012-07-19 14:36:43

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

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

[想象一下,就像在视频游戏中添加精灵一样 - 它们必须在空白区域产卵;如果它们从彼此内部弹出,那么它看起来真的很奇怪。]

3 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分:0)

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

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) ) 

答案 2 :(得分:0)

我知道这篇文章超级老,但万一它可以帮助任何人 -

如果您需要对不在舞台上的动画片段进行命中测试。解决方法是首先将其栅格化为位图。

var bitmapData:BitmapData = new BitmapData(mc.width, mc.height, true, 0x0000000);
bitmapData.draw(mc);

if (bitmapData.getPixel32(x, y) > 0) {
  // Hit true.
}