1

我需要创建一些将一起移动和旋转的复合精灵。由于可以更改 AtlasSpriteManager 的位置和旋转,因此我一直在尝试子类化,因此我可以创建一堆快捷方式,例如

CompoundSprite *cSprite = [CompoundSprite spriteManagerWithFile:@"sprites.png"];
[cSprite makeComplexSprite];

在内部,它看起来有点像这样

-(void)makeComplexSprite
{
        AtlasSprite *sp1 = [[AtlasSprite spriteWithRect:CGRectMake(0, 0, 64, 64)       
                             spriteManager:self] retain];
        AtlasSprite *sp2 = [[AtlasSprite spriteWithRect:CGRectMake(0, 0, 64, 64) 
                             spriteManager:self] retain];

    [self addChild:sp1];
    [self addChild:sp2];


    [sp1 setPosition:CGPointMake(0,0)];
    [sp2 setPosition:CGPointMake(64,0)];

}

但是,当我运行应用程序时,它会崩溃并出现以下异常

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -[AtlasSpriteManager makeComplexSprite]: unrecognized selector sent to 
instance 0x107e1c0

另外,如果我删除“MakeComplexSprite”中的所有代码并让它什么都不做,我也会遇到同样的问题。

看起来 AtlasSpriteManager 只是不喜欢被分类。是这样吗?如果是这样,为什么,我该如何解决它?

更新:

通过创建一个包含 atlasSpriteManager 的 NSObject,我找到了一种解决方法。它可以解决问题,但如果可能的话,我仍然希望将 AtlasSpriteManager 子类化。正如你所描述的那样,我似乎正在实施这个精确度。我正在创建一个这样的实例

CompoundSprite *cSprite = [CompoundSprite spriteManagerWithFile:@"file.png"]; 
[cSprite makeBox]; 

哪个...现在我想起来了,这意味着 cSprite 仍然是 AtlasSpriteManager ,因为这就是返回的内容。嗯。何我改变它?

4

2 回答 2

2

在 CompoundSprite 中实现自己的 spriteManagerWithFile: 或 CompoundSpriteWithFile:,这将返回 CompoundSprite 的一个实例。

编辑:

或者,您可以执行类似的操作

[[ComplexSprite alloc] makeComplexSprite];

但是你还需要做'spriteManagerWithFile:'部分。喜欢:

-(id)makeComplexSpriteWithFile:(NSString*)file
{
    if (! (self = [super initWithSpriteManager:..capacity:..]))
       return nil;

    // do your ComplexSprite specific initializing here..

    return self;
}
于 2009-11-16T18:23:29.107 回答
1

您看到的运行时错误表明您的程序已尝试将makeComplexSprite消息发送到对象,但尚未为该对象定义此类方法

您似乎将makeComplexSprite消息发送到一个实例AtlasSpriteManager而不是您的自定义CompoundSprite类的实例。您的示例代码看起来正确,那么您如何进行子类化?它应该看起来像这样:

复合精灵.h

@interface CompoundSprite : AtlasSpriteManager
{

}
- (void)makeComplexSprite;
@end

复合精灵.m

@interface CompoundSprite
- (void)makeComplexSprite
{
    ...
}
@end

如果您确实正确设置了子类,请确保您实际上是在调用makeComplexSprite一个实例,CompoundSprite而不是偶然调用其他对象。

还:

您的代码示例存在内存泄漏。您正在创建两个自动释放的精灵,然后保留它们(这意味着您的类拥有它们的所有权),并且永远不会释放它们。由于该AddChild:方法会自动保留对象,因此您可以简单地丢失retain调用,一切都会好起来的。

于 2009-11-16T14:25:40.270 回答