首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SpriteKit:在场景之间传递数据

SpriteKit:在场景之间传递数据
EN

Stack Overflow用户
提问于 2013-09-19 02:48:09
回答 6查看 9.9K关注 0票数 8

我在SpriteKit中试图在场景之间传递“SpriteKit”中的数据被困住了。例如,我想把分数从A级传给B级。

也许这个解决方案是归档的,但是我想实现一些更简单的东西,比如我们在视图控制器中使用的方式。

这方面的任何线索都将不胜感激。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-09-20 19:28:06

如果要将分数传递到许多不同的场景,则可能需要将其存储在NSUserDefaults或一些可访问的存储机制中。但是,如果您希望在SpriteKit对象之间传递数据,那么每个SKNode (包括SKScene)都有一个名为userData的字典属性,您可以使用它来满足您的需要。下面是一个例子,说明如何在场景之间传递分数:

代码语言:javascript
复制
 - (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];

 }
票数 15
EN

Stack Overflow用户

发布于 2013-09-20 08:37:18

将分数存储在视图控制器实例中,或者将SKView子类存储在那里。这将在视图的生存期内保留任何对象。

如果您需要在应用程序重新启动之间持久化分数,请使用NSUserDefaults

实际上,Kobold Kit在没有自定义子类的情况下使这样的事情变得很简单。视图有(任何节点都可以拥有)一个KKModel对象,它是整数类型(通过KKMutableNumber)和任意对象的键/值存储。

因此,通过将高分对象绑定到视图,您可以从任何节点中持久化并访问它:

代码语言:javascript
复制
[self.kkView.model setObject:highscores forKey:@"highscores"];

kkView属性是编写(KKView*)self.view的缩写。

对于那些生命周期与场景或视图相关联的对象,绝对没有必要使用或受益于使用单例。它们要么属于场景,要么属于景物。

票数 6
EN

Stack Overflow用户

发布于 2014-03-12 15:23:37

这种方法对我有效,我认为是正确的。到目前为止,这是在我发现的场景之间传递数据的最简单和最快的方法。

1.关于userData:的基本信息

1.1。按住苹果“命令键”,按下"userData“字符串上的鼠标左键(在Xcode中)。"self.userData ;")您将得到以下信息:

代码语言:javascript
复制
// 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

代码语言:javascript
复制
//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中使用它访问对象值。检查一下你是否打错了。

代码语言:javascript
复制
[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

代码语言:javascript
复制
//secondScene.m ( ex. in my :"@implementation WBMGameEndsScene")

下面这些代码行检查值是否正确添加:

代码语言:javascript
复制
-(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"]);
}

控制台输出是:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18885490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档