JustinWong

做纯粹的快乐的游戏

导航

cocos2d的anchor小总结和小纠结

Posted on 2011-06-09 20:13  JustinWong  阅读(1808)  评论(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的图片的中心,但却不是这样,正确结果是下图这样:

废了半天劲,其实就是一个概念上被混淆了,那就是我理所应当的认为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;
}