As3 hittesting并没有真正起作用(嵌套)

时间:2014-03-11 03:09:26

标签: actionscript-3 nested collision movieclip hittest

我有一辆坦克。

我有一个英雄(可控角色)。

坦克有一个嵌套的动画片段,其表面非常薄。

然而,当它甚至没有碰到英雄时,它会发现碰撞。

public class tank_sight extends MovieClip
{
    private var _root:MovieClip;

    public function tank_sight() 
    {
        addEventListener(Event.ADDED, beginClass);
    }

    private function beginClass(event:Event):void
    {
        _root = MovieClip(root);
        addEventListener(Event.ENTER_FRAME, loop);
    }

    private function loop(event:Event):void
    {
        if(this.hitTestObject(_root.hero.hitbox))
        {
            this.gotoAndStop(2);
            trace("HIT");
            fire();
        }
        else
        {
            this.gotoAndStop(1);
        }
    }

    private function fire():void
    {
        var shell:Shell = new Shell(x, y, rotation - 180);
        _root.addChild(shell);
    }
}

出了什么问题?我不明白。

编辑:视线正在旋转,这可能就是原因。我尝试在播放器类上使用此代码:

    point = _root.tanks.barrel.sight.localToGlobal(new Point());

        if(this.hitTestPoint(point.x, point.y, false))
                {
                    trace("HIT");
                }

但它不起作用..它永远不会追踪" HIT",除非我在某些时候站在某个奇怪的位置。

1 个答案:

答案 0 :(得分:0)

hitTestObject也适用于嵌套对象(显示具有不同父项的对象),您应该检查游戏的逻辑,并进行一些测试。

简单示例:

var squareHolder:Sprite = new Sprite();
var squareInner:Shape = new Shape();
var hitHolder:Sprite = new Sprite();
var hitCircle:Shape = new Shape();

hitCircle.graphics.beginFill(0x990000);
hitCircle.graphics.drawCircle(0, 0, 20);

squareInner.graphics.beginFill(0x009900);
squareInner.graphics.drawRect(0, 0, 40, 40);

addChild(squareHolder);
squareHolder.addChild(squareInner);
squareHolder.x = 200;
squareHolder.y = 100;
squareInner.x = 50;
squareInner.y = 50;

stage.addChild(hitHolder);
hitHolder.addChild(hitCircle);
hitCircle.transform.matrix = new Matrix(1, 0.5, 0.5, 1, 30, 30);

stage.addEventListener(MouseEvent.MOUSE_MOVE, function (e:MouseEvent):void {
    hitHolder.x = e.stageX;
    hitHolder.y = e.stageY;

    if (hitCircle.hitTestObject(squareInner)) {
        trace("Ding!");
    }
});

无论你使用hitCircle做什么(可见=假,短暂的填充,转换),它仍然有用。