为什么我的mouseup执行很多次,而且计时器清不掉

樊一翻 2017-08-15 07:32:33
<style>
* {
margin: 0 auto;
padding: 0;
}

canvas {
margin-top: 80px;
width: 1000px;
height: 500px;
box-shadow: 0 0 5px #222;
display: block;
}
</style>
<script src="jquery.js"></script>
<script>
$(function () {
var cav = $("#cav");
var ctx = cav[0].getContext("2d");
var mx = Math.floor(Math.random() * 500) + 500;
var my = Math.floor(Math.random() * 500);
//速度
var vx = 0, vy = 0;
ctx.lineWidth = 2
//绘制弹弓和小鸟
var dx = 150, dy = 100, x0 = 150, y0 = 100;
function hiuzhi(x, y) {
ctx.strokeStyle = "#f00";
//绘制弹弓
ctx.beginPath();
ctx.moveTo(150, 500);
ctx.lineTo(150, 200);
ctx.lineTo(100, 100);
ctx.lineTo(150, 200);
ctx.lineTo(200, 100);
ctx.stroke();
ctx.closePath()
//绘制鸟
ctx.beginPath();
ctx.strokeStyle = "#00f"
ctx.lineWidth = 5;
ctx.arc(x, y, 5, 1.6, Math.PI / 2, false)
ctx.stroke();
ctx.closePath()
}
//绘制目标
function hzmb(x, y) {
ctx.beginPath()
ctx.strokeStyle = "#a72"
ctx.strokeRect(x, y, 20, 20)
ctx.fill()
}
function hzx(dx, dy) {
//绘制弹弓线
ctx.beginPath()
ctx.strokeStyle = "#000"
ctx.moveTo(dx, dy)
ctx.lineTo(200, 100)
ctx.lineTo(dx, dy)
ctx.lineTo(100, 100)
ctx.stroke()
}
hiuzhi(dx, dy);
hzx(dx, dy)
hzmb(mx, my)
cav.on("mousedown", function (e) {
var x = e.offsetX;
var y = e.offsetY;
if (x > x0 - 10 && x < x0 + 10 && y > y0 - 10 && y < y0 + 10) {
cav.on("mousemove", function (ev) {
ctx.clearRect(0, 0, 1000, 500)
hiuzhi(dx, dy);
hzx(dx, dy)
hzmb(mx, my)
dx = ev.offsetX;
dy = ev.offsetY;
cav.bind("mouseup", function () {
alert(123)

cav.off("mousemove")
vx = (x0 - dx) / 80;
vy = (y0 - dy) / 100;
var vy0 = vy;
var t = 0;
var timers = setInterval(function () {
t = t + 0.1;
vy = vy0 + 0.8 * t
ctx.clearRect(0, 0, 1000, 500)
hiuzhi(dx, dy);
hzmb(mx, my)
dx = dx + vx * t;
dy = dy + t * (vy0 + vy) / 2;
if (dx > mx - 10 && dx < mx + 15 && dy < my + 10 && dy > my - 15) {
alert("命中")
clearInterval(timers);
}
if (dx > 1000 || dy > 500 || dx < 0 || dy < -1200) {
clearInterval(timers);
hiuzhi(x0, y0);
hzx(x0, y0);
hzmb(mx, my);
dx = x0, dy = y0;
}
}, 100)
})
})
}
})
})
</script>
</head>
<body>
<canvas id="cav" width="1000" height="500"></canvas>
</body>
</html>
...全文
310 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
天际的海浪 2017-08-15
  • 打赏
  • 举报
回复

 <style>
        * {
            margin: 0 auto;
            padding: 0;
        }

        canvas {
            margin-top: 80px;
            width: 1000px;
            height: 500px;
            box-shadow: 0 0 5px #222;
            display: block;
        }
    </style>
    <script src="jquery.js"></script>
    <script>
        $(function () {
            var cav = $("#cav");
            var ctx = cav[0].getContext("2d");
            var mx = Math.floor(Math.random() * 500) + 500;
            var my = Math.floor(Math.random() * 500);
            //速度
            var vx = 0, vy = 0;
            ctx.lineWidth = 2
            //绘制弹弓和小鸟
            var dx = 150, dy = 100, x0 = 150, y0 = 100;
            function hiuzhi(x, y) {
                ctx.strokeStyle = "#f00";
                //绘制弹弓
                ctx.beginPath();
                ctx.moveTo(150, 500);
                ctx.lineTo(150, 200);
                ctx.lineTo(100, 100);
                ctx.lineTo(150, 200);
                ctx.lineTo(200, 100);
                ctx.stroke();
                ctx.closePath()
                //绘制鸟
                ctx.beginPath();
                ctx.strokeStyle = "#00f"
                ctx.lineWidth = 5;
                ctx.arc(x, y, 5, 1.6, Math.PI / 2, false)
                ctx.stroke();
                ctx.closePath()
            }
            //绘制目标
            function hzmb(x, y) {
                ctx.beginPath()
                ctx.strokeStyle = "#a72"
                ctx.strokeRect(x, y, 20, 20)
                ctx.fill()
            }
            function hzx(dx, dy) {
                //绘制弹弓线
                ctx.beginPath()
                ctx.strokeStyle = "#000"
                ctx.moveTo(dx, dy)
                ctx.lineTo(200, 100)
                ctx.lineTo(dx, dy)
                ctx.lineTo(100, 100)
                ctx.stroke()
            }
            hiuzhi(dx, dy);
            hzx(dx, dy)
            hzmb(mx, my)
            var moveFlag = false;
            cav.on("mousedown", function (e) {
                var x = e.offsetX;
                var y = e.offsetY;
                if (x > x0 - 10 && x < x0 + 10 && y > y0 - 10 && y < y0 + 10) {
	                moveFlag = true;
                }
            })
            cav.on("mousemove", function (ev) {
	            if (!moveFlag) return;
                ctx.clearRect(0, 0, 1000, 500)
                hiuzhi(dx, dy);
                hzx(dx, dy)
                hzmb(mx, my)
                dx = ev.offsetX;
                dy = ev.offsetY;
            })
            cav.on("mouseup", function () {
	            if (!moveFlag) return;
	             moveFlag = false;
                alert(123)
                vx = (x0 - dx) / 80;
                vy = (y0 - dy) / 100;
                var vy0 = vy;
                var t = 0;
                var timers = setInterval(function () {
                    t = t + 0.1;
                    vy = vy0 + 0.8 * t
                    ctx.clearRect(0, 0, 1000, 500)
                    hiuzhi(dx, dy);
                    hzmb(mx, my)
                    dx = dx + vx * t;
                    dy = dy + t * (vy0 + vy) / 2;
                    if (dx > mx - 10 && dx < mx + 15 && dy < my + 10 && dy > my - 15) {
                        alert("命中")
                        clearInterval(timers);
                    }
                    if (dx > 1000 || dy > 500 || dx < 0 || dy < -1200) {
                        clearInterval(timers);
                        hiuzhi(x0, y0);
                        hzx(x0, y0);
                        hzmb(mx, my);
                        dx = x0, dy = y0;
                    }
                }, 100)
            })
        })
    </script>
</head>
<body>
<canvas id="cav" width="1000" height="500"></canvas>
</body>
</html>

87,994

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧