2012-02-25 3 views
0

У меня есть этот код, который я использовал раньше, но теперь, когда я подклассифицировал свой спрайт, мне нужно его адаптировать. Вот оно:Как мне изменить этот код, чтобы сделать его подходящим для подкласса?

-(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] 
]; 
} 

Что она делает то, что он выбирает случайную точку на экране, то он делает это так, что спрайт движется с постоянной скоростью между двумя точками, то она перемещает спрайт, и повторно вызывает метод.

EDIT: Причина, по которой я хочу это сделать, состоит в том, что я буду экземплярами этого спрайта в слое спрайта, и все они будут делать этот метод.

Должен ли я включать это в мой подкласс CCSprite, но больше похожий на слой моего спрайта?

+1

Почему вы считаете это? Без этой информации на ваш вопрос нельзя ответить, это как просить незнакомца «Почему я повернул налево на последнем перекрестке?». Чувак, я даже не знаю, куда вы идете. ;) – LearnCocos2D

+0

@ LearnCocos2D Хорошая мысль, я устал в то время. Я добавлю это сейчас. – akuritsu

ответ

0

Как правило, подкласс 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 
+0

Спасибо, но будет ли способ изменить его так, чтобы он все еще работал в подклассе, который содержит все мои вражеские спрайты? Например, мой подкласс называется enemy.h, и там есть все разные типы вражеских спрайтов и их методы корреляции? – akuritsu

0

Чтобы удовлетворить все ваши очевидные требования, я хотел бы сделать это расширение для самого CCSprite класса, что потребует:

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

и использовать ту же реализацию в ответе @ Jon, соответствующим образом изменяя строку @implementation .... Таким образом, вы можете использовать этот метод для всех спрайтов, независимо от того, где они происходят в вашем приложении Тион.

Я надеюсь, что это поможет ...