As3:使用hitTestPoint获取确切的碰撞点?

时间:2014-03-12 01:23:00

标签: actionscript-3 collision point hittest direction

我正在使用hitTestPoint来检测敌人和墙壁之间的碰撞。

我想要它,以便如果敌人触及墙壁,他的新目标方向应该改为朝向墙壁相反方向的点。要做到这一点,我想我需要知道敌人和墙壁碰撞的确切位置。

主要运动系统:

    private function move(event:Event):void
    {

        var dx = target.x - x;
        var dy = target.y - y;
        var angle = Math.atan2(dy, dx)/Math.PI*180;
        rotation = angle;


        this.x = x+Math.cos(rotation/180*Math.PI)*movementSpeed;
        this.y = y+Math.sin(rotation/180*Math.PI)*movementSpeed;

        var hyp = Math.sqrt((dx*dx)+(dy*dy));

        if(hyp <5)
        {
            target.x = Math.floor(Math.random() * (1750 - 50 + 1) + 50);
            target.y = Math.floor(Math.random() * (850 - 50 + 1) + 50);
        }
    }

墙体检测系统:

        while (_root.wall.hitTestPoint(this.x, this.y+radius, true)) 
        {
            this.y--;
            target.y = Math.floor(Math.random() * (850 - 50 + 1) + 50);
        }

        while (_root.wall.hitTestPoint(this.x, this.y-radius, true))
        {
            this.y++;
            target.y = Math.floor(Math.random() * (850 - 50 + 1) + 50);
        }

        while (_root.wall.hitTestPoint(this.x-radius, this.y, true)) 
        {
            this.x++;
            target.x = Math.floor(Math.random() * (1750 - 50 + 1) + 50);
        }

        while (_root.wall.hitTestPoint(this.x+radius, this.y, true)) 
        {
            this.x--;
            target.x = Math.floor(Math.random() * (1750 - 50 + 1) + 50);
        }

&#34; _root.wall&#34;是一个带有一堆不同矢量矩形的动画片段。

谢谢

1 个答案:

答案 0 :(得分:0)

通过查看你的代码,看起来你的敌人总是根据他的轮换向前行走。这可能对你有利,因为当他走进一堵墙时,墙的相反方向将与敌人的旋转方向相反。

soo,每当他碰壁时,你都可以用类似下面的方式更新目标位置: (可能不准确,因为as3轮换处理的是负数和所有这些)

var range:int = int(Math.random()*maxDistance);
var r:Number = rotation/180*Math.PI + Math.PI;
target.y = Math.sin(r) * (minDistance + range);
target.x = Math.cos(r) * (minDistance + range);

此外,如果您不希望它直接与墙壁相对,您可以为角度本身添加一些随机化:

var range:int = int(Math.random()*maxDistance);
var sign:int = (Math.random() > .5) ? 1 : -1;
var r:Number = rotation/180*Math.PI + Math.PI + ((Math.random() > .5)? 1 : -1)*(Math.random()*Math.PI)/4;
target.y = Math.sin(r) * (minDistance + range);
target.x = Math.cos(r) * (minDistance + range);

希望这有帮助。