Как мне изменить этот код, чтобы сделать его подходящим для подкласса?

У меня есть этот код, который я использовал раньше, но теперь, когда я создал подкласс своего спрайта, мне нужно его адаптировать. Вот:

-(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, а скорее как слой моего спрайта?


person akuritsu    schedule 25.02.2012    source источник
comment
Почему вы думаете об этом? Без этой информации на ваш вопрос нельзя ответить, это все равно, что спросить незнакомца Почему я повернул налево на последнем перекрестке?. Чувак, я даже не знаю, куда ты идешь. ;)   -  person LearnCocos2D    schedule 26.02.2012
comment
@LearnCocos2D Хорошо, я тогда устал. Я добавлю это сейчас.   -  person akuritsu    schedule 26.02.2012


Ответы (2)


Как правило, в объектно-ориентированном подходе подкласс 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
person Jon Boydell    schedule 27.02.2012
comment
Спасибо, но можно ли как-нибудь изменить его, чтобы он по-прежнему работал в подклассе, содержащем все мои вражеские спрайты? Например, мой подкласс называется вражеский.h, и в нем есть все различные типы вражеских спрайтов и соответствующие им методы? - person akuritsu; 04.03.2012

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

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

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

Надеюсь, это поможет....

person miwalsh    schedule 06.07.2014