我是Spritekit的新手,我正在创建一个游戏,我想让我的sprite节点在用户触摸它们时旋转。因为游戏有很多关卡,而且精灵节点都会以不同的角度旋转,所以我想把各个浮点值放在一个plist文件中,让节点在用户触摸时读取它们的角度旋转。
我知道,理想情况下,为了有效地旋转sprites,您应该编写如下代码
sprite.zrotation = M_PI/.5
但是我想从plist中调用浮点值,但我不确定如何在plist中正确地存储旋转浮点值,以及如何让spritenode从plist中调用它们的z旋转。有人能帮帮我吗?
发布于 2015-07-18 20:35:15
假设随机化这些角度不是您想要的,并且您需要将每个级别的所有角度存储在某个位置,您可以这样做:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// saving a float
[defaults setFloat:0.123 forKey:@"someKey"];
[defaults synchronize];
要检索值,可以这样做:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// getting an Float
float myFloat = [defaults floatForKey:@"someKey"];
请记住,用户可以很容易地更改NSUserDefaults类使用的.plist文件。如果这让您感到困扰(可能不会),您可以硬编码NSArray或NSDictionary中的所有值。
编辑:
下面是你如何使用read/write values using .plist file。当我发布答案时,我没有注意到您实际上询问的是.plist文件,而不是NSUserDefaults (它也使用.plist文件)。所以,很抱歉,是我的错:)
下面是硬编码值的示例:
#import "GameScene.h"
@implementation GameScene{
NSMutableArray *levels;
}
-(void)didMoveToView:(SKView *)view {
/* Setup your scene here */
levels = [NSMutableArray array];
NSDictionary *level_1 =
[NSDictionary dictionaryWithObjects:@[@(0.1f),@(0.01f),@(0.001f)] forKeys:@[@"key_1",@"key_2",@"key_3"]];
NSDictionary *level_2 =
[NSDictionary dictionaryWithObjects:@[@(0.2f),@(0.02f),@(0.002f)] forKeys:@[@"key_1",@"key_2",@"key_3"]];
NSDictionary *level_3 =
[NSDictionary dictionaryWithObjects:@[@(0.3f),@(0.03f),@(0.003f)] forKeys:@[@"key_1",@"key_2",@"key_3"]];
[levels insertObject:level_1 atIndex:0];
[levels insertObject:level_2 atIndex:1];
[levels insertObject:level_3 atIndex:2];
NSString *key = @"key_1";
NSUInteger level = 1;
if([self isAngleAvailableForKey:key andLevel:level]){
CGFloat angle = [self getAngleForKey:key andLevel:level];
NSLog(@"Angle for level %lu and key %@ is %f",(unsigned long)level,key,angle);
}else{
NSLog(@"Error, wrong level(%lu) or key(%@)",(unsigned long)level, key);
}
}
//Check to see if there is such a level or key
-(BOOL)isAngleAvailableForKey:(NSString*)key andLevel:(NSUInteger)level{
if(level < 1 || level > [levels count]){return NO;}
if([[levels objectAtIndex:level-1] valueForKey:key] == nil){return NO;}
return YES;
}
//If already is good, get the angle for given level and key
-(CGFloat)getAngleForKey:(NSString*)key andLevel:(NSUInteger)level{
return [[[levels objectAtIndex:level-1] valueForKey:key] floatValue];
}
如果数据量不大,我个人的偏好是硬编码值。但这取决于你的决定。
如果有大量数据,那么.plist文件可能是更好的选择,因为它可以节省您不必要的内存消耗。
如果数据量非常小,那么我猜你甚至可以使用NSUserDefaults,但这应该是最后一个选项,因为NSUserDefaults是用来存储首选项或类似的东西的。
希望这能有所帮助。
https://stackoverflow.com/questions/31495159
复制