物理机构在创建时会偏离其节点

时间:2014-08-26 01:12:48

标签: objective-c sprite-kit skphysicsbody

我一直致力于一款益智游戏,该游戏使用可自定义的网格,其中的级别是在场景进行时预设和创建的。它们由散布在网格周围的静态块和可移动的玩家控制块组成。世界的引力是可控制的,并且块在那个方向上(向上,向下,向左,向右)。我正在使用SKContactDelegate来跟踪播放器块何时触摸一个块或网格的边缘并将其停在原位。

我遇到的问题涉及块和网格边缘的物理实体。

我使用bodyWithRectOfSize作为块,bodyWithEdgeLoopFromRect作为网格边框。

放置在网格中的1x1块的物理主体和玩家1x1块具有正常的物理主体(应该是它们)。但是,较大的块ex:1x5,主体在y轴上向下移动是没有理由的。同样取决于网格大小,网格边缘将被随机数偏移。注意:主体是偏移的,节点本身位于正确的位置。

这是创建块的代码;这个工作正常 (cellsize是每个网格空间的大小)

基本1x1块

-(SKShapeNode *)basic {

    CGRect blockRect = CGRectMake(10, 10, self.cellSize, self.cellSize);
    UIBezierPath *blockPath = [UIBezierPath bezierPathWithRoundedRect:blockRect cornerRadius:8];
    SKShapeNode *blockNode = [SKShapeNode node];
    blockNode.path = blockPath.CGPath;
    blockNode.fillColor =[UIColor blackColor];
    blockNode.lineWidth = 0;
    blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size];
    blockNode.physicsBody.categoryBitMask = blockCategory;
    blockNode.physicsBody.dynamic = NO;

    return blockNode;
}

和自定义块(在y轴上向下偏移)

-(SKShapeNode *)basicWithWidth:(int)width WithHeight:(int)height {

    CGRect blockRect = CGRectMake(10, 10, self.cellSize * width, self.cellSize * height);
    UIBezierPath *blockPath = [UIBezierPath bezierPathWithRoundedRect:blockRect cornerRadius:8];
    SKShapeNode *blockNode = [self basic];
    blockNode.path = blockPath.CGPath;
    blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size];
    blockNode.physicsBody.categoryBitMask = blockCategory;
    blockNode.physicsBody.dynamic = NO;

    return blockNode;
}

这是网格边缘

SKShapeNode *edge = [SKShapeNode node];
CGRect edgeRect = CGRectMake(10, 10, 260, 260);
UIBezierPath *edgeShape = [UIBezierPath bezierPathWithRoundedRect:edgeRect cornerRadius:8];
edge.path = edgeShape.CGPath;
edge.lineWidth = 0;
edge.fillColor = [UIColor grayColor];
edge.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:edgeRect];
edge.physicsBody.categoryBitMask = boardCategory;
[self addChild:edge];

注意:边和块是“棋盘”节点的子节点,该节点是游戏场景的子节点

感谢您阅读本文。

1 个答案:

答案 0 :(得分:0)

当您使用SKPhysicsBody的{​​{3}}时,它以其节点的原点为中心。在您的情况下,您想要做的是将它们置于定义节点的矩形的中心。为此,请改用bodyWithRectangleOfSize:

例如,您使用rect定义块:

CGRect blockRect = CGRectMake(10, 10, self.cellSize, self.cellSize);

所以,你希望你的physicsBody集中在那个矩形的中心。您可以轻松获得CGRect的中心位置:

CGPoint center = CGPointMake(CGRectGetMidX(blockRect), CGRectGetMidY(blockRect));

要创建居中的physicsBody,请使用:

blockNode.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:blockRect.size center:center];

注意: bodyWithRectangleOfSize:center:仅适用于iOS 7.1及更高版本


iOS 7.0方法

对于iOS 7.0,您可以使用bodyWithPolygonFromPath:代替,它只需要额外的一行代码:

CGPathRef blockPath = CGPathCreateWithRect(blockRect, nil);
blockNode.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath: blockPath];