Проблема с пузырем дыма в cocos2d - PullRequest
0 голосов
/ 18 декабря 2009

У меня проблема. Когда действие smokeMoveBy начинается, маленький дымовой пузырь обнаруживается на экране в другом месте, чем путь движения дыма. Это происходит только тогда, когда я использую scaleX и scaleY. Метод smokeLoop вызывается каждые 1 секунду в планировщике. Здесь «я» - это слой.

Какие-нибудь решения?

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

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

1 Ответ

0 голосов
/ 19 декабря 2009

Не уверен, что это ваша проблема, но у меня была проблема с 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} (как я хочу мой якорь всегда будет в центре + смещение)

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

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

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