所以我正在使用 cocos2d 框架开发一款 iPad 游戏。
我的游戏需要在“关卡”开始时生成不同的建筑物。用户可以选择他们想要使用的建筑物。
这里的一个重要功能是不同的建筑物在按下时会执行不同的操作。
我有一个看起来像这样的父类:
BaseBuilding.h
@interface BaseBuilding : NSObject {
CGRect _hitBox;
NSString *_name;
CCSprite *_sprite;
int _identifier;
int _health;
int _coolDownDuration;
}
@property (atomic, retain) CCSprite *sprite;
@property (atomic, assign) int identifier;
@property (atomic, assign) int health;
- (void) onBuildingPressed;
- (id) initWithName:(NSString*)baseName;
- (id) initBuilding;
- (CGRect) hitBox;
- (void) sustainDamage;
所以我的大部分建筑都非常相似。每个建筑物都有自己的 initBuilding 方法,该方法会覆盖父级。initBuilding 方法调用该super initWithName
方法,该方法然后查找包含有关该建筑物的信息(精灵名称等)的 plist。
每个建筑物也有自己的 onBuildingPressed 方法,该方法也覆盖了父方法。这是非常重要的功能。
我遇到问题的部分:
我想根据玩家选择的内容生成建筑物。我目前正在做的是这样的:
BaseBuilding *building;
switch (choice) {
case 1:
building = [BuildingX alloc];
[building initBuilding];
break;
case 2:
building = [BuildingY alloc];
[building initBuilding];
break;
case 3:
building = [BuildingZ alloc];
[building initBuilding];
break;
}
return building;
由于 BuildingX、BuildingY、BuildingZ 都是 BaseBuilding 的子类,因此 initBuilding 确实调用了正确的方法。
稍后我可以打电话[rightBuilding onBuildingPressed];
,它按预期工作。
BuildingX 有一个其他建筑物没有的 removeAmmo 方法,所以我必须这样做才能调用它:[(BuildingX*)centerBuilding removeAmmo]
.
这是正确的,还是更好的方法?