我有这个以前用过的代码,但是现在它已经将我的精灵子类化了,我需要调整它。这是:
-(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子类中加入它,但更像是我的精灵层吗?
答案 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行....这样,您可以将此方法用于所有精灵,无论他们在哪里发生在您的申请中。
我希望这会有所帮助......