Посмотрите перечисление 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;