所以我正在设计一款游戏。在我的MenuScene
课程中,我有以下内容:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
SKTransition *transition = [SKTransition fadeWithColor:[UIColor colorWithRed:147.0/255.0 green:213.0/255.0 blue:216.0/255.0 alpha:1.0] duration:2.0f];
MyScene *gameScene = [MyScene sceneWithSize:self.size];
[self.view presentScene:gameScene transition:transition];
}
哪些过渡到游戏场景。我需要将一些数据传递给游戏场景。在游戏场景中,这是MyScene
的一个实例,我有
@interface MyScene()
@property (nonatomic) SKSpriteNode *heli;
@property (nonatomic) int health;
@property (nonatomic) float currentDY;
@property (nonatomic) float gameSpeed;
@end
我希望能够在进入新场景时根据来自旧场景的用户输入设置这些属性。在我的研究中,我得出的结论是,我要么使用 initWithCoder 或其他一些自定义方法来转换到场景。我是否需要在界面中添加新方法,然后在实现中实现它?如何更改我的游戏场景以接受这些新数据?我是否需要使用新方法替换initWithSize
,让我们说它是initWithSize:andFuel:
?
有人可以在实现和界面中提供一个简单的例子来说明如何做到这一点?
答案 0 :(得分:1)
我想指出我已经解决了我自己的问题,但我会赞扬上面的回答者,因为他提出了另一个解决方案。然而,我的解决方案对我来说更有意义。
我所做的只是:
在我的游戏场景中,我创建了一种新方法initWithSize: fuel:
,并以if (self = [super initWithSize:size]) {
的方式调用initWithSize
。 然后,在我的菜单类中,我替换了
MyScene *gameScene = [MyScene sceneWithSize:self.size];
使用MyScene *gameScene = [MyScene alloc];
然后gameScene = [gameScene initWithSize:self.frame.size fuel:1];
到目前为止我还没有遇到过任何问题 - 如果我在这里做错了什么,有人可以告诉我吗?这似乎允许我通过创建自定义init方法将信息传递到我的下一个场景。
答案 1 :(得分:0)
我个人发现NSUserDefaults是最简单的解决方案。
要使用您的示例,您可以将健康,currentDY和游戏速度存储在字典中,如下所示:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSDictionary *settingsDict = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:health], @"health",
[NSNumber numberWithFloat: currentDY], @"currentDY",
[NSNumber numberWithFloat: gameSpeed], @"gameSpeed",
nil];
[defaults setObject: settingsDict forKey:@"settingsDict"];
[defaults synchronize];
请记住,您只能将对象存储在字典中,而不能存储像int,float等原语...这就是为什么必须将它们转换为NSNumber。
要在init方法中取消它们,请执行以下操作:
NSDictionary *settingsDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"settingsDict"];
int health = [[settingsDict objectForKey:@"health"] intValue];
float currentDY = [[settingsDict objectForKey:@"currentDY"] floatValue];
float gameSpeed = [[settingsDict objectForKey:@"gameSpeed"] floatValue];
我从未尝试将SKSpriteNode存储在字典中,然后将其与NSUserDefaults一起存储。如果它不起作用,则必须将所有精灵的属性(例如位置,纹理名称,物理体规格等)存储到字典中。然后,您可以在需要时根据存储的值简单地创建一个新的精灵。