在画布上拖放移动的球

时间:2018-11-13 19:32:39

标签: javascript html5 canvas javascript-events html5-canvas

我有一个沿特定路径移动的红球和2个按钮来开始和停止它的移动。我想停下某个球,然后将其移动到路径的另一个位置,然后再次开始它的移动。这是我到目前为止所做的,但是我没有做到。我的代码运行并且没有错误出现,但是我无法将球拖放到想要的位置。有谁知道我在做什么错或为什么会这样? 在此先感谢!

<!DOCTYPE html>
<html> 
 <head>
    <title> example </title> 

</head>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <button type='button' id='start'>START</button>
    <button type='button'  id='stop'>STOP</button>
    <br>
    <canvas id="myCanvas" width="1515" height="950" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>

</body>
</html>

脚本

<script>
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");

    window.requestAnimFrame = (function (callback) {
        return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {
        window.setTimeout(callback, 1000 / 60);
        };
    })();

    var dragok = false;

    function MouseDown(e){
        x = e.pageX - canvas.offsetLeft;
        y = e.pageY - canvas.offsetTop;
        dragok = true;
        canvas.onmousemove = MouseMove;
    }

    function MouseUp(e){
        dragok = false;
        canvas.onmousemove = null;
    }

    function MouseMove(e){
        if (dragok){
            x = e.pageX - canvas.offsetLeft;
            y = e.pageY - canvas.offsetTop;
        }
    }

    canvas.onmousedown = MouseDown;
    canvas.onmouseup = MouseUp;

    var pathArray = [];
    pathArray.push({
      x: 140,
      y: 100
    });
    pathArray.push({
      x: 1375,
      y: 100
    });
    pathArray.push({
      x: 1375,
      y: 230
    });
    pathArray.push({
      x: 140,
      y: 230
    });
    pathArray.push({
    x: 140,
    y: 320
    });
    pathArray.push({
      x: 1375,
      y: 320
    });
    pathArray.push({
      x: 1375,
      y: 450
    });
    pathArray.push({
      x: 140,
      y: 450
   });
   pathArray.push({
      x: 140,
      y: 540
   });
   pathArray.push({
      x: 1375,
      y: 540
   });
   pathArray.push({
      x: 1375,
      y: 670
   });
   pathArray.push({
      x: 140,
      y: 670
   });

    var polypoints = makePolyPoints(pathArray, 5);  
    var width = 15;
    var height = 30;
    var speed = 1/2;
    var stopAnimation = true;
    var position = 0; 


    function drawBall(){
        ctx.beginPath();
        ctx.arc(150, 85, 12, 0, 2*Math.PI);
        ctx.fillStyle = "#B22222";
        ctx.fill();
    }

    drawBall();

    // start animation 
    $('#start').on('click',function(){
        stopAnimation = false;
        requestAnimFrame(animate);
    });

    // stop animation 
    $('#stop').on('click',function(){
        stopAnimation = true;
    });

    animate();

    function animate(){
        if(stopAnimation){return;}
        setTimeout(function () {
            requestAnimFrame(animate);
            position += speed;
            if (position> polypoints.length - 1) {
                return;
            }
            var pt = polypoints[position];
            if(pt){
                ctx.save();
                ctx.beginPath();
                ctx.translate(pt.x, pt.y);
                ctx.arc(-width / 2, -height / 2, 12, 0, 2*Math.PI);
                ctx.fillStyle = "#B22222";
                ctx.fill();
                ctx.restore();
            }
        }, 1000 / 60);
    }

    function makePolyPoints(pathArray, speedFactor) {
        var points = [];
        for (var i = 1; i < pathArray.length; i++) {
            var startPt = pathArray[i - 1];
            var endPt = pathArray[i];
            var dx = endPt.x - startPt.x;
            var dy = endPt.y - startPt.y;
            var distance = Math.sqrt(dx*dx+dy*dy)
            var steps = distance/speedFactor
            for (var n = 0; n <= steps; n++) {
                var x = startPt.x + dx * n / steps;
                var y = startPt.y + dy * n / steps;
                points.push({
                x: x,
                y: y
                });
            }
        }
        return (points);
    }


</script>

0 个答案:

没有答案