RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-343127

helloworld's questions

Martin Hope
helloworld
Asked: 2022-10-10 15:11:57 +0000 UTC

如何使物体“变硬” | 关卡地图错误

  • 1

曾几何时,我发现,他们说,“最难的游戏”(http://caniplay.ru/flash/4565),现在,几年后,我决定做一些类似的事情,但不是很硬核. 事实是我学会了如何检测碰撞,但是如何在碰撞期间使物体成为实体已经更加复杂了。完全看不懂代码哪里出了问题,一切似乎都是合乎逻辑的,但是js不这么认为。

也与地图的关卡问题:上半部分移出。你不能用逻辑来接受这个。请帮帮我。

PS只是一个清晰而准确的答案,而不是来自habr的伪代码或愚蠢的解释,即一个工作示例。

<!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)};
		class Block {
			constructor(position, size, color, type) {
				this.position = position,
				this.size = size,
				this.sys = {color: color}
			}
		};

		let can = getId("can"), ctx = can.getContext('2d'), game = {
			size: 35
		},
		player = {
			position: {
				x: innerWidth / 2 - 25,
				y: innerHeight - 25 - 300
			},
			size: {
				width: 50,
				height: 50
			},
			sys: {
				color: "#AA00FF",
				velocity: {
					x: 0,
					y: 0,
					friction: .9,
					plus: 1
				},
				keys: {
					w: false,
					a: false,
					s: false,
					d: false
				},
				scroll: {
					x: 0,
					y: 0
				}
			}
		}, blocks = [], createBlock = (x, y, w, h, color) => blocks.push( new Block({x: x, y: y}, {width: w, height: h}, color)),
		collides = (pl1, pl2) => (pl1.position.x + pl1.size.width < pl2.position.x ||
			pl2.position.x + pl2.size.width < pl1.position.x ||
			pl1.position.y + pl1.size.height < pl2.position.y ||
			pl2.position.y + pl2.size.height < pl1.position.y) ? false : true,
		map = `
		bbbbbbbbbbbbbbbbbbbbbbbbbbbb-b
		b----------------------------b
		b----------------------------b
		b----------------------------b
		b----------------------------b
		b----------------------------b
		b-------------P--------------b
		b-------------b--------------b
		b----------------------------b
		b----------------------------b
		bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
		`.trim().split('\n');

		// Тут какая-то фигня: блоки вверху "слетают" почему-то.
		for(let y = 0; y < map.length; y++) {
			for(let x = 0; x < map[y].length; x++) {
				let sym = map[y][x],
				w = game.size,
				h = game.size;
				if(sym == "P") {
					player.position.x = x * w;
					player.position.y = y * h;
					player.size.width = w;
					player.size.height = h
				} else if(sym == "b") {
					createBlock(x * w, y * h, w, h, "#902")
				}
			}
		};

		onresize = () => {
			can.width = innerWidth;
			can.height = innerHeight
		};
		onresize();

		document.onkeydown = e => {
			let kc = e.keyCode;
			if(kc == 'W'.charCodeAt()) player.sys.keys.w = true;
			if(kc == 'A'.charCodeAt()) player.sys.keys.a = true;
			if(kc == 'S'.charCodeAt()) player.sys.keys.s = true;
			if(kc == 'D'.charCodeAt()) player.sys.keys.d = true;
			if(kc == 'Z'.charCodeAt()) blocks.pop()
		};
		document.onkeyup = e => {
			let kc = e.keyCode;
			if(kc == 'W'.charCodeAt()) player.sys.keys.w = false;
			if(kc == 'A'.charCodeAt()) player.sys.keys.a = false;
			if(kc == 'S'.charCodeAt()) player.sys.keys.s = false;
			if(kc == 'D'.charCodeAt()) player.sys.keys.d = false
		};
		
		(loop = () => {
			ctx.fillStyle = "rgba(0, 0, 0, .24903)";
			ctx.fillRect(-3e38, -3e38, 3e38 * 2, 3e38 * 2);

			// Скроллинг
			player.sys.scroll.x = -player.position.x + innerWidth / 2 - player.size.width / 2;
			player.sys.scroll.y = -player.position.y + innerHeight / 2 - player.size.height / 2;
			ctx.save();
			ctx.translate(player.sys.scroll.x, player.sys.scroll.y);

			if(player.sys.keys.w) player.sys.velocity.y -= player.sys.velocity.plus;
			if(player.sys.keys.s) player.sys.velocity.y += player.sys.velocity.plus;
			if(player.sys.keys.a) player.sys.velocity.x -= player.sys.velocity.plus;
			if(player.sys.keys.d) player.sys.velocity.x += player.sys.velocity.plus;

			player.sys.velocity.y *= player.sys.velocity.friction;
			player.sys.velocity.x *= player.sys.velocity.friction;
			player.position.y += player.sys.velocity.y;
			player.position.x += player.sys.velocity.x;

			blocks.forEach(block => {
				// ВОТ ТУТ ВООБЩЕ НИЧЕГО НЕ ПОНЯТНО
				if(collides(block, player)) {
					if(player.position.y + player.size.height + player.sys.velocity.y > block.position.y) {
						player.position.y = block.position.y - block.size.height
					} else if(player.position.y - player.sys.velocity.y < block.position.y + block.size.height) {
						player.position.y = block.position.y + block.size.height
					}
				};

				ctx.fillStyle = block.sys.color;
				ctx.fillRect(block.position.x, block.position.y, block.size.width, block.size.height)
			});

			ctx.fillStyle = player.sys.color;
			ctx.fillRect(player.position.x, player.position.y, player.size.width, player.size.height);
			ctx.restore();

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

javascript разработка-игр
  • 1 个回答
  • 10 Views
Martin Hope
helloworld
Asked: 2020-07-03 04:15:17 +0000 UTC

如何停止颤抖

  • 9

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

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

<!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 个回答
  • 10 Views

Sidebar

Stats

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

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • 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