- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的 2d 瓷砖 map 游戏,但我正在尝试让碰撞检测发挥作用。当玩家撞到地板或天花板时,看起来很好,但当玩家撞到墙壁时,它们会快速缩小,我不知道为什么。这是代码的jsfiddle - https://jsfiddle.net/o6dn1z6u/3/
我这样做是为了让游戏检查玩家所在的每个图 block (最多 4 个)。如果jsfiddle太乱的话这里是代码
声明瓦片 map 。 0 是透明的,其他一切都是墙壁/地板等:
var levelOne = {
background: 'lightblue',
collisions: [
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,1],
[1,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,1],
[1,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
],
player: {spawnX: 1, spawnY: 18}
}
标准游戏变量:
var canvas = document.getElementById('game-canvas');
var context = canvas.getContext('2d');
var tile = 40;
var FPS = 30;
var currentLevel = levelOne;
var playerLeft = false;
var playerRight = false;
var playerUp = false;
var playerDown = false;
var speed = 6;
var xSpeed = 0;
var ySpeed = 0;
var playerX = currentLevel.player.spawnX * tile;
var playerY = currentLevel.player.spawnY * tile;
function draw()
{
updateMap(currentLevel);
updatePlayer(currentLevel.player);
}
setInterval(draw, 1000/ FPS);
更新 map 只是将图 block 绘制到 Canvas 上,所以我将跳过它。更新玩家时,它会获取玩家想要执行的移动,如果新移动会与墙壁碰撞,它将把它们定位在墙壁旁边,因此如果玩家位于 X: 2 并且向下移动 5 个空格,则将它们定位在 x:0 而不是将它们留在 x:2
function updatePlayer (player)
{
var newX = playerX;
var newY = playerY;
if (playerLeft)
{
newX -= speed;
}
if (playerRight)
{
newX += speed;
}
if (playerUp)
{
newY -= speed;
}
if (playerDown)
{
newY += speed;
}
if (!verticleCollision(newX, newY))
{
playerY = newY;
}
else
{
newY = playerY;
}
if (!horizontalCollision(newX, newY))
{
playerX = newX;
}
context.fillStyle = 'blue';
context.fillRect(playerX, playerY, tile, tile);
}
这是碰撞函数。我想为水平和垂直制作 2 个,这样你就可以有效地在地板或墙上滑动。在 fiddle 上,我在玩家所在的 4 个盒子上涂了颜色,这样我就可以直观地看到碰撞。
function verticleCollision(x, y)
{
var topLeftX = Math.floor(x/tile);
var topLeftY = Math.floor(y/tile);
var bottomLeftX = Math.floor(x/tile)
var bottomLeftY = Math.ceil(y/tile);
var topRightX = Math.ceil(x/tile);
var topRightY = Math.floor(y/tile);
var bottomRightX = Math.ceil(x/tile);
var bottomRightY = Math.ceil(y/tile);
if ((currentLevel.collisions[topLeftY][topLeftX] != 0) || (currentLevel.collisions[topRightY][topRightX] != 0))
{
playerY = topLeftY * tile + tile;
return true;
}
else if ((currentLevel.collisions[bottomLeftY][bottomLeftX] != 0) || (currentLevel.collisions[bottomRightY][bottomRightX] != 0))
{
playerY = bottomLeftY * tile - tile;
return true;
}
else
{
return false;
}
}
function horizontalCollision(x, y)
{
var topLeftX = Math.floor(x/tile);
var topLeftY = Math.floor(y/tile);
var bottomLeftX = Math.floor(x/tile)
var bottomLeftY = Math.ceil(y/tile);
var topRightX = Math.ceil(x/tile);
var topRightY = Math.floor(y/tile);
var bottomRightX = Math.ceil(x/tile);
var bottomRightY = Math.ceil(y/tile);
if ((currentLevel.collisions[topLeftY][topLeftX] != 0) || (currentLevel.collisions[bottomLeftY][bottomLeftX] != 0))
{
playerX = topLeftX * tile + tile;
return true;
}
else if ((currentLevel.collisions[bottomRightY][bottomRightX] != 0) || (currentLevel.collisions[bottomLeftY][bottomLeftX] != 0))
{
playerX = bottomRightX * tile - tile;
return true;
}
else
{
return false;
}
}
有相当多的代码,这就是我包含 jsfiddle 的原因,但感谢任何帮助:)
最佳答案
我使用了 JSFiddle 并发现了一些有趣的东西。它不仅会降低玩家的水平,还会提高他们的水平。这取决于玩家是接近顶部还是底部。然后我通过更改代码的一个字符修复了向下传送。
function verticleCollision(x, y)
{
var topLeftX = Math.floor(x/tile);
var topLeftY = Math.floor(y/tile);
var bottomLeftX = Math.floor(x/tile)
var bottomLeftY = Math.ceil(y/tile);
var topRightX = Math.ceil(x/tile);
var topRightY = Math.floor(y/tile);
var bottomRightX = Math.ceil(x/tile);
var bottomRightY = Math.ceil(y/tile);
context.fillStyle = 'brown';
context.fillRect(topLeftX * tile, topLeftY * tile, tile, tile);
context.fillStyle = 'red';
context.fillRect(topRightX * tile, topRightY * tile, tile, tile);
context.fillStyle = 'green';
context.fillRect(bottomLeftX * tile, bottomLeftY * tile, tile, tile);
context.fillStyle = 'gold';
context.fillRect(bottomRightX * tile, bottomRightY * tile, tile, tile);
if ((currentLevel.collisions[topLeftY][topLeftX] != 0) || (currentLevel.collisions[topRightY][topRightX] != 0))
{
//I changed this from plus to minus
playerY = topLeftY * tile - tile;
return true;
}
else if ((currentLevel.collisions[bottomLeftY][bottomLeftX] != 0) || (currentLevel.collisions[bottomRightY][bottomRightX] != 0))
{
playerY = bottomLeftY * tile - tile;
return true;
}
else
{
return false;
}
}
我将第一个playerY编辑更改为“-”而不是“+”。这可以防止玩家向下传送,但我不知道您是否也希望玩家向上传送。所以我决定尝试修复另一个。
嗯,事实证明垂直碰撞破裂了,所以从头开始。将其切换回“+”。这次我们尝试保持水平碰撞。
大约 5 分钟后,我发现玩家可能会进入黑色方 block ,然后被向后碰撞,导致垂直碰撞首先发生。由于 JS 不是我的技能,就像我说的,你可能必须找到一种方法来先检查水平,然后再检查垂直。尝试将两者互换!
如果你把它们调换一下,结果就会很奇怪。我不会详细介绍。我只是还没有很多结果。
关于javascript - 2D Tilemap 碰撞检测 - 玩家自动向下移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46438195/
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我试图用这种形式简单地获取数字 28 integer+space+integer+integer+space+integer我试过这个正则表达式 \\s\\d\\d\\s 但我得到了两个数字11 和
最近一直在学习D语言。我一直对运行时感到困惑。 从我能收集到的关于它的信息中,(这不是很多)我知道它是一种有助于 D 的一些特性的运行时。像垃圾收集一样,它与您自己的程序一起运行。但是既然 D 是编译
想问一下这两个正则表达式有区别吗? \d\d\d 与 \d{3} 我已经在我的本地机器上使用 Java 和 Windows 操作系统对此进行了测试,两者都工作正常并且结果相同。但是,当在 linux
我正在学习 Go,而且我坚持使用 Go 之旅(exercise-stringer.go:https://tour.golang.org/methods/7)。 这是一些代码: type IPAddr
我在Java正则表达式中发现了一段令我困惑的代码: Pattern.compile( "J.*\\d[0-35-9]-\\d\\d-\\d\\d" ); 要编译的字符串是: String string
我在 ruby 代码上偶然发现了这个。我知道\d{4})\/(\d\d)\/(\d\d)\/(.*)/是什么意思,但是\1-\2-\3-\4 是什么意思? 最佳答案 \1-\2-\3-\4 是 b
我一直在努力解决这个问题,这让我很恼火。我了解 D 运行时库。它是什么,它做什么。我也明白你可以在没有它的情况下编译 D 应用程序。就像 XoMB 所做的那样。好吧,XoMB 定义了自己的运行时,但是
我有两个列表列表,子列表代表路径。我想找到所有路径。 List> pathList1 List> pathList2 当然是天真的解决方案: List> result = new ArrayList>
我需要使用 Regex 格式化一个字符串,该字符串包含数字、字母 a-z 和 A-Z,同时还包含破折号和空格。 从用户输入我有02-219 8 53 24 输出应该是022 198 53 24 我正在
目标是达到与this C++ example相同的效果: 避免创建临时文件。我曾尝试将 C++ 示例翻译为 D,但没有成功。我也尝试过不同的方法。 import std.datetime : benc
tl;dr:你好吗perfect forwarding在 D? 该链接有一个很好的解释,但例如,假设我有这个方法: void foo(T)(in int a, out int b, ref int c
有什么方法可以在 D 中使用abstract auto 函数吗? 如果我声明一个类如下: class MyClass { abstract auto foo(); } 我收到以下错误: mai
有没有人为内存中重叠的数组切片实现交集?算法在没有重叠时返回 []。 当 pretty-print (使用重叠缩进)内存中重叠的数组切片时,我想要这个。 最佳答案 如果您确定它们是数组,那么只需取 p
我已经开始学习 D,但我在使用 Andrei Alexandrescu 所著的 The D Programming Language 一书中提供的示例时遇到了一些麻烦。由于 int 和 ulong 类
如何创建一个不可变的类? 我的目标是创建一个实例始终不可变的类。现在我只是用不可变的方法和构造函数创建了一个“可变”类。我将其称为 mData,m 表示可变。然后我创建一个别名 alias immut
不久前我买了《The D Programming Language》。好书,很有教育意义。但是,我在尝试编译书中列出的语言功能时遇到了麻烦:扩展函数。 在这本书中,Andrei 写了任何可以像这样调用
我在 D http://www.digitalmars.com/d/2.0/lazy-evaluation.html 中找到了函数参数的惰性求值示例 我想知道如何在 D 中实现可能的无限数据结构,就像
这个问题在这里已经有了答案: 12 年前关闭。 Possible Duplicate: Could anyone explain these undefined behaviors (i = i++
当前是否可以跨模块扫描/查询/迭代具有某些属性的所有函数(或类)? 例如: source/packageA/something.d: @sillyWalk(10) void doSomething()
我是一名优秀的程序员,十分优秀!