在SpriteKit中,是否可以以编程方式向场景添加元素,因此当打开.sks时,它们会显示?

时间:2018-03-11 23:16:02

标签: sprite-kit scene skscene

在SpriteKit中,是否可以以编程方式将元素添加到场景中,因此当打开.sks时,它们会显示?目前,我有GameScene(扩展SKScene)类,它使用UnarchiveFromFile方法模式从.sks文件中打开场景编辑器中已添加的元素。此方法如下所示:

    @implementation SKScene (Unarchive)

+ (instancetype)unarchiveFromFile:(NSString *)file {
    /* Retrieve scene file path from the application bundle */
    NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];
    /* Unarchive the file to an SKScene object */
    NSData *data = [NSData dataWithContentsOfFile:nodePath
                                          options:NSDataReadingMappedIfSafe
                                            error:nil];
    NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [arch setClass:self forClassName:@"SKScene"];
    SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
    [arch finishDecoding];

    return scene;
}

@end

我怎么能从unarchiveFromFile做相反的事情,即。从代码中获取并将精灵添加到.sks文件中。在那之后,unarchiveFromFile将被触发,其余的就像现在一样。有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

您不希望在代码中更新.sks文件,即使您已设法弄清楚如何执行此操作。我想你想要做的是在didMoveTo(view:)

中向场景中添加元素

https://developer.apple.com/documentation/spritekit/skscene/1519607-didmove

  

didMove(to :)在视图显示场景后立即调用。

     

讨论此方法旨在在子类中重写。您   可以使用此方法实现场景的任何自定义行为   当它即将被一个视图呈现时。例如,您可以使用0   这个方法来创建场景的内容。

以下是添加边框的示例:

override func didMove(to view: SKView) {
/* Setup your scene here */

//        drawBorder()
let border = drawSKShapeNode([CGPoint.zero,
    CGPoint(x: 0, y: frame.height),
    CGPoint(x: frame.width, y: frame.height),
    CGPoint(x: frame.width, y: 0)],
                             withWidth: 10,
                             inColour: SKColor.yellow,
                             called: "border")
border.zPosition = 200
addChild(border)
}

// Helper function to draw an SkShapeNode

    func drawSKShapeNode(_ withPoints: [CGPoint], withWidth width: CGFloat, inColour colour: SKColor, called name: String) -> SKShapeNode {

        var points = withPoints
        let shape = SKShapeNode(points: &points, count: points.count)
        shape.lineWidth = width
        shape.strokeColor = colour
        shape.name = name

        return shape 
}

答案 1 :(得分:0)

我解决了我的实际问题! - 只需在场景中放入图表并将其放入代码中即可。这是一个NavigationGraph,工作正常。然而,编程添加并没有起作用。