クラスにccColor3Bプロパティがあり、NSCodingを使用して永続化したいと思います。どうすればこれを達成できますか?NSCoderにはそれを可能にするメソッドがないようです。
質問する
386 次
3 に答える
1
@Justinは正しいです、バイトを介してエンコードする必要がありますが、彼は物事を考えすぎていると思います:
// encode
ccColor3B input;
[coder encodeBytes:&input length:sizeof(input) forKey:@"color"];
// decode
ccColor3B output;
const uint8_t *bytes = [coder decodeBytesForKey:@"color" returnedLength:NULL];
memcpy(&output, bytes, sizeof(output));
于 2012-05-29T14:17:32.830 に答える
0
次のように、バイト単位でエンコードします。
const NSUInteger BytesInCCColor = 3U;
const uint8_t bytes[BytesInCCColor] = { color.r, color.g, color.b };
[coder encodeBytes:bytes length:BytesInCCColor forKey:@"color"];
デコード:
NSUInteger outLength = 0;
const uint8_t* const bytes =
[coder decodeBytesForKey:@"color" returnedLength:&outLength];
if (NULL == bytes || BytesInCCColor != outLength) {
…uh-oh…
}
else {
color.r = bytes[0];
color.g = bytes[1];
color.b = bytes[2];
}
于 2012-05-29T14:05:45.013 に答える
0
アドホックタイプの安全でない変換を使用するよりも、NSCoderにカテゴリを実装して、その処理方法を理解することをお勧めします。
@implementation NSCoder (cocos2d)
- (void)encodeUInt32:(uint32_t)i forKey:(NSString *)key {
union { int32_t s; uint32_t u; } v;
v.u = i;
[self encodeInt32:v.s forKey:key];
}
- (uint32_t)decodeUInt32ForKey:(NSString *)key {
union { int32_t s; uint32_t u; } v;
v.s = [self decodeInt32ForKey:key];
return v.u;
}
- (void)encodeColor3B:(ccColor3B)color forKey:(NSString *)key {
/* Storing 0xFF as the low 8 bits allows us to read/write ccColor3B
and ccColor4B interchangeably. */
uint32_t rgba = (color.r << 24) | (color.g << 16) | (color.b << 8) | 0xFF;
[self encodeUInt32:rgba forKey:key];
}
- (ccColor3B)decodeColor3BForKey:(NSString *)key {
ccColor3B c;
uint32_t rgba = [self decodeUInt32ForKey:key];
c.r = rgba >> 24;
c.g = rgba >> 16;
c.b = rgba >> 8;
return c;
}
@end
次に、次のことを実行できます。
self.color = [decoder decodeColor3BForKey:@"color"];
と
[encoder encodeColor3B:self.color forKey:@"color"];
于 2012-07-04T13:03:20.070 に答える