Проблема с дымовым пузырем в cocos2d

У меня проблема. Когда действие smokeMoveBy запускается, на экране появляется небольшой пузырь дыма в другом месте, чем путь движения дыма. Это происходит только тогда, когда я использую ScaleX и ScaleY. Метод smokeLoop вызывается в планировщике каждую 1 секунду. Здесь self — это слой.

Любые решения?

Мой код следует,

CGPoint dummyPosition=ccp(600, 600);
ParticleSystem *smoke = [ParticleSmoke node];
ccColor4F startColor;
startColor.r = 1.f;
startColor.g = 1.f;
startColor.b = 1.f;
startColor.a = 1.f;
[smoke setStartColor:startColor];
ccColor4F endColor;
endColor.r = 0.8f;
endColor.g = 0.8f;
endColor.b = 0.8f;
endColor.a = 1.0f;
[smoke setEndColor:endColor];
[smoke setLife:0.1f];
[smoke setScaleX:0.1f];
[smoke setScaleY:0.2f];
[smoke setStartSize:30.f];
[self addChild:smoke z:2];
[smoke setPosition:dummyPosition];

-(void)smokeLoop{
id smokeMoveBy = [MoveBy actionWithDuration:durTime position:ccp(0.f, (-1.f*480))]];
id smokeSeq=[Sequence actions:[Place actionWithPosition:smokeInitPosition], smokeMoveBy, nil];
[smoke runAction:smokeSeq];
}

person Jay    schedule 18.12.2009    source источник


Ответы (1)


Не уверен, что это ваша проблема, но у меня была проблема с Cocos2D, масштабированием и перемещением, которую я решил, переместив anchorPoint.

Что я хотел сделать, так это увеличить (масштабировать) и переместить слой. Масштабирование будет работать нормально, если позиция будет {0,0}, а точка преобразования будет {0,5,0,5}. Но тогда, если бы я переместил его, он все равно трансформировался бы примерно в {0,5,0,5}, что к тому времени могло бы выйти за пределы экрана, поэтому масштабирование было бы очень странным.

Решение состояло в том, чтобы перемещать точку преобразования в середину экрана каждый раз, когда я перемещал положение слоя. Мне было нелегко исправить эту формулу, так как при перемещении точки преобразования у операции масштабирования будет новая центральная точка.

Формула, которую я использовал, была следующей:

layer = self.foreground;
ccpAdd(
    ccpDivide(
        ccpNeg(layer.position),
        (CGPoint){layer.contentSize.width, layer.contentSize.height}),
    (CGPoint){0.5f,0.5f}
);

По сути: разделите обратное положение слоев (то есть {300 200} станет {-300, -200}) на размер слоя {480 320}, а затем добавьте {0,5,0,5} (так как я хочу, чтобы моя привязка быть всегда по центру + смещение)

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

Удачи, Надеюсь это поможет!

person nash    schedule 19.12.2009