cocos2d的anchor小总结和小纠结

cocos2d的anchor小总结和小纠结

Posted on 2011-06-09 20:13  JustinWong 阅读(281)  评论(0)  编辑  收藏 

自我感觉对anchor的理解没问题了,但今天被另外一个问题纠结进去了,这里先做小总结,后面会说到那个问题。

假设有一个CCSprite A,则:

1. anchor是一个CGPOINT,取值在(0.0f, 0,0f) 到 (1.0f, 1.0f)之间。

2. (0.0f, 0.0f)是这个CCSprite矩形区域的左下角,(1.0f, 1.0f)是右上角。

3. anchor决定了这个sprite的position指的是图片中哪个部分的位置,比如anchor在(0.0f, 0.0f),position在(100, 100),则这个sprite的左下角将被放在(100, 100)。

4. anchor决定对这个sprite进行旋转的原点。

5. anchor决定了对这个sprite进行缩放的原点。

问题来了,假设有一个CCSprite B,且A是B的child。

那么当a.position为(0,0) ,且A和B的anchor都是(0.5f, 0.5f)的时候,A会在B的什么位置呢?

我当时脑子里想的是A的图片的中心在B的图片的中心,但却不是这样,正确结果是下图这样:

cocos2d的anchor小总结和小纠结_第1张图片

废了半天劲,其实就是一个概念上被混淆了,那就是我理所应当的认为B的anchor会是A的position的原点(基点),而实际A的position的原点不受B的anchor的影响,一律都在左下角。

这也就是为什么,我们要在Layer中心创建一个sprite时,要计算winSize,并把position设置为winSize宽高为一半了。

今天使用了大量CCLayerColor为容器嵌套做UI,发现了另外一些问题,就是CCLayer的anchor与CCSprite的区别:

1. CCLayer的anchor不会影响这个layer的position是自己的哪个角放在父容器上,也就是说,无论CCLayer的anchor为何值,position的值都是这个CCLayer的左下角的位置。

2. 除了1以外,CCLayer的anchor的功能和CCSprite相同。

下面是尝试用的代码,通过修改几个参数值可以很快的了解anchor:

-(id) init
{
    // always call "super" init
    // Apple recommends to re-assign "self" with the "super" return value
    if( (self=[super init])) {
        
        CCSprite *lvSprite = [CCSprite spriteWithFile:@"Icon-72.png"];
        lvSprite.anchorPoint = ccp(0.0f, 0.0f);
//        lvSprite.position = ccp(100.0f, 100.0f);
        lvSprite.scale = 0.5f;
        [self addChild:lvSprite];
        CCLOG(@"Layer.anchor.x = %f, Layer.anchor.y = %f", self.anchorPoint.x, self.anchorPoint.y);
        CCLOG(@"Layer.position.x = %f, Layer.position.y = %f", self.position.x, self.position.y);
        CCLOG(@"Sprite.anchor.x = %f, Sprite.anchor.y = %f", lvSprite.anchorPoint.x, lvSprite.anchorPoint.y);
        CCLOG(@"Sprite.position.x = %f, Sprite.position.y = %f", lvSprite.position.x, lvSprite.position.y);
        
//        CCLayerColor *lvLayerColor = [CCLayerColor layerWithColor:ccc4(255, 0, 0, 255)];
//        [lvLayerColor changeWidth:100 height:100];
//        lvLayerColor.anchorPoint = ccp(1.0f,1.0f);
//        [self addChild:lvLayerColor];
        
        
    }
    return self;
}

你可能感兴趣的:(apple,UI,layer)