RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 998754
Accepted
helloworld
helloworld
Asked:2020-07-03 04:15:17 +0000 UTC2020-07-03 04:15:17 +0000 UTC 2020-07-03 04:15:17 +0000 UTC

如何停止颤抖

  • 772

我写了一些类似网格的东西,但脚本只工作了一半。 如果你点击某个地方然后松开,网格会尝试恢复,就像按下之前一样,但尝试会失败,所有的方块都会继续颤抖。

我的问题是如何停止抖动? 我完全不知道该怎么做。

<!DOCTYPE html>
<html>
<head>
	<title>.</title>
	<meta charset="UTF-8">
</head>
<body style="margin: 0">
	<canvas id="can" style="display: block"></canvas>
	<script type="text/javascript">
		function getId(o) {return document.getElementById(o)};
		let can = getId('can'), ctx = can.getContext('2d'), rnd = (min, max) => Math.floor(Math.random() * ((max + 1) - min) + min),
		walls = [], mouse = {
			x: 0,
			y: 0,
			down: false
		},
		Wall = class {
			constructor(x, y, width, height, color, speed, nativePosition) {
				this.x = x,
				this.y = y,
				this.width = width,
				this.height = height,
				this.color = color,
				this.speed = speed,
				this.nativePosition = nativePosition,

				this.velocity = {
					x: 0,
					y: 0,
					friction: .9
				}
			}
		}, size = {
			width: 25,
			height: 25
		};

		for(let x = 0; x < innerWidth / size.width; x++) {
			for(let y = 0; y < innerHeight / size.height; y++) {
				walls.push( new Wall(x * size.width, y * size.height, size.width, size.height, "#555", rnd(2, 4), {x: x * size.width, y: y * size.height}) )
			}
		};

		onresize = e => {
			can.width = innerWidth;
			can.height = innerHeight
		};
		onresize();
		can.style.background = "#000";

		document.onmousemove = e => {
			mouse.x = e.clientX;
			mouse.y = e.clientY
		};
		document.onmousedown = () => mouse.down = true;
		document.onmouseup = () => mouse.down = false;

		(loop = () => {
			ctx.fillStyle = "#0003";
			ctx.fillRect(-3e38, -3e38, 3e38 * 2, 3e38 * 2);

			walls.forEach(wall => {
				if(mouse.down) {
					let a = mouse.x - wall.x - wall.width / 2,
					b = mouse.y - wall.y - wall.height / 2,

					len = Math.sqrt(a * a + b * b), speed = wall.speed;

					a = a / (len ? len : 1) * speed;
					b = b / (len ? len : 1) * speed;

					wall.velocity.x *= wall.velocity.friction;
					wall.velocity.y *= wall.velocity.friction;

					wall.velocity.x += a;
					wall.velocity.y += b;

					wall.x += wall.velocity.x;
					wall.y += wall.velocity.y
				} else {
					let a = wall.nativePosition.x - wall.x,
					b = wall.nativePosition.y - wall.y,

					len = Math.sqrt(a * a + b * b), speed = wall.speed;

					a = a / (len ? len : 1) * speed;
					b = b / (len ? len : 1) * speed;

					wall.velocity.x *= wall.velocity.friction;
					wall.velocity.y *= wall.velocity.friction;

					wall.velocity.x += a;
					wall.velocity.y += b;

					wall.x += wall.velocity.x;
					wall.y += wall.velocity.y
				};

				ctx.strokeStyle = wall.color;
				ctx.strokeRect(wall.x, wall.y, wall.width, wall.height)
			});

			requestAnimationFrame(loop)
		})();
	</script>
</body>
</html>

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Stranger in the Q
    2020-07-03T04:54:09Z2020-07-03T04:54:09Z

    你觉得这个选项怎么样?

    在我看来,在您的情况下,当方块返回时,从目的地出发时提高速度是不值得的

    在此处输入图像描述

    let ctx = can.getContext('2d'),
      rnd = (min, max) => Math.floor(Math.random() * ((max + 1) - min) + min),
      walls = [],
      mouse = {x: 0, y: 0, down: false },
      Wall = function(x, y, width, height, color, speed) {
          this.x = x,
          this.y = y,
          this.width = width,
          this.height = height,
          this.color = color,
          this.speed = speed,
          this.nativePosition = {x,y},
          this.velocity = {x: 0, y: 0, friction: .91}
      },
      size = {width: 26,height: 26};
    
    for (let x = 0; x < innerWidth / size.width; x++) {
      for (let y = 0; y < innerHeight / size.height; y++) {
        walls.push(new Wall(x * size.width, y * size.height, size.width, size.height, "#999", rnd(2, 4)))
      }
    };
    
    (onresize = e => {
      can.width = innerWidth;
      can.height = innerHeight;
    })();
    
    document.onmousemove = e => {
      mouse.x = e.clientX;
      mouse.y = e.clientY;
    };
    
    document.onmousedown = e => mouse.down = true;
    document.onmouseup = e => mouse.down = false;
    
    (loop = () => {
      ctx.fillStyle = "#0008";
      ctx.fillRect(-3e38, -3e38, 3e38 * 2, 3e38 * 2);
    
      walls.forEach(wall => {
        let a, b, d = mouse.down;
        if (d) {
          a = mouse.x - wall.x - wall.width / 2;
          b = mouse.y - wall.y - wall.height / 2;
          len = Math.sqrt(a * a + b * b) || 1;
          a = a / len * wall.speed;
          b = b / len * wall.speed;
        } else {
          a = wall.nativePosition.x - wall.x;
          b = wall.nativePosition.y - wall.y;
        }
    
        wall.velocity.x *= wall.velocity.friction;
        wall.velocity.y *= wall.velocity.friction;
        wall.velocity.x += a * Math.random() / (d ? 1 : 5);
        wall.velocity.y += b * Math.random() / (d ? 1 : 5);
        wall.x += wall.velocity.x;
        wall.y += wall.velocity.y
    
        ctx.strokeStyle = wall.color;
        ctx.strokeRect(wall.x+3, wall.y+3, wall.width-3, wall.height-3)
      });
    
      requestAnimationFrame(loop)
    })();
    body, #can {
      margin: 0;
      background-color: black;
      overflow: hidden;
    }
    <canvas id="can"></canvas>

    • 10

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5