在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将被触发,其余的就像现在一样。有什么建议吗?感谢。
答案 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,工作正常。然而,编程添加并没有起作用。