Вращающийся, масштабируемый слой, унаследованный от Cocos2d, с двумя спрайтами, как дети - PullRequest
0 голосов
/ 20 декабря 2011

Прямо к делу, у меня есть класс, который в основном унаследован от CCLayer и имеет 2 спрайта как детей.

some_layer.h

@interface some_layer : CCLayer {
    CCSprite *back;
    CCSprite *front;
}

some_layer.mm

// on "init" you need to initialize your instance
-(id) init
{
    if( (self=[super init])) {
        back = [CCSprite spriteWithFile:@"back.png"];
        front = [CCSprite spriteWithFile:@"front.png"];
        [front setOpacity:0];
        [self addChild:back];
        [self addChild:front];
        //this is after modification
        back.positionInPixels = CGPointMake(winSizeInPixels.width/2,winSizeInPixels.height/2);
        front.positionInPixels = CGPointMake(winSizeInPixels.width/2,winSizeInPixels.height/2);

    }
    return self;

}
//after the edit
    -(void) setPositionInPixels:(CGPoint)positionInPixels {
        [super setPositionInPixels:CGPointMake(positionInPixels.x -(winSizeInPixels.width/2), positionInPixels.y -(winSizeInPixels.height/2))];
    }

    -(void) setPosition:(CGPoint)position {
        [super setPosition:CGPointMake(position.x -(winSize.width/2), position.y -(winSize.height/2))];
    }

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

Теперь в некоторой частиродительский слой пытается это сделать

    float x = winSizeInPixels.width/2;
    float y = winSizeInPixels.height/2;
    [self setPositionInPixels:CGPointMake(x, y)];
    mylayer = [[some_layer alloc] init];
    [mylayer setPositionInPixels:CGPointMake(-offset, -offset)];
    [self addChild:mylayer];
    [mylayer runAction:[CCEaseInOut actionWithAction:[CCRotateTo actionWithDuration:speed*20 angle:angle] rate:4]];

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

Спрайты вращаются вокруг некоторой случайной точки (возможно, вокруг родителяих родитель, который является self в последнем коде)

Кстати, я не касаюсь спрайтов задних и передних позиций, я имею дело только с этим "some_layer", я попытался установить ихпозиции в (0,0)

Единственное время, когда положение "some_layer" является правильным, это когда угол поворота равен 0, а масштаб равен 1,0, если что-то неясно, пожалуйста, дайте мне знать, большое спасибоЯ могу предоставить некоторые снимки экрана

Редактировать: я изменил код выше, он работает как обходной путь, но я думаю, что это не правильный способ сделать это !!!Пожалуйста, проверьте комментарии, я не знаю, что странно происходит !!

Спасибо!

Редактировать 2: Ответ найден

Ответ сам себе

Добавьте это к методу init some_layer.mm

[self setContentSize:CGSizeMake(0, 0)];

Спасибо всем, кто пытался мне помочь:)

Анализ кода - лучшее решение!

Кстати, я удалил переопределенные методы для обоих setPos и ​​удалил код, который изменяет позиции спрайтов, теперь это так

// on "init" you need to initialize your instance
-(id) init
{
    if( (self=[super init])) {
        back = [CCSprite spriteWithFile:@"back.png"];
        front = [CCSprite spriteWithFile:@"front.png"];
        [front setOpacity:0];
        [self addChild:back];
        [self addChild:front];
        [self setContentSize:CGSizeMake(0, 0)];
    }
    return self;

}

1 Ответ

1 голос
/ 20 декабря 2011

Вы устанавливаете некоторую anchorPoint для слоя или спрайта, который вы используете. если да, пожалуйста, проверьте, чтобы точка привязки была установлена ​​в центре:

someSprite.anchorPoint = CCP (0.5,0.5);

Для более подробной информации: http://www.qcmat.com/understanding-anchorpoint-in-cocos2d/

...