Справка Cocos2D: Как повернуть дочерний спрайт с родителем, где дочерний спрайт только перемещается, а не вращается? - PullRequest
2 голосов
/ 22 февраля 2012

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

Вот код:

CGSize winSize = [CCDirector sharedDirector].winSize;

windmill = [CCSprite spriteWithFile:@"Chorki.png"];
windmill.position = CGPointMake(winSize.width*0.02f, winSize.height*0.56f);
windmill.scale = 0.55f;
[self addChild:windmill z:0];
//Add windmill sprite on screen

CCRotateBy *rot = [CCRepeatForever actionWithAction:[CCRotateBy actionWithDuration:5 angle: 360]];
    [windmill runAction:rot];
//The above code to rotate windmill, the next code is to add child sprite of bucket

CCSprite *bucket1 =  [CCSprite spriteWithFile:@"BucketBug.png"];
bucket1.position = ccp(235, 490.2f);
[windmill addChild:bucket1 z:-1]; 

РЕДАКТИРОВАТЬ 1:

Извините, я забыл показать код для поворота спрайта. Теперь его добавили.

1 Ответ

1 голос
/ 22 февраля 2012

Посмотрите перечисление ccHonorParentTransform:

/**
 Whether or not an CCSprite will rotate, scale or translate with it's parent.
 Useful in health bars, when you want that the health bar translates with it's parent but you don't
 want it to rotate with its parent.
 @since v0.99.0
 */
typedef enum {
    //! Translate with it's parent
    CC_HONOR_PARENT_TRANSFORM_TRANSLATE =  1 << 0,
    //! Rotate with it's parent
    CC_HONOR_PARENT_TRANSFORM_ROTATE    =  1 << 1,
    //! Scale with it's parent
    CC_HONOR_PARENT_TRANSFORM_SCALE     =  1 << 2,
    //! Skew with it's parent
    CC_HONOR_PARENT_TRANSFORM_SKEW      =  1 << 3,

    //! All possible transformation enabled. Default value.
    CC_HONOR_PARENT_TRANSFORM_ALL       =  CC_HONOR_PARENT_TRANSFORM_TRANSLATE | CC_HONOR_PARENT_TRANSFORM_ROTATE | CC_HONOR_PARENT_TRANSFORM_SCALE | CC_HONOR_PARENT_TRANSFORM_SKEW,

} ccHonorParentTransform;

Это устанавливается через следующее свойство CCNode:

/** whether or not to transform according to its parent transfomrations.
 Useful for health bars. eg: Don't rotate the health bar, even if the parent rotates.
 IMPORTANT: Only valid if it is rendered using an CCSpriteBatchNode.
 @since v0.99.0
 */
@property (nonatomic,readwrite) ccHonorParentTransform honorParentTransform;

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

// In a scheduled update function of the parent, see CCNode header for schedule functions
bucket.rotation = -self.rotation;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...