SKPhysicsBody не соответствует ожиданиям

У меня есть следующий код для создания прямоугольного кирпича и связанного с ним физического тела. Я ожидал, что физическое тело будет сплошным прямоугольником того же размера и положения, что и у кирпича, но я получаю тело, которое, как мне кажется, имеет смещение точки и, возможно, также разницу в размерах. Есть ли какая-то проблема с системами координат, которые я пропустил? Как правильно подойти к этому?

- (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]; 
}

person Roshan    schedule 16.10.2013    source источник
comment
size должен быть вдвое меньше, чем frame.size, потому что размер прямоугольника тела – это ширина/высота от центра к обеим сторонам, а не общая ширина.   -  person LearnCocos2D    schedule 16.10.2013


Ответы (1)


Это простой способ создать прямоугольник и добавить к нему физическое тело.

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);

Ваша реализация произвела это (красный цвет — поле физики).

введите здесь описание изображения

person DogCoffee    schedule 16.10.2013
comment
Спасибо, сработало :). Но знаете ли вы, в чем проблема с моей реализацией? - person Roshan; 16.10.2013
comment
это исправляет вашу реализацию CGRect brickBoundary = CGRectMake(-50, -50, 100.0, 100.0); Я предполагаю, что это потому, что spriteNodes не имеют точки привязки, поэтому для нее установлено значение 0,0? Я не совсем уверен, извините. - person DogCoffee; 16.10.2013
comment
да, я тоже думаю, что проблема с точкой привязки... Спасибо :) - person Roshan; 17.10.2013
comment
Спасибо, это отличное решение. Я обновил ваш код и реализовал круг. Любой, у кого есть проблемы с этим, может проверить мой пост в блоге: kubilayerdogan.net/< /а> - person kubilay; 01.06.2014