AS3 斜坡角度反弹【算法】
短信预约 -IT技能 免费直播动态提醒
1.公式
坐标旋转:
x1 = Math.cos(angle) * x - Math.sin(angle) * y;
y1 = Math.cos(angle) * y + Math.sin(angle) * x;
反坐标旋转:
x1 = Math.cos(angle) * x + Math.sin(angle) * y;
y1 = Math.cos(angle) * y - Math.sin(angle) * x;
2.原理
先把斜面旋转成平面,然后执行反弹,最后再把它旋转回去。
3.实例
var ball:MovieClip;
var line:MovieClip;
var gravity:Number=0.3;
var bounce:Number=-0.6;
init();
function init():void {
ball = new Ball();
addChild(ball);
ball.x=100;
ball.y=100;
ball.vy=1;
ball.vx=0;
line = new MovieClip();
line.graphics.lineStyle(1);
line.graphics.lineTo(300, 0);
addChild(line);
line.x=50;
line.y=200;
line.vy=0;
line.vx=0;//
line.rotation=30;
addEventListener(Event.ENTER_FRAME, onEnterFrameHd);
}
function onEnterFrameHd(event:Event):void {// 普通的运动代码
ball.vy+=gravity;
ball.x+=ball.vx;
ball.y+=ball.vy;
// 获得角度及正余弦值
var angle:Number=line.rotation*Math.PI/180;
var cos:Number=Math.cos(angle);
var sin:Number=Math.sin(angle);
// 获得 ball 与 line 的相对位置
var x1:Number=ball.x-line.x;
var y1:Number=ball.y-line.y;
// 旋转坐标
var y2:Number=cos*y1-sin*x1;
// 实现反弹
if (y2>- ball.height/2) {
// 旋转坐标
var x2:Number=cos*x1+sin*y1;
// 旋转速度向量
var vx1:Number=cos*ball.vx+sin*ball.vy;
var vy1:Number=cos*ball.vy-sin*ball.vx;
y2=- ball.height/2;
vy1*=bounce;
// 将一切旋转回去
x1=cos*x2-sin*y2;
y1=cos*y2+sin*x2;
ball.vx=cos*vx1-sin*vy1;
ball.vy=cos*vy1+sin*vx1;
ball.x=line.x+x1;
ball.y=line.y+y1;
}
}
var line:MovieClip;
var gravity:Number=0.3;
var bounce:Number=-0.6;
init();
function init():void {
ball = new Ball();
addChild(ball);
ball.x=100;
ball.y=100;
ball.vy=1;
ball.vx=0;
line = new MovieClip();
line.graphics.lineStyle(1);
line.graphics.lineTo(300, 0);
addChild(line);
line.x=50;
line.y=200;
line.vy=0;
line.vx=0;//
line.rotation=30;
addEventListener(Event.ENTER_FRAME, onEnterFrameHd);
}
function onEnterFrameHd(event:Event):void {// 普通的运动代码
ball.vy+=gravity;
ball.x+=ball.vx;
ball.y+=ball.vy;
// 获得角度及正余弦值
var angle:Number=line.rotation*Math.PI/180;
var cos:Number=Math.cos(angle);
var sin:Number=Math.sin(angle);
// 获得 ball 与 line 的相对位置
var x1:Number=ball.x-line.x;
var y1:Number=ball.y-line.y;
// 旋转坐标
var y2:Number=cos*y1-sin*x1;
// 实现反弹
if (y2>- ball.height/2) {
// 旋转坐标
var x2:Number=cos*x1+sin*y1;
// 旋转速度向量
var vx1:Number=cos*ball.vx+sin*ball.vy;
var vy1:Number=cos*ball.vy-sin*ball.vx;
y2=- ball.height/2;
vy1*=bounce;
// 将一切旋转回去
x1=cos*x2-sin*y2;
y1=cos*y2+sin*x2;
ball.vx=cos*vx1-sin*vy1;
ball.vy=cos*vy1+sin*vx1;
ball.x=line.x+x1;
ball.y=line.y+y1;
}
}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341