【问题标题】:Incrementing NSNumber递增 NSNumber
【发布时间】:2012-04-22 11:14:46
【问题描述】:

所以,在我将动画精灵帧加载到我正在制作的游戏的缓存中后,我会计算每个动画有多少帧。我这样做是因为在游戏配置中每个动画的持续时间都有一个值,当我创建 CCAnimation 时,延迟属性是 AnimationDuration/FramesAmount。

要计算每个动画的帧数,我打开 animations.plist 并迭代获取每个键的条目,删除文件名,并将每个帧(作为键)存储在 NSMutableDictionary 中,数量为我的 NSNumber通过迭代更新。问题是我不喜欢如何获取 NSNumber intValue,执行 +1,然后分配另一个 NSNumber 并重新设置键的值。有没有更好的方法来做到这一点?谢谢大家! (比如 .. 在 php OR JS 中将是 ditonary[frame]++)

代码如下:

NSString *finalPath = [path stringByAppendingPathComponent:@"animations.plist"];
NSDictionary *plistData = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain];

NSMutableDictionary *conf = [NSMutableDictionary dictionary];
NSDictionary *frames = [plistData valueForKey:@"frames"];

NSNumber *amount;
for( int i=0; i < [frames count]; i++ ) {
    NSString *frame = [[frames allKeys] objectAtIndex:i];

    NSRange range = [frame rangeOfString:@"/" options:NSBackwardsSearch];
    frame = [frame substringToIndex:range.location];

    if( [conf objectForKey:frame] == nil )
        amount = [[NSNumber alloc] initWithInt:1];
    else
        amount = [[NSNumber alloc] initWithInt:[[conf objectForKey:frame] intValue]+1];//amount++...

    [conf setObject:amount forKey:frame];
}

【问题讨论】:

    标签: objective-c animation cocos2d-iphone nsnumber


    【解决方案1】:

    您可以创建一个 MyNumber 对象,而不是一个 NSNumber,其中包含一个 int/long 和一个属性来访问数字,而不必在每次更改它时都执行整个 alloc 操作。甚至可以有一个 addTo 方法。

    【讨论】:

    • 酷,谢谢,这有点丑陋,但我认为它比我现在拥有的要好。
    • @Spiegel -- 你认为 NSNumber 是什么,“在幕后”?它只是另一个对象类(好吧,实际上是一个类族)——发明它并不是因为它在某种程度上是一种超高效的实现,而是因为许多不同的其他接口需要一个表示数字的对象,最好有一个标准的与发明自己的每一种新用途相比。
    【解决方案2】:

    不幸的是,对于 NSNumbers,除了获取它的整数值、递增它并将其放回您的 NSNumber 之外,别无他法。

    但为什么一开始就使用 NSNumber 呢?为什么不从 int 开始,发挥你的魔力并将该 int 放入你的 NSNumber 实例中?

    向你展示我的意思:

    int myCounterAsInt = 0;
    for (...loopcondition..)
    {
        myCounterAsInt++;
    }
    
    NSNumber *myCounterAsNSNumber = [NSNumber numberWithInt:myCounterAsInt];
    

    【讨论】:

    • 对不起,我没听懂你的建议,你会怎么做?
    • 我认为这行不通。我正在用每个动画的每一帧迭代一个字典,我不知道一个动画的帧是否总是组合在一起,所以,我需要在每次迭代中检查帧,然后将其分配给正确的对象在 conf 字典中
    • 啊,我明白了。那么这确实是不可能的。 NSDictionary 只能保存对象,不能保存原语。您总是必须将基元包装在对象中才能将它们插入您的集合中......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2018-12-02
    • 2013-01-27
    相关资源
    最近更新 更多