【问题标题】:How to make drawing move using canvas and javascript?如何使用画布和javascript使绘图移动?
【发布时间】:2016-06-24 04:45:51
【问题描述】:

我有一个我创建的简笔图,我希望每次按下右箭头键时都会对其进行动画处理。我知道我不能从字面上移动对象,但我可以擦除并不断重绘图像。但是我的实现可能还很遥远。任何帮助将不胜感激。

$(document).ready(function(e){

var canvas = document.getElementById("drawCanvas"),
context = canvas.getContext('2d'),
width = canvas.width,
height = canvas.height,
head = new  Array(200, 200, 10,0,  2*Math.PI) ,
body = new Array(195, 210, 178, 250) ,
leftArm = new Array(192,215,200,230,210,230),
rightArm = new Array(192,215,178 ,222,178,230),
leftLeg = new Array(178, 250,190,260,185,275,192, 275 ),
rightLeg= new Array(178, 250, 168, 260, 155, 262,153, 268  )  ;


// board for game
function board(){
context.fillStyle="#FFF";
context.fillStyle="#FFF";
context.fill();
context.strokeStyle="#000";
context.strokeRect(0,0,width,height);
}


//costume #1
function costume1(){
context.beginPath();

//head
context.arc(head[0], head[1], head[2],head[3],  head[4]);

//body
context.moveTo(body[0],body[1]);
context.lineTo(body[2],body[3]);

//right arm
context.moveTo(rightArm[0],rightArm[1]);
context.lineTo(rightArm[2] ,rightArm[3]);
context.lineTo(rightArm[4], rightArm[5]);

//left arm
context.moveTo(leftArm[0], leftArm[1]);
context.lineTo(leftArm[2], leftArm[3]);
context.lineTo(leftArm[4], leftArm[5]);

//left leg
context.moveTo(leftLeg[0], leftLeg[1]);
context.lineTo(leftLeg[2],leftLeg[3]);
context.lineTo(leftLeg[4] , leftLeg[5]);
context.lineTo(leftLeg[6], leftLeg[7]);


//right leg
context.moveTo(rightLeg[0], rightLeg[1]);
context.lineTo(rightLeg[2], rightLeg[3]);
context.lineTo(rightLeg[4], rightLeg[5]);
context.lineTo(rightLeg[6], rightLeg[7]);
context.stroke();
}


//costume #2
function costume2(){
context.arc(head[0], head[1], head[2],head[3],  head[4]);

//body
context.moveTo(body[0],body[1]);
context.lineTo(body[2],body[3]);

//right arm
context.moveTo(rightArm[0],rightArm[1]);
context.lineTo(rightArm[2] + 5 ,rightArm[3]);
context.lineTo(rightArm[4] + 5 , rightArm[5]);

//left arm
context.moveTo(leftArm[0]     , leftArm[1] );
context.lineTo(leftArm[2] - 5 , leftArm[3] );
context.lineTo(leftArm[4] - 10, leftArm[5] );

//left leg
context.moveTo(leftLeg[0] , leftLeg[1]);
context.lineTo(leftLeg[2] - 10 ,leftLeg[3]);
context.lineTo(leftLeg[4] - 20, leftLeg[5]);
context.lineTo(leftLeg[6] - 20, leftLeg[7]);


//right leg
context.moveTo(rightLeg[0],       rightLeg[1]);
context.lineTo(rightLeg[2] + 15 , rightLeg[3] );
context.lineTo(rightLeg[4] + 30 , rightLeg[5]);
context.lineTo(rightLeg[6] +10, rightLeg[7]);
context.stroke();
}

function clear(){
     context.clearRect(0,0, canvas.width, canvas.height);
}

var handle = true;
board();
///move Character
function check(e) {
    var code = e.keyCode;
    //Up arrow pressed
     if (code == 39   &&  handle == true) {
    clear();
    board();
    costume2();
    handle = false;
      }
   else  if(code == 39 &&  handle == false) {
    clear();
    board();
    costume1();
    handle = true;
  }


}
window.addEventListener('keydown',check,false);

});

【问题讨论】:

    标签: javascript html5-canvas drawing


    【解决方案1】:

    我建议你使用 window.requestAnimationFrame() 来重绘屏幕。这将逐步重绘每一帧动画的屏幕。例如:

    $(function(){
    var context = document.getElementById('myCanvas').getContext('2d');
    //initialize
    window.requestAnimationFrame(draw);
    function draw(){
        context.clearRect(0,0,800,600); // clear canvas
        // draw the current frame 
        // animate the next frame 
        window.requestAnimationFrame(draw);
    }});
    

    【讨论】:

      【解决方案2】:

      使用canvas transformations 在画布上移动你的火柴人。

      特别是,context.translate(50,75) 会将您的火柴人向右移动 50 像素,向下移动 75 像素,并且重要的是(!),您不必更改任何火柴人坐标——画布手柄完全可以你。

      变形还可以帮助您表达火柴人的手臂、腿等。您可以使用translate( rotationPointX, rotationPointY)rotate(angle) 的组合将肢体围绕位于[rotationPointX, rotationPointY] 的关节旋转angle

      移动火柴人的例子:

      function drawStickman(changeInX,changeInY){
          context.clearRect(0,0,canvas.width,canvas.height);
          context.translate(changeInX,changeInY);
          // draw your stickman -- no change in coordinates are needed
          context.translate(-changeInX,-changeInY);
      }
      

      【讨论】:

      • 很好的答案!但是如何删除之前的图而不是新的呢?
      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-11
      • 2021-09-02
      • 2011-09-24
      • 1970-01-01
      • 2018-11-30
      相关资源
      最近更新 更多