在这种情况下,==和< =之间有什么区别

时间:2014-06-04 04:02:19

标签: objective-c operators

我正在制作一个游戏,我想知道为什么带有==运算符的构造不会工作而较低的构造运行。之后我用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)){

2 个答案:

答案 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 < 0x > -1。但是,x没有满足-1 < x < 0的整数值。

(在第一部分,其中p = 3.2且b = 3.7,x =(p - b)= 0.5,当 x 受限时,它满足给定的约束到整数值。)


2 除上述所有内容外, pb可能是“非常接近但不同”的浮点值这样它们之间存在非零差异 - 由于四舍五入,它们甚至可能显示为相同的整数值!使用==时,请参阅How dangerous is it to compare floating point values?及相关问题,了解原因和“奇怪”行为。

如果是这种情况,则舍入为整数值并使用整数比较,或;完全依赖于建议条件中所示的关系比较,或;使用epsilon comparison for "nearly equal"的浮点值。

答案 1 :(得分:0)

如果你选择abs(pipe.position.x)== abs(bird.position.x),第一个条件就可以满足。