比较画布上两个位置的x / y

时间:2014-12-19 06:52:07

标签: javascript arrays html5 canvas

我用画布来形象化我的一个小游戏。 基本上我有两个代表太空船的物体,每个物体都有一个“位置”阵列,它保持船只当前的x / y。 根据这些数组,我在画布上绘制了drawImage(totalw / h是300/300 fyi)。

现在,对于困难的部分。 我想在画布上画动画(枪声)。基本上从ship1 x / y到ship2 x / y。

对于动画功能本身,我传递一个效果对象,它包含3个数组,shooter.location [x,y],target.location [x,y]和第三个数据,用于保存EFFECT当前所在的位置[x ,y]。

this.animateEffects = function(effects){

    var shooter = effects.shooter;
    var target = effects.target;
    var current = effects.current;

    var canvas = document.getElementById("effects");
    var context = canvas.getContext("2d");
        context.clearRect(0, 0, canvas.width, canvas.height);
        context.beginPath();
        context.fillStyle = "red";
        context.arc(current[0], current[1], 5, 0, 2*Math.PI);
        effects.current[0]++
        effects.current[1]++
        context.fill();

        if (current == target){
            console.log("ding");
            this.end()
        }
}

我的“问题”是即时通讯,如果可能的话,寻找一种智能的方法来确定(对于每一帧)效果[x,y]应该是++还是 - 或两者的组合,取决于在“移动”船舶所在的位置(当时,射击开始)。

任何建议或提示都表示赞赏。

1 个答案:

答案 0 :(得分:1)

你可以使用线性插值从射手射击目标。

  1. 计算原始X&的差异。射手和目标的Y位置。

    // save the starting position of the bullet (== shooter's original position)
    // (these original X & Y are needed in the linear interpolation formula)
    bulletOriginalX=shooter.x;
    bulletOriginalY=shooter.y;
    
    // calc the delta-X & delta-Y of the shooter & target positions
    // (these deltas are needed in the linear interpolation formula)
    dx=target.x-shooter.x;
    dy=target.y-shooter.y;
    
  2. 使用插值公式

    将子弹移向目标
    // where percent == the percent you want the bullet to be between 
    // it's starting & ending positions
    // (between starting shooter & starting target positions)
    currentBulletX=bulletOriginalX+dx*percent;
    currentBulletY=bulletOriginalY+dy*percent;
    
  3. 以下是一个例子:

    
    
    var canvas=document.getElementById("canvas");
    var ctx=canvas.getContext("2d");
    var cw=canvas.width;
    var ch=canvas.height;
    
    shooter={x:50,y:50};
    target={x:100,y:100};
    effect={x:50,y:50,dx:0,dy:0,pct:0,speedPct:0.25};
    
    draw();
    fire();
    
    $('#test').click(function(){
      moveEffect();
      draw();
    });
    
    function fire(){
      effect.x=shooter.x;
      effect.y=shooter.y;
      effect.dx=target.x-shooter.x;
      effect.dy=target.y-shooter.y;
      effect.pct=0;
    }
    
    function moveEffect(){
      effect.pct+=effect.speedPct;
    }
    
    function draw(){
      ctx.clearRect(0,0,cw,ch);
    
      ctx.beginPath();
      ctx.arc(shooter.x,shooter.y,15,0,Math.PI*2);
      ctx.closePath();
      ctx.strokeStyle='green';
      ctx.stroke();
    
      ctx.beginPath();
      ctx.arc(target.x,target.y,15,0,Math.PI*2);
      ctx.closePath();
      ctx.strokeStyle='red';
      ctx.stroke();
    
      if(effect.pct>1){return;}
    
      var x=effect.x+effect.dx*effect.pct;
      var y=effect.y+effect.dy*effect.pct;
    
      ctx.beginPath();
      ctx.arc(x,y,3,0,Math.PI*2);
      ctx.closePath();
      ctx.fillStyle='black';
      ctx.fill();
    
    }
    
    body{ background-color: ivory; padding:10px; }
    #canvas{border:1px solid red;}
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <button id=test>Animate 1 frame</button>
    <br><canvas id="canvas" width=300 height=300></canvas>
    &#13;
    &#13;
    &#13;