我在SpriteKit中试图在场景之间传递“SpriteKit”中的数据被困住了。例如,我想把分数从A级传给B级。
也许这个解决方案是归档的,但是我想实现一些更简单的东西,比如我们在视图控制器中使用的方式。
这方面的任何线索都将不胜感激。
发布于 2013-09-20 19:28:06
如果要将分数传递到许多不同的场景,则可能需要将其存储在NSUserDefaults或一些可访问的存储机制中。但是,如果您希望在SpriteKit对象之间传递数据,那么每个SKNode (包括SKScene)都有一个名为userData的字典属性,您可以使用它来满足您的需要。下面是一个例子,说明如何在场景之间传递分数:
- (void)changeScene
{
SKView *spriteView = (SKView *) self.view;
SKScene *currentScene = [spriteView scene];
SKScene *newScene = [MySceneClass scene];
[newScene.userData setObject:[currentScene.userData objectForKey:@"score"] forKey:@"score"];
[spriteView presentScene:newScene];
}发布于 2013-09-20 08:37:18
将分数存储在视图控制器实例中,或者将SKView子类存储在那里。这将在视图的生存期内保留任何对象。
如果您需要在应用程序重新启动之间持久化分数,请使用NSUserDefaults。
实际上,Kobold Kit在没有自定义子类的情况下使这样的事情变得很简单。视图有(任何节点都可以拥有)一个KKModel对象,它是整数类型(通过KKMutableNumber)和任意对象的键/值存储。
因此,通过将高分对象绑定到视图,您可以从任何节点中持久化并访问它:
[self.kkView.model setObject:highscores forKey:@"highscores"];kkView属性是编写(KKView*)self.view的缩写。
对于那些生命周期与场景或视图相关联的对象,绝对没有必要使用或受益于使用单例。它们要么属于场景,要么属于景物。
发布于 2014-03-12 15:23:37
这种方法对我有效,我认为是正确的。到目前为止,这是在我发现的场景之间传递数据的最简单和最快的方法。
1.关于userData:的基本信息
1.1。按住苹果“命令键”,按下"userData“字符串上的鼠标左键(在Xcode中)。"self.userData ;")您将得到以下信息:
// An optional dictionary that can be used to hold user data pretaining to the node. Defaults to nil.
@property (SK_NONATOMIC_IOSONLY, retain) NSMutableDictionary *userData;1.2。访问apple docs:userData
1.3userData是一个NSMutableDictionary,它基本上是一个特殊的数组。在该值旁边,它包含一个键,该键绑定到该值。使用这个键,您可以找到值。这也可能有帮助:苹果文档:NSMuttableDictionary
2.解决方案:
2.1。firstScene
//somewhere in firstScene.m
//how the tranisiton from firstScene to secondScene is going to look and how long it is goint to take
SKTransition *reveal = [SKTransition moveInWithDirection:SKTransitionDirectionDown duration:0.5];
SKView * skView = (SKView *)self.view;
SKScene *secondScene = [WBMGameEndsScene sceneWithSize:skView.bounds.size];
//You need to initialize the NSMD since it is by default nil.
secondScene.userData = [NSMutableDictionary dictionary];这里我是指userData的secondScene,通过添加一个对象,这是我的分数。为了考试的目的,它只是6。我将添加我的分数实例变量。您可以添加任何您想要的东西,因为它接受"id“类型的对象。关键很重要。之后,您将在第二个Scene.m中使用它访问对象值。检查一下你是否打错了。
[secondScene .userData setObject:@"6" forKey:@"score"];
//Testing
NSLog(@"Is it finally working -- %@",[secondScene .userData objectForKey:@"score"]);
//The secondScene will scale to fit the whole SKView
secondScene.scaleMode = SKSceneScaleModeAspectFill;
//present the secondScene
[self.scene.view presentScene: secondScene transition:reveal];*WBMGameEndsScene是我的secondScene。我用Xcode用"File - New File .“创建了它。作为:SKScene。它将包含稍后显示的userData。
2.2。secondScene
//secondScene.m ( ex. in my :"@implementation WBMGameEndsScene")下面这些代码行检查值是否正确添加:
-(void)didMoveToView:(SKView *)view
{
NSLog(@"-- -(void)willMoveFromView:(SKView *)view --");
NSLog(@"Working score is : %@",[self.userData valueForKey:@"score"]);
NSLog(@"Working score is : %@",[self.userData objectForKey:@"score"]);
}控制台输出是:
2014-03-12 15:29:06.804 AppTest[4841:60b] -(id)initWithSize:(CGSize)size
2014-03-12 15:29:06.806 AppTest[4841:60b] scoreLabel
2014-03-12 15:29:06.812 AppTest[4841:60b] successMessage
2014-03-12 15:29:06.815 AppTest[4841:60b] Is it finally working -- 6
2014-03-12 15:29:06.815 AppTest[4841:60b] -- -(void)willMoveFromView:(SKView *)view --
2014-03-12 15:29:06.816 AppTest[4841:60b] Working score is : 6
2014-03-12 15:29:06.816 AppTest[4841:60b] Working score is : 6如果我出了什么问题,请纠正我:)。规格: iOS 7.0,Xcode版本5.1 (5B130a),OSX10.9.2
https://stackoverflow.com/questions/18885490
复制相似问题