物体的运动(三)
大多数情况都是以一个矩形作为边界,当物体(圆形)运动到边界时,有四种处理方法:
1.删除它
2.将物体移到原来位置,就像生成一个新的物体。
3.在屏幕上折回,就像相同的物体出现在不同的位置。
4.弹回到原来的位置。
第一种处理方法:
判断圆的位置:
从右边出界:ball.x-ball.radius>stage.stageWidth;
从左边出界:ball.x+ball.radius<0;
从上边出界:ball.y+ball.radius<0;
从下边出界:ball.y-ball.radius>stage.stageHeight;
只要满足上面一个条件即可以删除圆形,代码如下:
private function onFrame(e:Event):void
{
_circle.vy += _circle.ay;
_circle.vx += _circle.ax;
_circle.vy += _gravity;
_circle.vx += _wind;
_circle.vx *= _circle.friction;
_circle.vy *= _circle.friction;
_circle.x += _circle.vx;
_circle.y += _circle.vy;
_circle.rotation += _circle.vx;
vTi.text = _circle.vx.toFixed(2);
aTi.text = _circle.vy.toFixed(2);
setBounds();
}
private function setBounds():void
{
if (_circle.x - _circle.width / 2 > stage.stageWidth ||
_circle.x + _circle.width / 2 < 0 ||
_circle.y + _circle.height / 2 < 0 ||
_circle.y - _circle.height / 2 > stage.stageHeight
)
{
removeEventListener(Event.ENTER_FRAME, onFrame);
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyboardDownEventHandle);
stage.removeEventListener(KeyboardEvent.KEY_UP, keyboardUpEventHandle);
removeChild(_circle);
_circle = null;
}
}
第二种处理方法:
当物体出边界后,重新生成它。修改了setBounds()函数,重新设置了圆形的位置,初始速度。
private function setBounds():void
{
if (_circle.x - _circle.width / 2 > stage.stageWidth ||
_circle.x + _circle.width / 2 < 0 ||
_circle.y + _circle.height / 2 < 0 ||
_circle.y - _circle.height / 2 > stage.stageHeight
)
{
_circle.x = stage.stageWidth / 2 - _circle.width / 2;
_circle.y = stage.stageHeight / 2 - _circle.height / 2;
_circle.vx = Math.random() * 2 - 1;
_circle.vy = Math.random() * 2 - 1;
}
}
第三种处理方法:
屏幕折回相当于,物体从边界的一边移出后,出现到相对此边界的另一边同一位置。
private function setBounds():void
{
var left:Number = 0;
var right:Number = stage.stageWidth;
var top:Number = 0;
var bottom:Number = stage.stageHeight;
if (_circle.x - _circle.width / 2 > right)
{
_circle.x = left - _circle.width / 2;
}
else if (_circle.x + _circle.width / 2 < left)
{
_circle.x = right + _circle.width / 2;
}
if (_circle.y + _circle.height / 2 < top)
{
_circle.y = bottom + _circle.height / 2;
}
else if (_circle.y - _circle.height / 2 > bottom)
{
_circle.y = top - _circle.height / 2;
}
}
第四种处理方法:
回弹处理分为三步:1.检测物体是否超过边界;2.如果超过将其放到边界的边上;3.反转物体的速度(改变速度方向),代码如下:
private function setBounds():void
{
var left:Number = 0;
var right:Number = stage.stageWidth;
var top:Number = 0;
var bottom:Number = stage.stageHeight;
if (_circle.x + _circle.width / 2 > right)
{
_circle.x = right - _circle.width / 2;
_circle.vx *= -1;
}
else if (_circle.x - _circle.width / 2 < left)
{
_circle.x = left + _circle.width / 2;
_circle.vx *= -1;
}
if (_circle.y - _circle.height / 2 < top)
{
_circle.y = top + _circle.height / 2;
_circle.vy *= -1;
}
else if (_circle.y + _circle.height / 2 > bottom)
{
_circle.y = bottom - _circle.height / 2;
_circle.vy *= -1;
}
}
代码执行的时候,会看到圆形碰到边界时可能会与边界有一定距离。这是由于圆形在选择一定的角度后,flash计算它的宽度与高度会有不同了,如果直接上面的_circle.width/2,_circle.height/2变成一个常数,即圆的半径,那么圆形就会按照我们预想的那样靠近边界了。
作者:ywxgod
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号