2D HTML画布游戏-停止玩家移动通过墙壁
2D HTML canvas game - Stop player moving through wall
我正在制作一款玩家必须在地图上导航并到达最终目标的游戏。我让玩家移动并且最终目标有效;然而,在我画完墙之后,玩家仍然可以穿过它们。
我的问题是,我该如何阻止玩家穿过墙壁?
假设你的角色和墙壁由一个与轴线对齐的边界框(AABB)表示,解决方案非常简单:
function isColliding(pos11, pos12, pos21, pos22){
return (
(pos11.x < pos21.x && pos21.x < pos12.x &&
pos11.y < pos21.y && pos21.y < pos12.y) ||
(pos11.x < pos22.x && < pos22.x < pos12.x &&
pos11.y < pos22.y && pos22.y < pos12.y)
);
}
// Call like this
isColliding(playerUpperAabbCorner, playerLowerAabbCorner, wallUpperAabbCorner, wallLowerAabbCorner);
这将检查是否有任何角相互重叠,这将表明发生碰撞。所有的角都是二维坐标,包含属性.x
和.y
。
HTML Canvas没有碰撞检测系统。因此,您必须用JavaScript描述这些墙,以便根据这些描述绘制它们。接下来,你必须在玩家每次移动时处理位置。
。
wall = []
wall[0] = {"p1":[0,0],"p2":[0,100]} // the P1 and P2 points of line of wall
...
之后,你必须确定球员的角落。对于每个角,您可以检测它是否在墙上。
function line_detect(wall,point){ // based on line formula of analytic geometry
var a = (wall.p1[0] - wall.p2[0]) / (wall.p1[1] - wall.p2[1]);
var b = wall.p1[1];
var y = a*point[0]+b;
if(y == point[1])
return 0;
else if(y > point[1])
return 1;
else return -1;
}
function range_detect(wall,point){
if(point[0] > wall.p1[0]
&& point[0] > wall.p2[0])
return 0;
if(point[0] < wall.p1[0]
&& point[0] < wall.p2[0])
return 0;
if(point[1] > wall.p1[1]
&& point[1] > wall.p2[1])
return 0;
if(point[1] < wall.p1[1]
&& point[1] > wall.p2[1])
return 0;
return 1;
}
用这个函数你可以确定一个点是否为:*行后或行前*行内限制或行外限制
现在,你必须检查每个角落,如果都在范围之外,所以没有碰撞被检测到。它在范围内,并且都在同一侧,也没有检测到碰撞。但是如果一些角在线的后面而另一些在线的前面,就会发生碰撞。
相关文章:
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- 正在SharePoint 2013母版页中添加JQuery移动文件
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 如何使用phaser使html5游戏在移动设备浏览器上运行
- FabricJs-限制主对象内添加对象的移动区域
- 如何从画布上的某个移动事件中获取X和Y
- 触摸移动时切换到新元素
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 停止jQuery UI滑块移动超过给定值
- 移动时停止玩家滑动
- 玩家移动速度更快,增量时间更长
- 使敌人跟随移动玩家的问题
- 在服务器上,不会呈现玩家移动
- 三.js 敌人向玩家移动
- 在方块地图中移动玩家
- 用键盘移动玩家形象
- 2D HTML画布游戏-停止玩家移动通过墙壁
- JavaScript中的Agario -玩家不移动
- 在3 .js r71中,精灵没有随玩家移动
- 如何使玩家在画布中出现和移动