AS3 斜坡角度反弹【算法】

发布时间:2019-09-11 07:46:09编辑:auto阅读(1808)

    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;
      }
    }

关键字