这是我的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。