我是Spritekit的新手,我正在创建一个游戏,我希望我的精灵节点在用户触摸时旋转。因为游戏有很多级别,精灵节点都会以不同的角度旋转,所以我想将各个浮点值放在一个plist文件中,让节点从用户触摸它们时读取它们的角度旋转。
我知道,理想情况下,要有效地旋转精灵,你会写这样的东西
sprite.zrotation = M_PI/.5
但是我想从plist中调用float值,我不确定如何在plist中正确存储旋转浮点值以及如何让spritenodes从plist中调用它们的zrotation。有人可以帮帮我吗?
答案 0 :(得分:1)
假设随机化这些角度并不是你想要的,你需要将每个级别的所有角度存储在某个地方,你可以这样做:
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用于存储首选项或类似的东西。
希望这有帮助。