我创建了一个SKSpriteNode
比如说Map它有一个我定义的边缘路径(一些简单的多边形形状)。
我想弄清楚的是如何添加几个other将充当内部边缘的边缘路径Map。就好像整个“地图”实际上确实有holes。某种内部边界形状可以与Map整体:一条边路径(如下图)
©
我知道有一种方法可以创建SKPhysicsBody
与主体(一些 NSArray),像这样
Map.physicsBody = [SKPhysicsBody bodyWithBodies:bodiesArray];
这种方法实际上会生成我在图像中显示的内容吗?假设bodiesArray
包含 3SKSpriteNode
每个都有使用此类方法的定义路径:
+ (SKPhysicsBody *)bodyWithEdgeChainFromPath:(CGPathRef)path
,创建这样的路径
SKSpriteNode *innerNode1 = [SKSpriteNode spriteNodeWithImageNamed:@"map"];
CGMutablePathRef innerNode1Path = CGPathCreateMutable();
CGPathMoveToPoint(mapPath, NULL, 1110, 1110);
CGPathAddLineToPoint(mapPath, NULL, <some x1>, <some y1>);
CGPathAddLineToPoint(mapPath, NULL, <some x2>, <some y2>);
CGPathAddLineToPoint(mapPath, NULL, <some x3>, <some y3>);
.
.
.
CGPathCloseSubpath(mapPath);
innerNode1.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:innerNode1Path];
[bodiesArray addObject:innerNode1];
// Repeat for other 2 nodes
我知道另一种方法是创建 3 个独立的节点,其中包含预期“孔”的位置和形状,但我努力避免创建超出我需要的节点。如果有人可以确认我正在尝试做的事情是正确的,或者可能提出我不知道的替代方案。
NOTE:如果我正在做的事情是正确的,但我错过了一些东西,如果有人能向我展示正确的方法来完成我想做的事情,我将不胜感激(即使是一个带有内部较小正方形的简单正方形示例也很棒)。谢谢!
EDIT 1:
下面是我用来尝试创建“内部边界”的代码片段。这里的问题是,当绘制并显示外部和内部矩形时,当我将内部矩形添加到地图时bodyWithBodies
,它完全控制碰撞检测,从外部矩形外壳中删除所有接触控制。当我删除bodyWithBodies
它恢复正常并显示两个矩形,外部有碰撞检测(不允许我通过),而内部没有任何东西......如此接近
// 1 Create large outer shell Map
CGRect mapWithRect = CGRectMake(map.frame.origin.x + offsetX, map.frame.origin.y + offsetY, map.frame.size.width * shrinkage, map.frame.size.height * shrinkage);
self.physicsWorld.gravity = CGVectorMake(0.0, 0.0);
self.physicsWorld.contactDelegate = self;
// 2 Create smaller inner boundary
CGRect innerRect = CGRectMake(100, 100, 300, 300);
SKPhysicsBody *body = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
body.categoryBitMask = wallCategory;
NSArray *bodyArray = [NSArray arrayWithObject:body];
// 3 Add bodies to main Map body
myWorld.physicsBody = [SKPhysicsBody bodyWithBodies:bodyArray];
myWorld.physicsBody.categoryBitMask = wallCategory;
if ( [[levelDict objectForKey:@"DebugBorder"] boolValue] == YES) {
// This will draw the boundaries for visual reference during testing
[self debugPath:mapWithRect];
[self debugPath:innerRect];
}
EDIT 2这种方法有效......只需添加一个与外部矩形具有相同属性的新节点:
SKPhysicsBody *innerRectBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:innerRect];
innerRectBody.collisionBitMask = playerCategory;
innerRectBody.categoryBitMask = wallCategory;
SKNode *innerBoundary = [SKNode node];
innerBoundary.physicsBody = innerRectBody;
[myWorld addChild: innerBoundary];
...但我非常想要一个不需要额外节点的更干净的解决方案..想法?