SKPhysicsBody不符合预期。

3

我有以下代码来创建一个矩形方块和与之关联的物理体。我期望物理体是一个与方块大小和位置相同的实心矩形,但我得到的物理体似乎有位置偏移和大小差异。我是否忽略了一些坐标系统问题?应该如何正确处理这个问题?

- (void)addBrick {
    SKShapeNode *brick = [[SKShapeNode alloc] init];

    CGRect brickBoundary = CGRectMake(0.0, 0.0, 100.0, 100.0);
    brick.position = CGPointMake(100.0, 100.0);
    brick.path = CGPathCreateWithRect(brickBoundary, nil);

    brick.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:CGSizeMake(100.0,100.0)];
    brick.physicsBody.restitution = 1.0;
    brick.physicsBody.friction = 0.0;
    brick.physicsBody.dynamic = NO;

    [self addChild:brick]; 
}

大小必须是框架大小的一半,因为主体矩形大小是从中心到任一侧的宽度/高度,而不是总宽度。 - CodeSmile
1个回答

5
这是创建矩形并添加物理引擎的简单方法。
SKSpriteNode *n1 = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:objectSize];
n1.position = CGPointMake(self.size.width/2, 200);
n1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:n1.size];
n1.physicsBody.dynamic = NO;
[self addChild:n1];

这是一篇改编自RW教程的文章,为您的代码添加了调试边框。
// RW Debug modified version
CGPathRef bodyPath = CGPathCreateWithRect( CGRectMake(-n1.size.width/2, -n1.size.height/2, n1.size.width, n1.size.height),nil);
SKShapeNode *shape = [SKShapeNode node];
shape.path = bodyPath;
shape.strokeColor = [SKColor colorWithRed:1.0 green:0 blue:0 alpha:0.5];
shape.lineWidth = 1.0;
[n1 addChild:shape];
CGPathRelease(bodyPath);

你的实现产生了这个结果(红色框表示物理盒子)。 enter image description here

谢谢,它起作用了 :)。但是你知道我的实现有什么问题吗? - Roshan
1
这样修复您的实现:CGRect brickBoundary = CGRectMake(-50, -50, 100.0, 100.0); 我猜这是因为spriteNodes没有锚点,所以它被设置为0,0?我不太确定,抱歉。 - DogCoffee
是的,我认为问题也在于锚点...谢谢 :) - Roshan
谢谢,这是一个很好的解决方案。我已经更新了你的代码并实现了圆形。任何有问题的人都可以查看我的博客文章:http://www.kubilayerdogan.net/aligning-skphysicsbody-correctly-with-skshapenode/ - kubilay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接