0

クラスにccColor3Bプロパティがあり、NSCodingを使用して永続化したいと思います。どうすればこれを達成できますか?NSCoderにはそれを可能にするメソッドがないようです。

4

3 に答える 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 に答える