首页 文章

如何在SpriteKit中使用物理主体为迷宫创建路径

提问于
浏览
1

我想为我的SpriteKit Game创建一个迷宫,但是我在设置正确的物理体时遇到了问题 . 看看这个例子:

example

蓝色:CGPath

绿色:迷宫(CGPath线宽= 10)

红色:我要创建的物理体

我试图用CGPath和SKShapeNode绘制迷宫,但是如何为迷宫的内边界设置物理体?

CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, 38, 266);
CGPathAddLineToPoint(path, NULL, 37, 23);
CGPathAddLineToPoint(path, NULL, 127, 22);
CGPathAddLineToPoint(path, NULL, 127, 184);
CGPathAddLineToPoint(path, NULL, 273, 185);
CGPathAddLineToPoint(path, NULL, 273, 98);
CGPathAddLineToPoint(path, NULL, 274, 184);
CGPathAddLineToPoint(path, NULL, 127, 184);
CGPathAddLineToPoint(path, NULL, 127, 23);
CGPathAddLineToPoint(path, NULL, 364, 23);
CGPathAddLineToPoint(path, NULL, 364, 266);
CGPathCloseSubpath(path);
SKShapeNode *labyrinth = [SKShapeNode shapeNodeWithPath:path];
labyrinth = [SKColor greenColor];
labyrinth.lineWidth = 10;
[self addChild:labyrinth];

.

labyrinth.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromPath:path];

不起作用 . 我需要一个选项来包含物理体的路径线宽 .

有任何建议或其他选择来实现这样的迷宫吗?

3 回答

  • 1

    你有没有考虑过修建迷宫?

    每个迷宫墙可以是矩形形状或精灵节点,然后您将使用bodyWithRectangleOfSize:为每个形状/精灵节点提供与其自身大小相同的物理主体 .

  • 0

    如果您不花费数小时翻译代码,只需使用SKShapeNode中的最终图像创建一个正文 .

    您的节点必须在视图中,因为您将使用名为textureFromNode的SKView方法:如下所示 .

    if(labyrinth.scene.view)
    {
        SKTexture *texture = [labyrinth.scene.view textureFromNode: labyrinth];
    
        labyrinth.physicsBody = [SKPhysicsBody bodyWithTexture:texture alphaThreshold:0.0 size:texture.size];
        labyrinth.physicsBody.dynamic = NO;
    }
    
  • 0

    谢谢@primaryartemis!根据您的建议,我创建了以下代码:

    for (int i=0; i< [points_array count]-1; i++) {
                  // first point
                  CGPoint p1 = CGPointMake(points_array[i].x, points_array[i].y);
                  // second point                  
                  CGPoint p2 = CGPointMake(points_array[i+1].x, points_array[i+1].y);
                  // midpoint
                  CGPoint p3 = CGPointMake(p1.x-p2.x, p1.y-p2.y);
    
                  float angle = atanf(p3.y/p3.x);
                  NSInteger length = sqrt(p3.x*p3.x + p3.y*p3.y);
    
                  SKSpriteNode *frameElement = [SKSpriteNode spriteNodeWithColor:[SKColor yellowColor] size:CGSizeMake(length+10, 10)];
                  frameElement.zRotation = angle;
                  frameElement.position = CGPointMake(p1.x-p3.x/2, p1.y-p3.y/2);
    
                  frameElement.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:frameElement.size];
                  [self addChild:frameElement];
            }
    

    有用 . 这是一个示例输出:(红色是物理体,蓝色是中点)

    enter image description here

相关问题