0

我有“Character”类,它是 CCSprite 的子类。“Character”只有一个属性,int “extraTag”。我正在使用方法 getChildByTag:,它返回一个转换为 CCNode 的 CCSprite。我想做的是让它“投射”为“角色”。我知道将任何类转换为它的子类是不好的做法(而且无论如何都不会起作用),所以我想知道是否有可能以某种方式将 CCSprite 更改为“字符”。Obj-C 中不存在函数重载,所以这是不可能的。

任何帮助表示赞赏;谢谢你。

PS:如果你想知道为什么我将“CCSprite”子类化为一个属性,那是因为我使用“extraTag”来存储“CCSprite”动画时的情况。当我调用 runAction: 时,它会将“extraTag”设置为当前操作名称。我不想弄乱 CCNode 中现有的“标签”属性,因为其他原因它是由 Cocos2D 在内部处理的。如果这引起了危险,请告诉我;我想尽可能避免不良做法!(:

4

2 回答 2

2

您可以将精灵包装在 Character 类中:

@interface Character {
    CCSprite *sprite;
    int actionTag;
}

- (void)runAction:(CCAction *)action;

@end

并在实现文件中:

- (void)runAction:(CCAction *)action{
    actionTag = <action-name>;
    [sprite runAction:action];
}
于 2013-07-08T10:14:26.063 回答
1

如果我正确理解您的目标,您希望将新属性添加到类的现有实例中 - 因此您定义子类并尝试以错误方式“转换”的想法。正如已经指出的那样,您不能这样做。

将现有实例包装在另一个具有所需新属性的类中会将您的两件事 - 属性和实例 - 绑定在一起,但作为包装类的实例,我认为这不是您所追求的。您可以使用包装器来实现您的目标 - 您定义一个具有属性和对现有类的引用的子类,并将方法转发到您捕获的实例(即您构建一个代理),但它有点涉及这样做。

那么,Objective-C 提供了什么来帮助您实现目标呢?

Objective-C 支持类别,允许您向现有类添加其他方法,从而为现有类的所有实例添加其他方法。

但是你不想添加一个方法,你想要一个 an int。但是,您可以定义一个int 属性- 默认情况下,一个属性只是两个方法和一些存储(在您的情况下为int)。类别为您提供方法,因此您只需要存储...

输入关联对象。Objective-C 支持将任意数量的对象与另一个对象关联,每个关联的对象都由一个唯一的键标识 - 实际上,Objective-C 为您提供了关联对象的字典。一个对象给你存储...

所以在大纲中你可以

a)声明一个具有int属性的类 - 称它为MyAddedProperties

b) 在 上定义一个类别CCSprite,例如MyAddedPropertiesCategory,也提供您的int属性。手动实现此属性的 setter 和 getter 以查找和关联实例MyAddedProperties并设置/获取其int属性。

您已将属性添加到现有类!

(b) 需要MyAddedProperties在第一次调用类别 setter/getter 时创建和关联实例,并为关联对象定义唯一键。您通过查找您的密钥来执行前者,如果没有关联的对象,请创建一个。唯一键是任何类型的值void *- 即地址。获得唯一键的标准方法是static在您的类别中声明一个变量(任何类型,只使用其地址)并将其地址用作键。

您可以在此处阅读有关类别相关对象的信息

这不是很多代码。如果您在编写解决方案时遇到问题,请提出一个新问题,给出您的代码以及出了什么问题。

高温高压

于 2013-07-08T20:25:04.860 回答