我正在创建一个塔防游戏,并希望阻止用户将塔放在路径上。该路径存储为具有属性x
和y
的对象数组。我会做一个简单的例子来解释一下。许多“级别”(也称为路径)存储在数组中。在这个数组中(例如Array[0]
)是多个对象,每个对象详细说明地图上的一个点,然后将它们连接起来创建路径:
levels = [
[{x: 0, y: 0}, // When plotted:
{x: 0, y: 50}], // 0,0 to 0,50 creates a vertical line
{x: 50, y: 100}], // 0,50 to 50,100 creates a diagonal
[{}] // more levels
];
由于数据的相对简单性,如果一个点位于只有一个x / y值发生变化的路径上,那么我有一个工作版本(which you can find here)。
使用上面的路径示例,您可以测试我的小提琴以确保您关注。尝试(应该)返回true的坐标0,35
。这是因为x没有改变,所以我们只检查y是否在第一个和第二个点的y值之内。按预期工作:)
然而,我的问题是试图找出塔是否在对角线路径上。这两个值都会改变,所以我需要弄清楚数学来解释各种各样的“对角线”。使用第二和第三路径点,形成从x:0
,y:50
到x:50
,y:100
的对角线,我们可以想象围绕此对角线的正方形。我的(不正确的)功能目前阻止该方块中的任何点成为塔,而它应该只是不能使用的对角线。
基本上,我目前的错误功能是这样做的,a
是对角线的起点,b
是终点:
if(x is between a.x and b.x AND y is between a.y and b.y){
build the tower
}
对于所有单词和缺少代码感到抱歉,但jsFiddle是一个非常简化的版本,应该有助于理解。我主要是在寻找实现功能的数学,如果你可以帮助伪,我可以自己编写代码。
答案 0 :(得分:2)
您是否考虑了线方程:y = a * x + b
你可以找到两个点的a和b。
使用第一点:(0,50)
50 = 0 + b
因此:
b = 50
使用第二点:(50,100)
100 = 50 * a + 50
因此:
a = 1;
因此确定点是否在该线上的等式是:
y = 1 * x + 50
示例:
第1点:(10,60)
y = 1 * 10 + 50 = 60
这一点就行了。
第2点:(60,110)
y = 1 * 60 + 50 = 110
这一点在线上,但在两点的边界之外。所以你必须为此添加检查。
我可以继续查看更多积分。但我希望上面的内容能帮到你。