Как бы я изменил этот код, чтобы сделать его подходящим для подкласса? - PullRequest
0 голосов
/ 25 февраля 2012

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

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

Ответы [ 2 ]

0 голосов
/ 06 июля 2014

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

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

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

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

0 голосов
/ 27 февраля 2012

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