создание выпуклых SKPhisycsBodies

Я пытаюсь создать прямоугольник с отверстием в новой структуре, предоставленной Apple, единственная проблема заключается в том, что метод bodyWithPolygonFromPath по умолчанию не принимает вогнутые многоугольники, поэтому я попытался решить проблему следующим образом:

        CGPathMoveToPoint   (path, NULL, self.size.width/4.0,   self.size.height/4.0);
        CGPathAddLineToPoint(path, NULL, self.size.width/2.0,  -self.size.height/4.0);
        CGPathAddLineToPoint(path, NULL, -self.size.width/2.0, -self.size.height/4.0);
        CGPathAddLineToPoint(path, NULL, -self.size.width/2.0,  self.size.height/4.0);
        CGPathCloseSubpath  (path);
        self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
        self.physicsBody.affectedByGravity = YES;
        self.physicsBody.categoryBitMask = solidCategory;
        self.physicsBody.dynamic = YES;
        [self addChild:shape1];

        self.auxiliaryShapeNode  = [[SKSpriteNode alloc] init];
        CGPathMoveToPoint   (path_aux, NULL, 3*self.size.width/8.0, 0);
        CGPathAddLineToPoint(path_aux, NULL, self.size.width/2.0,   1.5*self.size.height/4.0);
        CGPathAddLineToPoint(path_aux, NULL, self.size.width/2.0,   -self.size.height/4.0);
        CGPathCloseSubpath  (path_aux);
        self.auxiliaryShapeNode.anchorPoint = CGPointMake(-3.0, 1.0/2.5);
        self.auxiliaryShapeNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path_aux];
        self.auxiliaryShapeNode.physicsBody.dynamic = YES;
        self.auxiliaryShapeNode.physicsBody.categoryBitMask = solidCategory;


        [self addChild:self.auxiliaryShapeNode];
        [self.scene.physicsWorld addJoint:[SKPhysicsJointFixed jointWithBodyA:self.physicsBody bodyB:self.auxiliaryShapeNode.physicsBody anchor:self.position]];
        break;

где self - это созданный мной пользовательский узел спрайта, который имеет узел SKSprite в качестве вспомогательной формы тела, поэтому форма может быть сделана двумя выпуклыми многоугольниками, он создает формы, как и предполагалось, но когда сцена начинает воспроизводиться, сустав не t работает как положено и перемещает маленький треугольник далеко от того места, где он начал


person heczaco    schedule 06.10.2013    source источник


Ответы (1)


Я решил свою проблему, на самом деле я не нашел ответа, но я думаю, вы могли бы сказать, что я работал над этим

Я понял, что точка Bodyjoint подчинялась только координате x, но всегда перемещала координату y на 0, поэтому я переместил тело на координату 0,0, а затем снова переместил тело в его предыдущее положение.

    CGPoint *prevPosition = self.position;
    //positioning of the node so that the joint lands exactly 0,0
    self.position = CGPointMake(-3*self.size.width/8.0,0);

    CGPathMoveToPoint   (path, NULL, self.size.width/4.0,   self.size.height/4.0);
    CGPathAddLineToPoint(path, NULL, self.size.width/2.0,  -self.size.height/4.0);
    CGPathAddLineToPoint(path, NULL, -self.size.width/2.0, -self.size.height/4.0);
    CGPathAddLineToPoint(path, NULL, -self.size.width/2.0,  self.size.height/4.0);
    CGPathCloseSubpath  (path);
    self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path];
    self.physicsBody.affectedByGravity = YES;
    self.physicsBody.categoryBitMask = solidCategory;
    self.physicsBody.dynamic = YES;
    [self addChild:shape1];

    self.auxiliaryShapeNode  = [[SKSpriteNode alloc] init];
    //now we asssign the frame, the position does not matter as it is determined by the joint
    self.auxiliaryShapeNode.frame = CGRectMake(0,0,sel.size.width/8.0,self.height/2);
    self.auxiliaryShapeNode.anchor = CGPointMake(0,0.5);
    CGPathMoveToPoint   (path_aux, NULL, 0,0);
    CGPathAddLineToPoint(path_aux, NULL, self.auxiliaryShapeNode.size.width,   self.auxiliaryShapeNode.size.width/2.0);
    CGPathAddLineToPoint(path_aux, NULL, self.auxiliaryShapeNode.size.width, -self.auxiliaryShapeNode.size.width/2.0);
    CGPathCloseSubpath  (path_aux);
    self.auxiliaryShapeNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path_aux];
    self.auxiliaryShapeNode.physicsBody.dynamic = YES;
    self.auxiliaryShapeNode.physicsBody.categoryBitMask = solidCategory;


    [self addChild:self.auxiliaryShapeNode];
    [self.scene.physicsWorld addJoint:[SKPhysicsJointFixed jointWithBodyA:self.physicsBody bodyB:self.auxiliaryShapeNode.physicsBody anchor:CGPointZero]];
    self.position=prevPosition;

Итак, мне удалось "заставить это работать" таким образом, надеюсь, что это полезно для кого-то

person heczaco    schedule 28.10.2013
comment
Получили ли вы утечку памяти, используя этот код? Я создаю физические тела с контуром формы полигонов, и Инструменты показывают мне странные утечки памяти в PhysicsKit (ответственный кадр содержит информацию об объектах PKPoint). Моя реализация очень похожа на вашу, но у меня нет соединений, и после создания тела я вызываю CGPathRelease(path). Интересно, это ошибка в Sprite Kit или я что-то не так делаю? - person Darrarski; 22.11.2013
comment
Я забыл добавить, что когда я создаю тела, используя методы [SKPhysicsBody bodyWithCircleOfRadius:radius] или [SKPhysicsBody bodyWithRectangleOfSize:size], у меня вообще не возникает утечек памяти. - person Darrarski; 22.11.2013
comment
хм... может быть, вы должны поделиться своим кодом, я не обнаружил никакой утечки памяти, и он все еще работает довольно хорошо... возможно, это как-то связано со сложностью вашего полигона, как самого сложного, который я когда-либо используется трапеция, но если вы поделитесь своим кодом, я буду рад помочь, если смогу - person heczaco; 26.11.2013
comment
Нет проблем, вы можете проверить мой вопрос: stackoverflow.com/questions/20134891 / — он содержит мой код, производящий утечку памяти внутри PhysicsKit. - person Darrarski; 26.11.2013