Sprite Kit 碰撞发生在精灵之外的几个点

Posted

技术标签:

【中文标题】Sprite Kit 碰撞发生在精灵之外的几个点【英文标题】:Sprite Kit collision happens several points outside the sprite 【发布时间】:2014-02-10 02:48:01 【问题描述】:

我设置了一堆 SKSpriteNode。我的英雄节点不应该撞墙,如果撞墙,它会触发碰撞。这工作正常,但碰撞点并不完全在精灵的图像上。

这里是英雄的代码:

hero = [SKSpriteNode spriteNodeWithImageNamed:@"hero"];
hero.name = heroCategoryName;
hero.position = CGPointMake(100, CGRectGetMidY(self.frame));
hero.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:hero.frame.size.width];
hero.physicsBody.friction = 1.0f;
hero.physicsBody.restitution = 0.0f;
hero.physicsBody.linearDamping = 0.1f;
hero.physicsBody.allowsRotation = NO;
hero.physicsBody.categoryBitMask = heroCategory;
hero.physicsBody.contactTestBitMask = wallCategory;
hero.physicsBody.usesPreciseCollisionDetection = YES;
hero.physicsBody.mass = 0.2f;
[self addChild:hero];

这是墙壁:

SKSpriteNode *wall  = [SKSpriteNode spriteNodeWithImageNamed:@"wall"];
        wall.name = wallCategoryName;
        wall.hidden = YES;

        wall.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:wall.size];
        wall.physicsBody.dynamic = NO;
        wall.physicsBody.collisionBitMask = 0;
        wall.physicsBody.usesPreciseCollisionDetection = YES;
        wall.physicsBody.categoryBitMask = wallCategory;
        wall.physicsBody.contactTestBitMask = heroCategory;

无论碰撞是在顶部、左侧还是右侧,都会发生这种情况。我已经走了,并确保我的图像都尽可能地被废话。我不确定它还能是什么。似乎身体的碰撞箱比应有的大。

【问题讨论】:

我一直在在模拟器中看到这个。这让我发疯了。我终于尝试了一个真正的设备,碰撞突然变得完美!您使用的是设备还是模拟器? 您似乎没有设置碰撞位掩码...如果您将英雄的碰撞位掩码设置为墙壁的位掩码,则英雄的精灵将自动配置为不通过它. 今晚我会在真机上试一试。 【参考方案1】:

英雄精灵的尺寸是多少?如果是方形图片,则改如下

hero.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:hero.frame.size.width];

进入

hero.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:hero.frame.size.width/2.0f];

【讨论】:

你能解释一下为什么要除以 2 吗?该图像现在只是一张测试图像 - 60x68。 请参阅有关 bodyWithCircleOfRadius 的文档。身体的起源位于中心。 'r' 是圆的半径。

以上是关于Sprite Kit 碰撞发生在精灵之外的几个点的主要内容,如果未能解决你的问题,请参考以下文章

Sprite Kit 碰撞检测和物理

Sprite Kit,删除 Sprite 以进行碰撞

在 Sprite Kit 中为碰撞执行您自己的物理计算

Sprite Kit 碰撞检测仅适用于左右屏幕边缘

在 Sprite-Kit 中更改精灵图像

Sprite-Kit 为单个接触注册多个碰撞