Sprite Kit bodyAtPoint 和 bodyInRect 返回不正确的值?

Posted

技术标签:

【中文标题】Sprite Kit bodyAtPoint 和 bodyInRect 返回不正确的值?【英文标题】:Sprite Kit bodyAtPoint and bodyInRect return incorrect values? 【发布时间】:2013-11-09 14:10:28 【问题描述】:

我创建了一个非常简单的示例代码,只有一个场景,一个精灵节点 20x20px,位于屏幕上的 0.0 点。当我调用scene.physicsWorld bodyAtPoint 时,它甚至会在例如:34x34 时返回这个节点。但在 35x35 点,它返回 null。所以基本上两个轴上从 0px 到 34px 的所有点都返回这个节点,从 35px 开始,它不再返回它了。如果精灵明显以 20px 20px 结束,知道可能是什么原因吗?在bodyInRect 中可以看到相同的行为。

这里是示例代码:

-(id)initWithSize:(CGSize)size     
if (self = [super initWithSize:size]) 
    /* Setup your scene here */

    self.backgroundColor = [SKColor colorWithRed:0.15 green:0.15 blue:0.3 alpha:1.0];
    self.physicsWorld.gravity = CGVectorMake(0, 0);

    SKSpriteNode *node = [[SKSpriteNode alloc] initWithColor:[UIColor whiteColor] size:CGSizeMake(20, 20)];
    node.position = CGPointMake(10, 10);

    node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(20, 20)];
    [self addChild:node];


return self;


-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

for (UITouch *touch in touches) 
    CGPoint location = [touch locationInNode:self];
    if([self.physicsWorld bodyAtPoint:location])
    
        NSLog(@"Detected at point: %f %f", location.x, location.y);
    else
        NSLog(@"No node at point: %f %f", location.x, location.y);
    


这是控制台日志:

2013-11-09 15:05:52.822 SKTest[43143:70b] Detected at point: 2.000000 1.000000
2013-11-09 15:05:56.274 SKTest[43143:70b] Detected at point: 3.000000 7.000000
2013-11-09 15:05:57.006 SKTest[43143:70b] Detected at point: 3.000000 11.000000
2013-11-09 15:05:58.199 SKTest[43143:70b] Detected at point: 3.000000 12.000000
2013-11-09 15:05:58.918 SKTest[43143:70b] Detected at point: 3.000000 14.000000
2013-11-09 15:05:59.785 SKTest[43143:70b] Detected at point: 3.000000 17.000000
2013-11-09 15:06:00.685 SKTest[43143:70b] Detected at point: 3.000000 20.000000
2013-11-09 15:06:01.565 SKTest[43143:70b] Detected at point: 3.000000 22.000000
2013-11-09 15:06:02.915 SKTest[43143:70b] Detected at point: 3.000000 25.000000
2013-11-09 15:06:04.285 SKTest[43143:70b] Detected at point: 3.000000 30.000000
2013-11-09 15:06:05.387 SKTest[43143:70b] Detected at point: 3.000000 34.000000
2013-11-09 15:06:08.492 SKTest[43143:70b] No node at point: 4.000000 38.000000
2013-11-09 15:06:12.499 SKTest[43143:70b] Detected at point: 4.000000 5.000000
2013-11-09 15:06:13.240 SKTest[43143:70b] Detected at point: 6.000000 5.000000
2013-11-09 15:06:13.881 SKTest[43143:70b] Detected at point: 10.000000 5.000000
2013-11-09 15:06:15.064 SKTest[43143:70b] Detected at point: 12.000000 5.000000
2013-11-09 15:06:16.120 SKTest[43143:70b] Detected at point: 14.000000 5.000000
2013-11-09 15:06:16.873 SKTest[43143:70b] Detected at point: 16.000000 5.000000
2013-11-09 15:06:17.582 SKTest[43143:70b] Detected at point: 18.000000 5.000000
2013-11-09 15:06:18.066 SKTest[43143:70b] Detected at point: 21.000000 5.000000
2013-11-09 15:06:18.966 SKTest[43143:70b] Detected at point: 24.000000 5.000000
2013-11-09 15:06:19.585 SKTest[43143:70b] Detected at point: 31.000000 5.000000
2013-11-09 15:06:20.531 SKTest[43143:70b] Detected at point: 35.000000 5.000000
2013-11-09 15:06:22.581 SKTest[43143:70b] No node at point: 36.000000 4.000000
2013-11-09 15:06:26.560 SKTest[43143:70b] Detected at point: 19.000000 16.000000
2013-11-09 15:06:27.933 SKTest[43143:70b] Detected at point: 20.000000 17.000000
2013-11-09 15:06:29.856 SKTest[43143:70b] Detected at point: 25.000000 19.000000
2013-11-09 15:06:31.487 SKTest[43143:70b] Detected at point: 26.000000 22.000000
2013-11-09 15:06:33.850 SKTest[43143:70b] Detected at point: 29.000000 27.000000
2013-11-09 15:06:35.492 SKTest[43143:70b] Detected at point: 31.000000 29.000000
2013-11-09 15:06:36.854 SKTest[43143:70b] Detected at point: 35.000000 32.000000
2013-11-09 15:06:40.004 SKTest[43143:70b] No node at point: 40.000000 34.000000

nodeAtPointnodeInRect 中这可能是Apple 的错误吗?难以相信。但是代码太短了,我看不出这里有什么错误。 任何帮助将不胜感激。

【问题讨论】:

我的解决方案***.com/questions/22578564/… 【参考方案1】:

我对此进行了一些实验。当我放大精灵时,我注意到身体区域似乎比精灵大。我必须将精灵大小除以 1.15 以使身体矩形与所有 4 个侧面上显示的精灵大致匹配。不过不知道为什么。我从来没有玩过游戏的问题,所以也许 nodeAtPoint 有一个阈值范围?

SKSpriteNode *node = [SKSpriteNode spriteNodetWithColor:[SKColor whiteColor]
                                                   size:CGSizeMake(200, 200)];
node.position = CGPointMake(200, 200);

CGRect bodySize = CGSizeMake(node.size.width / 1.15, node.size.height / 1.15);
node.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:bodySize];
[self addChild:node];

我在 Retina 4" 和非 Retina iPad 模拟器上对此进行了测试。

【讨论】:

我也在其他论坛上得到了答案,看起来你是对的,但不完全是 1.15 分频器。 (对我来说,您的代码也在 203px 处检测节点)。其他论坛上的回复是,物理体在各个方向上都宽约 15.5 像素,并且更高。我又检查了一遍,这个 15.5px 看起来是 EXACT 大小,无论我将节点大小设置为 20px 还是 200px,它总是大 15.5 px。因此,在 200px 的示例中,点击 215 - 检测,点击 216 未检测到。但是当我将物理体设置为 200-15.5 时,它仍然不正确。 (在 203 像素处检测)还有其他想法吗? 看起来它以某种方式与节点缩放或场景缩放有关?为什么在 215 处检测到点击,而不是在 216 处,但是当我将 body 设置为 185px 时,它也会在 203px 处检测到.. BodyAtPoint 太麻烦了。我将只使用经典方法。 ***.com/questions/2931573/… enumerateBodiesAlongRayStart usingBlocks CGPoint 参数给出正确的连接点。

以上是关于Sprite Kit bodyAtPoint 和 bodyInRect 返回不正确的值?的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 检测接触

游戏中的三角学——Sprite Kit 和 Swift 教程

Sprite Kit 碰撞检测和物理

游戏中的三角学——Sprite Kit 和 Swift 教程

swift 2 sprite-kit 中的多行标签?

Sprite Kit 场景未呈现