AS3 斜坡角度反彈【算法】

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;
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章