如何使用 SpriteKit 使 SKSpriteNode 的物理主体大小与其在 Xcode 中的图像相匹配

How to Fit the Physics Body Size of an SKSpriteNode to its Image in Xcode Using SpriteKit

所以我不确定这是否可行,但我正在尝试调整物理体以配合我的图像。许多人告诉我,我在 iOS App Store(StreakDash - 去下载它!)的游戏中角色的碰撞箱效果不佳,因为它使游戏变得更加困难(碰撞箱撞到障碍物)即使这个角色看起来甚至没有碰到它)。这是因为碰撞箱是矩形的,而我的角色有一个奇怪的形状。有什么办法可以解决这个问题吗?我想到了一些没有完全奏效的方法(例如,尝试将实际的 frame/canvas 形状从矩形更改为其他形状,尝试更改 hitbox shape/size,尝试更改图像等) .如果我能就我是否应该首先更改碰撞箱提出建议,那就太好了(它是那种让人想继续玩还是想停下来的激怒游戏类型?)。不过想办法解决问题最好!

这是我的角色及其命中框的图片:

这里只是SKSpriteNode和物理体的一些基本代码:

 sprite = [SKSpriteNode spriteNodeWithImageNamed:@"stick"];
 sprite.size = CGSizeMake(self.frame.size.width/6.31, self.frame.size.height/3.2);
 sprite.physicsBody =[SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake (sprite.size.width, sprite.size.height)];
 sprite.position = CGPointMake(self.frame.size.width/5.7, self.frame.size.height/2.9);
 sprite.physicsBody.categoryBitMask = personCategory;
 sprite.physicsBody.contactTestBitMask = lineCategory;
 sprite.physicsBody.dynamic = NO;
 sprite.physicsBody.collisionBitMask = 0;
 sprite.physicsBody.usesPreciseCollisionDetection = YES;

我建议用多边形表示物理 body。您有两种方法可以改进 bodyWithRectangleOfSize:

  1. 惰性方法是使用 bodyWithTexture:size:,它将根据纹理的内容创建物理 [​​=25=]。但正如 Apple 所建议的那样,你的物理 body 越复杂,需要正确模拟的工作就越多。您可能希望在精度和性能之间做出权衡。
  2. 更合适的方法是用多边形来表示精灵的边界。请参阅 bodyWithPolygonFromPath:. There are some tools online to generate the path code in user interface. Here is the one: SKPhysicsBody Path Generator(注意偏移量和锚点)。如果您知道自己生成 CGMutablePathRef 代码的方法,将更容易适合您的情况。