2012-07-25 29 views
0

我正在为iPhone的RPG类型的游戏。我想要做的是有一个库存,只允许你保存特定数量的特定类型的物品。我认为要做到这一点,我只是要扩展NSMutableArray并为其添加限制。我无法弄清楚这样做的最好方法。这里的想法,我有我的头......扩展NSMutableArray的行为就像一个Java阵列

Backpack.h

@interface Backpack : NSMutableArray { 
    Class * arrayClass; 
    NSMutableArray * array; 
    int limit; 
} 

-(id) initWithClass:(Class) type andLimit:(int) num; 

@end 

Backpack.m

@implementation Backpack 

    -(id)initWithClass:(Class) type andLimit:(int) num { 

    arrayClass = type; 
    limit = num; 
    array = [NSMutableArray new]; 
    return self; 

    } 

    -(void)insertObject:(id) object atIndex:(int) index { 

    if([object isKindOfClass:arrayClass] && index < limit) { 
     // Insert it 
    } else { 
     // Throw Exception 
    } 

    } 

@end 
+0

您不会持有指向'Class'的指针,因为它已经是一个指针了。 – 2012-07-26 00:35:58

回答

5

而不是延长的NSMutableArray,只需创建自己的类使用NSMutableArray的实例来保存项目。你的类可以有一个add方法或方法,这些方法或方法需要添加一些具有特定类类型(或实现特定接口)的项目。至于限制物品的数量,在你的addItem方法中,首先检查被保存物品的数量。如果它大于您的限制,则不要允许添加项目。最后,你的类可以暴露一个size方法(例如getSize()),它告诉你在NSMutableArray的实例中内部已经有多少项目,这样你可以防止当你的背包“满”时添加项目表单。

一般来说,组合(即从其他类的成员实例组成你自己的类)比扩展类和使用继承来完成相同的行为要好。例如,如果扩展NSMutableArray,那么除了你的方法之外,所得到的类将公开该类的所有公共方法,这会导致从代码重用和文档立场出发的混乱类。

最后,你的问题真的不是关于Java,所以也许不应该用Java标签来标记。

+0

谢谢你的建议。我按照你的建议去掉了标签。 – CaldwellYSR 2012-07-26 01:49:20

1

要强加的限制并不真的需要类扩展,如果有任何使它易于使用且难以编写的问题。

只要保持简单,并将一些库存相关的方法添加到类似自定义Player类的东西中,那么您可能会想要在制作RPG的过程中设计某处。

@interface Player : NSObject { 
    NSMutableArray * inventory; 
    NSUInteger inventoryLimit; 
    //other centralized player data like stats, spells, or whatever 
} 
-(BOOL)addItemToInventory:(YourItemClass *)item; 
@end 

@implementation 
//... other impl stuff, like init 
-(BOOL)addItemToInventory:(YourItemClass *)item { 
    if([inventory count] < inventoryLimit) { 
    [inventory addObject:item]; 
    return TRUE; 
    } 
    else { 
    return FALSE; 
    } 
} 
@end 

请注意,我对“玩家”类的建议不是一个难的要求。有多种方法可以构建游戏的类和数据...

+0

这确实看起来像是一个更明智的方法来解决我的目标。给出的其他答案更适合制作类似java的数组的问题。我已经有一个球员类,我正在做一个背包课,但它似乎更有意义,只是使用背包阵列。感谢您的建议 – CaldwellYSR 2012-07-26 01:53:33