2013-10-06 33 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; 

其中自为i创建具有SKSprite节点作为辅助体的形状,从而该形状可以由两个凸多边形进行定制精灵节点时,它创建,因为它被认为形状,但当场景开始播放关节不起作用,因为它应该是这样,并将小三角形的方式从其开始的位置移开

回答

0

我解决了我的问题,其实我没有找到答案,但我想你可以说我的工作在

我意识到的是Bodyjoint的点只服从x坐标,但总是将y坐标移到0,让我感动的身体到0,0协调,并再次被移动身体it's先前的位置

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; 

所以,我设法“使工作”这种方式,希望it's对某人有用

+0

您是否使用此代码获取内存泄漏?我使用多边形窗体路径创建物理体,并在乐器中向我展示PhysicsKit中的奇怪内存泄漏(负责的帧包含有关PKPoint对象的信息)。我的实现看起来与你非常相似,但我没有关节,创建主体后,我调用'CGPathRelease(path)'。我不知道这是Sprite Kit中的错误,还是我做错了什么。 – Darrarski

+0

我忘记补充说,当我使用'[SKPhysicsBody bodyWithCircleOfRadius:radius]'或[SKPhysicsBody bodyWithRectangleOfSize:size]'方法创建主体时,我根本没有得到内存泄漏。 – Darrarski

+0

嗯...也许你应该分享你的代码,我没有发现任何内存泄漏,它仍然工作得很好......也许它与你的多边形的复杂性有关,因为最复杂的是, ve使用的是梯形,但如果你分享你的代码,我会很乐意帮助,如果我可以 – heczaco