2013-10-06 3 views
1

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

 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; 

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

ответ

0

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

То, что я понял, состоит в том, что точка 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; 

так, мне удалось «заставить его работать» таким образом, надежда подмигнули полезен для кого-то

+0

У вас возникли утечки памяти с помощью этого кода? Я создаю физические тела с полигонами, образующими путь, и инструменты показывают мне странные утечки памяти в PhysicsKit (ответственный кадр содержит информацию о объектах PKPoint). Моя реализация очень похожа на вашу, но у меня нет суставов, и после создания тела я вызываю 'CGPathRelease (path)'. Интересно, является ли это ошибкой в ​​наборе спрайтов, или я делаю что-то неправильно. – Darrarski

+0

Я забыл добавить, что когда я создаю тела, используя '[SKPhysicsBody bodyWithCircleOfRadius: radius]' или '[SKPhysicsBody bodyWithRectangleOfSize: size]' методы, я вообще не получаю утечки памяти. – Darrarski

+0

Хм ... может быть, вам стоит поделиться своим кодом, я не обнаружил утечки памяти, и он все еще работает довольно хорошо ... возможно, это имеет какое-то отношение к сложности вашего полигона, как самого сложного, вы использовали трапецию, но если вы поделитесь своим кодом, я буду рад помочь, если я смогу – heczaco