从plist旋转sprite节点

时间:2015-07-18 20:13:07

标签: objective-c rotation sprite-kit plist nsnumber

我是Spritekit的新手,我正在创建一个游戏,我希望我的精灵节点在用户触摸时旋转。因为游戏有很多级别,精灵节点都会以不同的角度旋转,所以我想将各个浮点值放在一个plist文件中,让节点从用户触摸它们时读取它们的角度旋转。

我知道,理想情况下,要有效地旋转精灵,你会写这样的东西

sprite.zrotation = M_PI/.5

但是我想从plist中调用float值,我不确定如何在plist中正确存储旋转浮点值以及如何让spritenodes从plist中调用它们的zrotation。有人可以帮帮我吗?

1 个答案:

答案 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用于存储首选项或类似的东西。

希望这有帮助。