Cocos2d - как заставить отдельные частицы следовать за слоем, а не за излучателем? - PullRequest
3 голосов
/ 02 сентября 2011

У меня есть CCSprite и CCParticleSystemQuad, которые оба являются потомками CCLayer. В моем методе обновления я установил позицию эмиттера в положение спрайта, чтобы он отслеживал спрайт вокруг. Скопление дыма выпадает из нижней части спрайта, как и следовало ожидать, и даже если вы перемещаете спрайт вокруг, дым кажется частью фонового слоя.

Проблема возникнет, если я сопоставлю их вращения. Например, если мой спрайт качается взад-вперед, клубы дыма раскачиваются по дуге и кажутся прикрепленными к спрайту.

Как сделать так, чтобы клубы дыма продолжались вдоль родительского слоя по прямой линии и не вращались вместе со спрайтом? Они не переводятся со спрайтом, когда я его перемещаю, так почему они вращаются вместе с ним?

РЕДАКТИРОВАТЬ: добавление кода ...

- (id)init
{
    if (!(self = [super init])) return nil;

    self.isTouchEnabled = YES;

    CGSize screenSize = [[CCDirector sharedDirector] winSize];

    sprite = [CCSprite spriteWithFile:@"Icon.png"]; // declared in the header
    [sprite setPosition:ccp(screenSize.width/2, screenSize.height/2)];
    [self addChild:sprite];

    id repeatAction = [CCRepeatForever actionWithAction:
                        [CCSequence actions:
                         [CCRotateTo actionWithDuration:0.3f angle:-45.0f],
                         [CCRotateTo actionWithDuration:0.6f angle:45.0f],
                         [CCRotateTo actionWithDuration:0.3f angle:0.0f], 
                         nil]];
    [sprite runAction:repeatAction];

    emitter = [[CCParticleSystemQuad particleWithFile:@"jetpack_smoke.plist"] retain]; // declared in the header - the particle was made in Particle Designer
    [emitter setPosition:sprite.position];
    [emitter setPositionType:kCCPositionTypeFree]; // ...Free and ...Relative seem to behave the same.
    [emitter stopSystem];
    [self addChild:emitter];

    [self scheduleUpdate];

    return self;
}


- (void)update:(ccTime)dt
{
    [emitter setPosition:ccp(sprite.position.x, sprite.position.y-sprite.contentSize.height/2)];
    [emitter setRotation:[sprite rotation]]; // if you comment this out, it works as expected.
}

// there are touches methods to just move the sprite to where the touch is, and to start the emitter when touches began and to stop it when touches end.

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Я нашел ответ на другом сайте - www.raywenderlich.com

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

В любом случае я создал метод, который регулирует свойство угла эмиттера, и он работает нормально. Он берет ваше местоположение касания и масштабирует компонент y, чтобы быть углом.

- (void)updateAngle:(CGPoint)location
{
    float width = [[CCDirector sharedDirector] winSize].width;
    float angle = location.x / width * 360.0f;
    CCLOG(@"angle = %1.1f", angle);
    [smoke_emitter setAngle:angle]; // I added both smoke and fire!
    [fire_emitter setAngle:angle];
    //    [emitter setRotation:angle]; // this doesn't work
}
0 голосов
/ 03 сентября 2011

CCSprite anchorPoint равен {0.5f, 0.5f), в то время как излучатель спускается непосредственно из CCNode, у которого anchorPoint равен {0.0f, 0.0f}.Попробуйте установить anchorPoint эмиттера так, чтобы он соответствовал CCSprite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...