【问题标题】:Fill SKShapeNode with pattern image用图案图像填充 SKShapeNode
【发布时间】:2023-05-16 17:26:01
【问题描述】:

我正在尝试用图像/图案填充 SKShapeNode,但仍然没有成功。

你能帮我解决这个问题或给我一个替代方案吗? 我想创建一个填充有图案图像的可碰撞自定义形状(来自任何 SpriteKit 类型)。

我尝试了以下方法:

UIBezierPath *path = [[UIBezierPath alloc] init];
    [path addArcWithCenter:CGPointMake(0.0, 0.0) radius:50.0 startAngle:0.0 endAngle:(M_PI*2.0) clockwise:YES];
SKShapeNode *shape = [[SKShapeNode alloc] init];
UIImage *patternImg = [UIImage imageNamed:@"pattern"];
shape.path = path.CGPath;
shape.fillColor = [[SKColor alloc] initWithCGColor:[[UIColor alloc] initWithPatternImage:patternImg].CGColor];

还有:

shape.fillColor = [[SKColor alloc] initWithPatternImage:[[UIImage alloc] initWithCGImage:[UIImage imageNamed:@"Basketball"].CGImage]];

这行得通(但这不是我想要的):

shape.fillColor =  [SKColor redColor];

谢谢!

【问题讨论】:

  • 我不认为 SKShapeNode 支持纯色以外的任何东西。顺便说一句,UIColor 与 SKColor 相同。
  • @LearnCocos2D 感谢你我已经看到 Cocos2d 解决了我想做的大部分事情,比如关卡设计、物理/碰撞。今天我将进一步研究它(以及 cocos2d-x)。谢谢!

标签: ios7 sprite-kit skshapenode


【解决方案1】:

从 iOS 8.0 开始,SKShapeNode 中有 fillTexture 属性。

【讨论】:

    【解决方案2】:

    我在我的游戏中遇到了示例问题,最后我的解决方案是添加一个 SKSpriteNode 作为 SKShapeNode 的子节点,它运行良好。

    SKSpriteNode* node = [[SKSpriteNode alloc] initWithImageNamed:@"bombIcon.png"];
    node.name = @"bomb";
    node.size = CGSizeMake(10, 10);
    [self.bombNode addChild:node];
    

    self.bombNode 是一个 SKShapeNode。

    希望对你有帮助

    【讨论】:

      【解决方案3】:

      您可以尝试使用SKCropNode 来实现这一目标。但是,我在这里看到了几个问题,SKShapeNode 不能充当maskNodeSKCropNode,但我自己没有测试过。在这种情况下,您可能必须使用SKSpriteNode 而不是SKShapeNode

      【讨论】:

        【解决方案4】:

        好吧,使用现代 Swift(您现在正在使用 Swift,对吗?),您可以尝试:

        var marbleNode: SKSpriteNode!
        

        然后,在你的 init 方法中:

        marbleNode = SKSpriteNode(imageNamed: "SmallerSwirl");
        
        marbleNode.physicsBody = SKPhysicsBody(circleOfRadius: 35.0)
        
        marbleNode.physicsBody?.dynamic = true
        marbleNode.physicsBody?.affectedByGravity = true
        print(marbleNode.physicsBody)
        
        marbleNode.position = CGPointMake(centerPoint.position.x + 10.0,   centerPoint.position.y + 10.0)
        
        self.addChild(marbleNode)
        

        好的,这给了我们一个可以使用的圆形精灵节点。 Sprite 节点对物理有响应,因为您单独设置了它的物理主体。到现在为止还挺好。现在我们需要解决被遮盖的部分,即引入 SmallerSwirl .png 图像。

        当您设置项目时,它包含一个 Assets.xcassets(发音为“x c assets”)条目。单击它,然后单击第一列中间/底部的“+”号,按单词过滤器。从出现的菜单中,选择“新图像集”。出现一个标有“图像”的新条目。点击单词“Image”将其更改为“SmallerSwirl”。

        在 SmallerSwirl 条目旁边,您会看到标有 1x、2x 和 3x 的空白。它们适用于不同的屏幕分辨率。首先将您喜欢的 .png 图像拖到 1x 正方形中。该图像可以命名为您希望命名的任何名称。它不必命名为 SmallerSwirl,尽管可以。如果您愿意,可以将其他图像拖到 2x 和 3x 插槽中。

        运行,您应该会看到您喜欢的图像以精灵的形式体现,在屏幕上跳舞。

        【讨论】:

        • 大部分与问题无关。