我正在制作一个游戏,我想知道为什么带有==运算符的构造不会工作而较低的构造运行。之后我用NSLog消息进行测试。
if (pipe.position.x == bird.position.x){ no idea why this doesn't work
if ((pipe.position.x <= bird.position.x) & (pipe.position.x > bird.position.x - 1)){
答案 0 :(得分:3)
这是因为position.x
中的一个(或两个)是一个浮点 2 值,其间的差值为 1 。两个位置值,只有第二个条件成立。
由于p <= b
对于使p == b
成立的所有值都为真,因此要查看“为什么这种情况”意外“让”选择一些值,使表达式p == b
为false < / em> 2 但p < b
为真且p > b - 1
为真。
给定p = 3.2
(管道)和b = 3.7
(鸟),作为示例,那么
p == b
-> 3.2 == 3.7
-> false
但
(p <= b) & (p > b - 1)
-> (3.2 <= 3.7) & (3.2 > 3.7 - 1)
-> (3.2 <= 3.7) & (3.2 > 2.7)
-> true & true
-> true
相反,为了检测鸟“正在穿越”管道,假设x向右增加,请考虑
// The bird's head to the "right" of the pipe leading edge..
bird_x >= pipe_x
// ..but bird's butt is not to the "right" of the pipe trailing edge.
// (Also note use of the &&, the logical-AND operator)
&& (bird_x - bird_width <= pipe_x + pipe_width)
当然,使用非矩形(或宽容重叠)碰撞检测可以减少拍打的挫败感!
1 出现此问题是因为有一些特定的浮点值(但没有整数值)可能会导致观察到的效果。
首先,重申假设 p
不等于b
,假设第一个条件不成功。那么我们假设p <= b
被写为p == b || p < b
,但由于p == b
为假,我们可以通过重言式将其写为p < b
。
由于第二个条件中的两个子句都是真的(例如true && true -> true
),我们有规则:1)p < b
为真,2)p > b - 1
为真。
将p < b
重写为p - b < 0
,将p > b - 1
重写为p - b > -1
,然后将p - b
替换为x
,结果为:x < 0
和x > -1
。但是,x
没有满足-1 < x < 0
的整数值。
(在第一部分,其中p = 3.2且b = 3.7,x =(p - b)= 0.5,当 x 受限时,它满足给定的约束到整数值。)
2 除上述所有内容外, p
和b
可能是“非常接近但不同”的浮点值这样它们之间存在非零差异 - 由于四舍五入,它们甚至可能显示为相同的整数值!使用==
时,请参阅How dangerous is it to compare floating point values?及相关问题,了解原因和“奇怪”行为。
如果是这种情况,则舍入为整数值并使用整数比较,或;完全依赖于建议条件中所示的关系比较,或;使用epsilon comparison for "nearly equal"的浮点值。
答案 1 :(得分:0)
如果你选择abs(pipe.position.x)== abs(bird.position.x),第一个条件就可以满足。