我如何修改此代码以使其适合子类?

时间:2012-02-25 00:50:32

标签: ios cocos2d-iphone subclass ccsprite

我有这个以前用过的代码,但是现在它已经将我的精灵子类化了,我需要调整它。这是:

-(void)moveRandom:(CCSprite*)mos
{
CGPoint randomPoint = ccp(arc4random()%480, arc4random()%320);
NSLog(@"%@", NSStringFromCGPoint(randomPoint));

CGPoint start = mos.position;
CGPoint end = randomPoint;
float distance = ccpDistance(start, end);
float duration = distance/450;
[mos runAction:
 [CCSequence actions:
  [CCMoveTo actionWithDuration:duration position: randomPoint],
  [CCCallBlock actionWithBlock:^{
     [self performSelector:@selector(moveRandom:) withObject:mos afterDelay:0.5];
 }],
  nil]
 ];
}

它做的是它在屏幕上选择一个随机点,然后它使得精灵在两点之间以恒定速度移动,然后它移动精灵,并重新调用该方法。

编辑: 我想这样做的原因是因为我会在我的精灵层中使用这个精灵的实例,并且他们都将使用这个方法。

我不应该在我的CCSprite子类中加入它,但更像是我的精灵层吗?

2 个答案:

答案 0 :(得分:0)

通常,以OO方式,CCSprite的子类将负责自己(封装)。因此,当您希望精灵移动您(或CCSprite的子类所暴露的对象)时,将调用其moveRandom方法。然后,如果没有它所附带的CCLayer知道任何有关它如何实现移动的话,它将自行移动所有内容。

CCSprite子类中的方法如下所示:

@interface AnotherSprite : CCSprite {}

-(void) moveRandom;

@implementation AnotherSprite

-(void)moveRandom
{
    CGPoint randomPoint = ccp(arc4random()%480, arc4random()%320);
    NSLog(@"%@", NSStringFromCGPoint(randomPoint));

    CGPoint start = self.position;
    CGPoint end = randomPoint;
    float distance = ccpDistance(start, end);
    float duration = distance/450;
    [self runAction:
        [CCSequence actions:
            [CCMoveTo actionWithDuration:duration position: randomPoint],
                [CCCallBlock actionWithBlock:^{
                    [self performSelector:@selector(moveRandom) withObject:nil afterDelay:0.5];
                }],
        nil]
    ];
}

@end

答案 1 :(得分:0)

为了满足您的所有明显要求,我会将其作为CCSprite类本身的扩展,这需要:

@interface CCSprite ( MyClassExtensions )
- ( void ) moveRandom;
@end

并在@ Jon的响应中使用相同的实现,适当地修改@implementation行....这样,您可以将此方法用于所有精灵,无论他们在哪里发生在您的申请中。

我希望这会有所帮助......