0

この名前のトピックが少なくとも2つまたは3つあることはわかっていますが、これまでのところ、問題に対する適切な答えが見つかりませんでした。Plist(zwoptex(画像/アニメーションプログラム)によって作成された)を順番に編集したいその中のすべての数値を2で除算します。したがって、私のplistには、値として{{182、160}、{58,75}}、または{192、165}を持つ「spriteOffset」のようないくつかのキーがあります。これらはNSStringであり、数字を変更したいだけなので、「{」やスペースなどがあるかどうかを確認してから、数字をキャストする必要があります。問題は、どうすればよいかわからないということです。.....また、plistの管理に何かが欠けているようです。これらの文字列をすべてplistに表示するために、いくつかのNSLogを配置しましたが、何も表示されません...コードは次のとおりです。

-(void)DivideValues
{
   for(NSString * plistName in plistSubpathsByName)
{
    NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@.plist",plistName]];

    for(NSDictionary * sprite in [infoDict objectForKey:@"frames"])
    {
        for(NSString * string in [infoDict objectForKey:@"spriteColorRect"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteOffset"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteSize"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"spriteSourceSize"])
        {
            NSLog(@"%@",string);
        }
        for(NSString * string in [infoDict objectForKey:@"textureRect"])
        {
            NSLog(@"%@",string);
        }
    }

    }
}

ご回答ありがとうございます。あなたのキャリア/情熱に幸運を祈ります。

4

3 に答える 3

0

さて、私は成功したので、誰かがここに興味があるなら、コードは次のとおりです:

-(void)DivideValues
{
for(NSString * xflName in [xflSubpathsByName objectEnumerator]){

    NSMutableDictionary* infoDict = [NSMutableDictionary dictionaryWithContentsOfFile:[sourceFolder stringByAppendingPathComponent:xflName]];

    NSDictionary * dictionary = [infoDict objectForKey:@"frames"];
    NSMutableDictionary * mutabledictionary = [[dictionary mutableCopy] autorelease];

    for(NSString * pngFileName in dictionary) {

        NSDictionary * sprite = [dictionary objectForKey:pngFileName];

        NSLog(pngFileName);
        NSMutableDictionary * mutablesprite = [[sprite mutableCopy] autorelease];

        NSString * newstring = [self castSpriteRect:[sprite objectForKey:@"spriteColorRect"]];
        [mutablesprite setObject:newstring forKey:@"spriteColorRect"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteOffset"]];
        [mutablesprite setObject:newstring forKey:@"spriteOffset"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteSize"]];
        [mutablesprite setObject:newstring forKey:@"spriteSize"];

        newstring = [self castSprite:[sprite objectForKey:@"spriteSourceSize"]];
        [mutablesprite setObject:newstring forKey:@"spriteSourceSize"];

        newstring = [self castSpriteRect:[sprite objectForKey:@"textureRect"]];
        [mutablesprite setObject:newstring forKey:@"textureRect"];

        [mutabledictionary setObject:mutablesprite forKey:pngFileName];

    }

    [infoDict setObject:mutabledictionary forKey:@"frames"];
            [infoDict writeToFile:[sourceFolder stringByAppendingPathComponent:xflName] atomically:NO];
    }

if(!cancelling)
    ++digestStage;
else
    digestStage = End;
}

-(NSString *)castSprite:(id)obj{
CGPoint point = NSPointFromString((NSString *)obj);
int i = (int)point.x%2 == 0 ?(int)point.x/2:1+(int)point.x/2;
int j = (int)point.y%2 == 0 ?(int)point.y/2:1+(int)point.y/2;
NSString * res = [NSString stringWithFormat:@"{%d, %d}",i,j];
return res;
}

-(NSString *)castSpriteRect:(id)obj{
CGRect point = NSRectFromString((NSString *)obj);
int i = (int)point.origin.x%2 == 0 ?(int)point.origin.x/2:1+(int)point.origin.x/2;
int j = (int)point.origin.y%2 == 0 ?(int)point.origin.y/2:1+(int)point.origin.y/2;
int y = (int)point.size.width%2 == 0 ?(int)point.size.width/2:1+(int)point.size.width/2;
int x = (int)point.size.height%2 == 0 ?(int)point.size.height/2:1+(int)point.size.height/2;
NSString * res = [NSString stringWithFormat:@"{{%d, %d}, {%d, %d}}",i,j,y,x];
return res;
} 
于 2012-03-20T19:08:52.213 に答える
0

例で何もログに記録されない理由for..inは、おそらく内側のループが間違った辞書を検索しているためです。外側のループは辞書spriteを取得するので、内側のループはその辞書のキーを検索するべきではありませんか?

プロパティリストを読み込み、その中のいくつかの値を変更し、同じプロパティリストを書き戻す場合は、NSPropertyListSerializationクラスを確認すると便利な場合があります。これにより、可変配列/辞書の構造をすばやく取得できます。データをplistするので、値を変更したい場合でもそれらを反復処理してから、すべてをシリアル化してデータに戻すことができます。(使用dictionaryWithContentsOfFile:すると、変更可能な辞書を取得できますが、その中のすべてのコンテナーは不変になるためmutableCopy、反復中にコンテンツをあちこちでスウィズルする必要があります。)

現時点で詳細を書く時間はありませんが、NSPropertyListSerializationのドキュメントを調べても役に立たない場合は、後で回答を編集する可能性があります。

于 2012-03-17T22:38:50.013 に答える
0

まず、スプライトはおそらく詳細情報を含むdictであるため、に[infoDict objectForKey:@"spriteColorRect"]置き換える必要があります。存在しないキーが返されるため、 ログは表示されません。[sprite objectForKey:@"spriteColorRect"]
-objectForKey:nil

値を変更するには、文字列からCGPointまたはCGRectを作成し、それを変更して、最後に文字列に変換し直すことができます。(CGPointFromNSString() and NSStringFromCGPoint)

辞書の変更されたバージョンを保存するには、NSDictionaryのを使用します-writeToFile:atomically:

于 2012-03-17T22:51:58.887 に答える