cocos2d iphone-将CCColor保存为NSUser默认值



这是我的3个CCSlider的代码,它们可以很好地更改蝙蝠颜色,我保存了滑块,这些滑块工作正常,但我需要保存_SettingBat.color以在应用程序中加载,这就是我将颜色保存到NSUserDefaults时遇到的问题。

CCColor *batColor;
-(void)redSlider
{
    batColor = [CCColor colorWithRed:_redSlider.sliderValue green:_greenSlider.sliderValue blue:_blueSlider.sliderValue];
    _settingsBat.color = batColor;
}
-(void)greenSlider
{
    batColor = [CCColor colorWithRed:_redSlider.sliderValue green:_greenSlider.sliderValue blue:_blueSlider.sliderValue];
    _settingsBat.color = batColor;
}
-(void)blueSlider
{
    batColor = [CCColor colorWithRed:_redSlider.sliderValue green:_greenSlider.sliderValue blue:_blueSlider.sliderValue];
    _settingsBat.color = batColor;
}
-(void)save
{
    NSLog(@"The Color is, %@",_settingsBat.color);
    [[NSUserDefaults standardUserDefaults] setFloat:_redSlider.sliderValue forKey:@"redSlider"];
    [[NSUserDefaults standardUserDefaults] setFloat:_greenSlider.sliderValue forKey:@"greenSlider"];
    [[NSUserDefaults standardUserDefaults] setFloat:_blueSlider.sliderValue forKey:@"blueSlider"];
    [[NSUserDefaults standardUserDefaults]synchronize];
    _savedLabel.visible = TRUE;
    NSLog(@"My Key is, %@",[[NSUserDefaults standardUserDefaults] stringForKey:@"batColor"]);
}

这适用于cocos2D V3

获取UIColor实例:

UIColor *spriteUIColor = [_spriteColor.color UIColor];

存档:

NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:spriteUIColor];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"mySavedColor"];

恢复:

NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"mySavedColor"];
UIColor *restoredUIColor = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

我通常不同意将归档对象作为保存简单值的手段。除了效率不高之外,你还违反了数据与实现的分离(在这里可能不是什么大问题,但…),当类实现发生变化时,你可能会遇到问题,等等。

我也要避免单独保存通道,因为它们实际上是一个值。我个人会将颜色保存为数字RGB值,然后使用类似于以下宏的东西:

#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]`

(取自SO的回答)

以在加载时根据存储的RGB值创建UIColor

阅读本SO Q/A,了解如何将位打包/解包到32位数字中。传统上,您使用第一个字节作为A通道,第二个字节作为R,第三个字节为G,最后一个字节为B。在您的情况下,只要您对它们进行相同的解压缩,如何打包并不重要,但我发布的宏需要ARGB。

如果需要的话,我可以用一个如何将颜色存储为单个32位数字的例子来更新我的答案;以及如何从该数字重建CCD_ 2。

最新更新