http://www.cnblogs.com/justinwong/archive/2011/06/09/2076793.html
自我感觉对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的图片的中心,但却不是这样,正确结果是下图这样:
废了半天劲,其实就是一个概念上被混淆了,那就是我理所应当的认为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; }