我正在使用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;是一个带有一堆不同矢量矩形的动画片段。
谢谢
答案 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);
希望这有帮助。